Blok China menggunakan ipset
Anda tidak dapat secara manual menambahkan beberapa ribu alamat IP ke iptables Anda, dan bahkan melakukannya secara otomatis adalah ide yang buruk karena dapat menyebabkan banyak beban CPU (atau jadi saya sudah baca). Sebaliknya kita dapat menggunakan ipset yang dirancang untuk hal semacam ini. ipset menangani daftar besar alamat ip; Anda cukup membuat daftar dan kemudian kirim iptables untuk menggunakan daftar itu dalam aturan.
Catatan; Saya berasumsi bahwa keseluruhan hal berikut dilakukan sebagai root. Sesuaikan sesuai jika sistem Anda didasarkan pada sudo.
apt-get install ipset
Selanjutnya, saya menulis skrip Bash kecil untuk melakukan semua pekerjaan, yang Anda harus bisa mengerti dari komentar di dalamnya. Buat file:
nano /etc/block-china.sh
Inilah yang ingin Anda rekatkan ke dalamnya:
# 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
Simpan file. Jadikan itu dapat dieksekusi:
chmod +x /etc/block-china.sh
Ini belum melakukan apa-apa, tetapi akan dalam semenit ketika kita menjalankan skrip. Pertama, kita perlu menambahkan aturan ke iptables yang merujuk ke daftar ipset baru yang ditentukan oleh skrip di atas:
nano /etc/iptables.firewall.rules
Tambahkan baris berikut:
-A INPUT -p tcp -m set --match-set china src -j DROP
Simpan file. Supaya jelas, iptables.firewall.rules lengkap saya sekarang terlihat seperti ini:
*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
Saat ini, tidak ada yang berubah dengan server karena tidak ada aturan baru yang diterapkan; untuk melakukannya, jalankan skrip block-china.sh:
/etc/block-china.sh
Ini akan menunjukkan beberapa output karena menarik daftar baru IP berbasis Cina dan kemudian, setelah beberapa detik, itu akan menyelesaikan dan menjatuhkan Anda kembali ke command prompt.
Untuk menguji apakah itu berhasil, jalankan:
iptables -L
Anda seharusnya sekarang melihat aturan baru yang memblokir Cina - hasilnya akan terlihat seperti ini:
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
Hampir selesai! Ini berfungsi, dan akan terus bekerja pada boot ulang. Tapi, alamat IP berubah dan daftar itu akan menjadi basi seiring waktu. Jika Anda ingin menarik dan menerapkan daftar IP yang diperbarui, Anda dapat menjalankan skrip block-china.sh lagi.
Kami juga dapat mengatur mesin untuk melakukan itu secara otomatis melalui tugas cron:
crontab -e
Tambahkan baris seperti ini:
* 5 * * * /etc/block-china.sh
Ini akan menjalankan /etc/block-china.sh pukul 5 pagi setiap hari. Pengguna yang menjalankan skrip harus root atau memiliki hak akses root.
sumber