Chặn Trung Quốc với iptables


10

Tôi vừa đăng nhập vào máy chủ GitLab và nhận thấy rằng nó đã có 18.974 lần đăng nhập thất bại kể từ lần cuối tôi kiểm tra máy chủ - gần 5 ngày. Tôi đã kiểm tra Ip và có vẻ như hầu hết tất cả đều đến từ Trung Quốc và đã cố gắng truy cập bằng SSH và Brute Force. Tôi bắt đầu chặn một số Ip nhưng sau đó tôi nhận ra rằng đó là một sự lãng phí rất lớn thời gian và một ý tưởng tốt hơn sẽ là chặn toàn bộ đất nước.

Có cách nào tôi có thể chặn TẤT CẢ Trung Quốc hoặc bất kỳ quốc gia nào khác bằng iptables không?

Tôi tìm thấy một số bài viết trên internet nhưng hầu hết tất cả chúng đều là các tập lệnh bash. Tôi là người mới sử dụng Linux nên tôi không thực sự hiểu tất cả các tập lệnh đó. Tôi thấy iptables thực sự thú vị và tôi muốn tìm hiểu thêm về nó.

Có ý kiến ​​gì không? Cảm ơn bạn!


4
Tôi đã giải quyết vấn đề tương tự theo một cách khác. Tôi đã làm cứng SSH trên máy chủ GitLab của khách hàng của mình bằng cách tắt mật khẩu và xác thực dựa trên thử thách và chỉ cho phép đăng nhập bằng khóa SSL. Có lẽ điều đó sẽ làm việc trong tình huống của bạn? Chặn phạm vi IP có thể làm giảm "tiếng ồn" nhưng nó sẽ không cung cấp cho bạn sự bảo vệ thực sự chống lại sự ép buộc.
Blendenzo

cho đến nay nó đã không làm việc. máy chủ gitlab vẫn hoạt động và tôi đã có 0 lần đột nhập. Các acc Ssh chỉ được thực hiện với các phím ssh và tôi đã vô hiệu hóa đăng nhập root. Chỉ là tôi muốn học iptables rất tệ ..
Caranfil Alegzandru

1
Bạn cũng có thể chuyển ssh của bạn sang một cổng không mặc định trong bộ định tuyến của bạn. Điều đó đã làm giảm các nỗ lực tấn công bot ssh của tôi từ hàng trăm mỗi ngày xuống không.
Đá cẩm thạch hữu cơ

Câu trả lời:


7

Sử dụng iptables để tự động xác định và sau đó chặn, kẻ xấu cho ssh có thể được thực hiện bằng cách sử dụng recentmô-đun. Phân đoạn sau phải đến sauESTABLISHED,RELATED dòng chung của bạn :

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Bây giờ, vấn đề gần đây (năm ngoái hoặc hai) với Trung Quốc là họ đã trở nên rất thông minh và rất thường xuyên khi họ bị chặn từ một địa chỉ IP, họ chỉ cần chuyển sang địa chỉ khác trên cùng một mạng con và tiếp tục. Điều này có nguy cơ hết các mục trong bảng gần đây mặc định (tôi nghĩ mặc định là 200). Tôi theo dõi điều này và sau đó tìm kiếm phân khúc IP thực tế và chặn vĩnh viễn toàn bộ phân khúc. Trong trường hợp của tôi, tôi không quan tâm đến thiệt hại tài sản thế chấp, tức là chặn người vô tội:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Ở đâu trong những điều trên:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Bạn có thể lấy toàn bộ danh sách địa chỉ IP cho Trung Quốc hoặc bất kỳ quốc gia nào ở định dạng iptables hoặc định dạng khác tại đây . Tuy nhiên, danh sách này dài đáng ngạc nhiên và khá năng động. Chính tôi, tôi quyết định không chặn toàn bộ danh sách.


Đây ^ Có thể là câu trả lời tốt nhất mà tôi từng nhận được. Nó có thể là một câu hỏi ngớ ngẩn, nhưng tôi đoán tất cả các quy tắc này đi vào một kịch bản bash, phải không? Tôi vẫn có một số vấn đề hiểu iptables nhưng tôi thấy nó hấp dẫn.
Caranfil Alegzandru

Có, tôi sử dụng một tập lệnh bash. Một số, và tôi cũng đã sử dụng, sử dụng phương pháp khôi phục iptables trực tiếp, nhanh hơn để tải. Tôi đã thay đổi vì tôi bao gồm một số lệnh không iptables trong cùng một tập lệnh.
Doug Smythies

12

Trung Quốc chặn sử dụng ipset

Bạn không thể tự thêm một vài nghìn địa chỉ IP vào iptables của mình và thậm chí tự động thực hiện nó là một ý tưởng tồi vì nó có thể gây ra rất nhiều tải CPU (hoặc vì vậy tôi đã đọc). Thay vào đó chúng ta có thể sử dụng ipset được thiết kế cho loại điều này. ipset xử lý danh sách lớn các địa chỉ IP; bạn chỉ cần tạo một danh sách và sau đó bảo iptables sử dụng danh sách đó trong một quy tắc.

Ghi chú; Tôi giả định rằng toàn bộ sau đây được thực hiện như root. Điều chỉnh cho phù hợp nếu hệ thống của bạn dựa trên sudo.

apt-get install ipset

Tiếp theo, tôi đã viết một kịch bản Bash nhỏ để thực hiện tất cả công việc, mà bạn sẽ có thể hiểu được từ các bình luận trong đó. Tạo một tệp:

nano /etc/block-china.sh

Đây là những gì bạn muốn dán vào nó:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Lưu các tập tin. Làm cho nó thực thi:

chmod +x /etc/block-china.sh

Điều này chưa làm được gì, nhưng sẽ trong một phút khi chúng tôi chạy tập lệnh. Trước tiên, chúng ta cần thêm một quy tắc vào iptables đề cập đến danh sách ipset mới này mà tập lệnh ở trên định nghĩa:

nano /etc/iptables.firewall.rules

Thêm dòng sau:

-A INPUT -p tcp -m set --match-set china src -j DROP

Lưu các tập tin. Để rõ ràng, iptables.firewall.rules đầy đủ của tôi bây giờ trông như thế này:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

Ngay bây giờ, không có gì thay đổi với máy chủ vì không có quy tắc mới nào được áp dụng; để làm như vậy, hãy chạy tập lệnh block-china.sh:

/etc/block-china.sh

Điều này sẽ hiển thị một số đầu ra khi nó kéo một danh sách mới các IP dựa trên tiếng Trung và sau đó, sau vài giây, nó sẽ hoàn thành và đưa bạn trở lại dấu nhắc lệnh.

Để kiểm tra nếu nó hoạt động, hãy chạy:

iptables -L

Bây giờ bạn sẽ thấy một quy tắc mới chặn Trung Quốc - đầu ra phải giống như thế này:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Sắp xong! Điều này hoạt động, và sẽ tiếp tục làm việc trên khởi động lại. Nhưng, địa chỉ IP thay đổi và danh sách đó sẽ tăng lên theo thời gian. Nếu bạn muốn kéo và áp dụng danh sách IP đã cập nhật, bạn có thể chạy lại tập lệnh block-china.sh.

Chúng tôi cũng có thể đặt máy thực hiện điều đó tự động thông qua công việc định kỳ:

crontab -e

Thêm một dòng như thế này:

* 5 * * * /etc/block-china.sh

Điều này sẽ chạy /etc/block-china.sh vào lúc 5 giờ sáng mỗi ngày. Người dùng đang chạy tập lệnh sẽ cần phải root hoặc có quyền root.

nguồn


Tại sao giới hạn nó chỉ giao thức tcp? Nó dường như làm việc mà không chỉ định giao thức. Đề xuất sử dụng các danh sách tổng hợp mới hơn, vì chúng ngắn hơn nhiều:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies

Không có gì ở đây phục hồi ipset sau khi khởi động lại.
Doug Smythies

4

Bạn có thể muốn cài đặt một cái gì đó như fail2ban để nó chặn các ips cố đăng nhập vào máy chủ của bạn và thất bại.


tôi cũng có thể sử dụng tường lửa csf và chặn mọi quốc gia tôi muốn từ các tệp cấu hình. Điều này là tôi thực sự muốn sử dụng iptables để tôi có thể tìm hiểu thêm về nó.
Caranfil Alegzandru

Bạn sẽ phải xem các quốc gia có khối địa chỉ IP nào được gán cho họ để tìm ra ai sẽ chặn. Không chắc chắn nếu nó sẽ siêu chính xác hay không. Bạn có thể sử dụng iptables -L để hiển thị các quy tắc iptables hiện tại, iptables-save để hiển thị các lệnh đã được chạy để tạo quy tắc đã nói, sau đó thiết kế quy tắc của riêng bạn và kiểm tra bằng máy kiểm tra để tìm hiểu về nó. Đó là cách tôi học nó.
Kyle H

0

Bạn có thể sử dụng mô-đun Geoip cho iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Khi hệ thống của chúng tôi được nâng cấp và phụ thuộc được cài đặt, giờ chúng tôi sẽ cài đặt xtables-addons trong máy của chúng tôi. Để làm như vậy, chúng tôi sẽ tải tarball mới nhất từ trang web dự án xtables-addons chính thức bằng wget. Sau khi tải xuống, chúng tôi sẽ giải nén tarball, sau đó biên dịch và cài đặt nó vào máy của chúng tôi.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Tiếp theo, chúng tôi sẽ chạy một mô-đun có tên xt_geoip đi kèm với tiện ích mở rộng xtables-addons tải xuống cơ sở dữ liệu GeoIP từ MaxMind và chuyển đổi nó thành dạng nhị phân được nhận dạng bởi xt_geoip. Sau khi được tải xuống, chúng tôi sẽ xây dựng nó và di chuyển chúng đến xt_geoipđường dẫn cần thiết tức là /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Đây là cú pháp cơ bản để sử dụng iptables với mô đun Geoip để chặn lưu lượng truy cập có nguồn gốc từ hoặc đến một quốc gia. Ở đây, chúng ta cần sử dụng mã ISO3166 gồm hai chữ cái thay cho quốc gia, ví dụ: Hoa Kỳ cho Hoa Kỳ, IE cho Ireland, IN cho Ấn Độ, CN cho Trung Quốc, v.v.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

0

Bạn sử dụng Danh sách tường lửa IP2Location để tạo iptables cho Trung Quốc.

Các tập tin có định dạng sau. Chạy nó trong trình bao và bạn sẽ chặn tất cả các địa chỉ IP Trung Quốc.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.