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