ipset을 사용하는 중국 블록
iptables에 수천 개의 IP 주소를 수동으로 추가 할 수 없으며 자동으로 수행하는 것조차 많은 CPU 부하를 일으킬 수 있기 때문에 나쁜 생각입니다. 대신 이런 종류의 것을 위해 설계된 ipset을 사용할 수 있습니다. ipset은 큰 IP 주소 목록을 처리합니다. 리스트를 생성 한 다음 규칙에서 해당리스트를 사용하도록 iptables에 지시합니다.
노트; 다음 전체가 루트로 수행되었다고 가정합니다. 시스템이 sudo를 기반으로하는 경우 적절하게 조정하십시오.
apt-get install ipset
다음으로 모든 작업을 수행하는 작은 Bash 스크립트를 작성했습니다.이 스크립트는 주석에서 이해할 수 있어야합니다. 파일을 작성하십시오.
nano /etc/block-china.sh
여기에 붙여 넣을 내용이 있습니다.
# 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
파일을 저장하십시오. 그것을 실행 가능하게 만드십시오 :
chmod +x /etc/block-china.sh
이 작업은 아직 수행되지 않았지만 스크립트를 실행하면 잠시 후에 완료됩니다. 먼저 위 스크립트에서 정의한이 새로운 ipset 목록을 참조하는 규칙을 iptables에 추가해야합니다.
nano /etc/iptables.firewall.rules
다음 줄을 추가하십시오.
-A INPUT -p tcp -m set --match-set china src -j DROP
파일을 저장하십시오. 분명히, 전체 iptables.firewall.rules는 다음과 같습니다.
*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
새로운 규칙이 적용되지 않았으므로 지금은 서버에서 변경된 것이 없습니다. 이렇게하려면 block-china.sh 스크립트를 실행하십시오.
/etc/block-china.sh
새로운 중국어 기반 IP 목록을 가져 오면 몇 가지 출력이 표시되고 몇 초 정도 지나면 완료되어 명령 프롬프트로 돌아갑니다.
작동하는지 테스트하려면 다음을 실행하십시오.
iptables -L
이제 중국을 차단하는 새로운 규칙이 보일 것입니다. 출력은 다음과 같아야합니다.
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
거의 끝났어! 이것은 작동하며 재부팅시 계속 작동합니다. 그러나 IP 주소가 변경되면 시간이 지남에 따라 목록이 오래됩니다. 업데이트 된 IP 목록을 가져와 적용하려면 block-china.sh 스크립트를 다시 실행하면됩니다.
크론 작업을 통해 자동으로 수행하도록 머신을 설정할 수도 있습니다.
crontab -e
다음과 같은 줄을 추가하십시오.
* 5 * * * /etc/block-china.sh
매일 오전 5시에 /etc/block-china.sh를 실행합니다. 스크립트를 실행하는 사용자는 루트이거나 루트 권한이 있어야합니다.
출처