Pengenalan
iptablesadalah alat yang kuat yang digunakan untuk mengkonfigurasi firewall bersepadu kernel Linux. Ia sudah terpasang pada sebilangan besar pengedaran Ubuntu, namun jika anda menggunakan versi Ubuntu yang disesuaikan atau berjalan di dalam bekas, kemungkinan besar anda harus memasangnya secara manual.
sudo apt-get install iptables iptables-persistent
Selepas pemasangan, jika anda ditanya sama ada menyimpan peraturan semasa anda, tidak menjadi masalah buat masa ini kerana anda akan membuang atau membuat peraturan baru nanti.
Petua
Anda boleh menggunakan netcatperintah (pada komputer yang berbeza daripada pelayan anda) untuk menguji port mana yang terbuka atau ditutup.
nc -z -w5 -v SERVER_IP PORT
	nc adalah arahan netcat. 
	-z hanya hantar sebungkus tanpa muatan. 
	-w5 tunggu sehingga 5 saat untuk mendapatkan tindak balas. 
	-v mod verbose. 
	- Ganti 
SERVER_IPdengan alamat pelayan anda. 
	- Ganti 
PORTdengan port yang ingin anda uji jika ia terbuka (contohnya 22). 
Di pelayan anda, anda boleh menggunakan netstatperintah untuk melihat port mana yang sedang mendengar sambungan.
sudo netstat -tulpn
Catatan: Walaupun netstatmudah untuk mencari port yang ingin anda bekerjasama, anda harus mengetahui aplikasi yang anda pasang pada pelayan anda dan port mana yang sedang mendengar, anda tidak perlu membenarkan setiap port yang anda temukan dalam netstatoutput .
Sintaks
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
	-A INPUTtambahkan peraturan ke INPUTrantai, rantai adalah sekumpulan peraturan, yang paling sering kita gunakan dalam panduan ini adalah INPUT, OUTPUTdan PREROUTING. 
	-p tcpditetapkan tcpsebagai protokol peraturan ini akan berlaku, Anda juga dapat menggunakan protokol lain seperti udp, icmpatau all. 
	-m tcpgunakan tcpmodul. iptablesmenyokong ciri tambahan melalui modul, beberapa di antaranya sudah diprapasang dengan yang iptableslain, seperti geoipmodul. 
	--dport 22perintah yang dimulakan dengan --menunjukkan pilihan tambahan untuk modul yang digunakan sebelumnya, dalam hal ini kita akan memberitahu tcpmodul tersebut hanya berlaku pada port 22. 
	-m geoipgunakan geoipmodul. Ini akan mengehadkan paket berdasarkan negara (lebih banyak maklumat pada langkah 5). 
	--src-cc PEsuruh geoipmodul untuk mengehadkan paket masuk kepada yang datang dari Peru. Untuk lebih banyak kod negara cari ISO 3166 country codesdi internet. 
	-j ACCEPTyang -jhujah memberitahu iptablesapa yang perlu dilakukan jika paket sepadan dengan kekangan yang dinyatakan dalam hujahan terdahulu. Dalam kes ini ACCEPT, paket-paket itu, pilihan lain adalah REJECT, DROPdan banyak lagi. Anda boleh mencari lebih banyak pilihan dengan mencari iptables jump targetsdi internet. 
1. Asas
Senaraikan semua peraturan.
sudo iptables -L
Senaraikan semua perintah yang digunakan untuk membuat peraturan yang sedang digunakan, berguna untuk mengedit atau menghapus peraturan.
sudo iptables -S
Untuk menghapus peraturan tertentu pilih peraturan dari sudo iptables -Sdan ganti -Adengan -D.
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
Senaraikan semua peraturan bernombor dalam INPUTrantai.
sudo iptables -L INPUT --line-numbers
Padamkan peraturan bernombor.
sudo iptables -D INPUT 2
Untuk membersihkan semua peraturan.
sudo iptables -F
Amaran: anda mungkin terputus hubungan jika dihubungkan dengan SSH .
Hanya jelas peraturan dalam OUTPUTrantai.
sudo iptables -F OUTPUT
2. Buat peraturan awal
Benarkan SSHpada eth0antara muka
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
	-i eth0 gunakan peraturan ke antara muka tertentu, untuk membenarkan dari antara muka mana-mana menghapus perintah ini. 
Untuk menghadkan paket masuk ke IP tertentu (iaitu 10.0.3.1/32).
sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
	-s 10.0.3.1/32 menentukan IP / subnet untuk membenarkan sambungan dari. 
Tetapkan peraturan rantai lalai.
Amaran: sebelum meneruskan pastikan anda telah menerapkan peraturan SSH yang betul jika bekerja di pelayan jauh .
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP 
sudo iptables -P OUTPUT ACCEPT 
	-P INPUT DROP menolak semua paket masuk (iaitu tidak ada yang dapat menyambung ke pelayan anda yang sedang berjalan seperti Apache, SQL, dll). 
	-P FORWARD DROP menolak semua paket yang diteruskan (iaitu ketika anda menggunakan sistem anda sebagai penghala). 
	-P OUTPUT ACCEPTmembenarkan semua paket keluar (iaitu ketika anda melakukan HTTPpermintaan). 
Benarkan semua lalu lintas pada antara muka loopback ( disyorkan ).
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
3. Buat peraturan berterusan
Simpan iptablesperaturan semasa .
sudo netfilter-persistent save
sudo netfilter-persistent reload
Sekiranya anda berjalan di dalam bekas, netfilter-persistentkemungkinan besar arahan tersebut tidak akan berfungsi, jadi anda perlu mengkonfigurasi semula iptables-persistentpakej.
sudo dpkg-reconfigure iptables-persistent
4. Benarkan sambungan keluar
Benarkan pertanyaan DNS.
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
Gunakan statemodul untuk membenarkan RELATEDdan ESTABLISHEDkeluar paket.
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Benarkan port yang diingini; dalam kes ini, HTTPpelabuhan.
sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
Lebih banyak port yang mungkin anda mahu gunakan.
	FTP: tcp di port 21 
	HTTPS: tcp di port 443 
	DHCP: udp di pelabuhan 67 
	NTP: udp di pelabuhan 123 
Catatan: Sekiranya anda mahu membenarkan apt-get, mungkin perlu untuk membenarkan FTPdanHTTPS .
Benarkan lalu lintas yang dikembalikan hanya untuk RELATEDdan sudah ada ESTABLISHEDsambungan ( disyorkan kerana kadang-kadang diperlukan komunikasi dua arah).
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Peraturan berguna lain
Benarkan permintaan ping dari luar.
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
Meneruskan lalu lintas di eth0port 2200ke 10.0.3.21:22(berguna jika anda ingin mendedahkan pelayan SSH yang berjalan di dalam bekas).
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22
Sekiranya anda berjaya masuk ke pelayan anda dengan menggunakan SSH, sambungan berterusan akan dibuat (iaitu tidak ada sambungan baru walaupun anda disambungkan selama lebih dari 1 jam). Sekiranya anda gagal dan cuba masuk semula, sambungan baru akan dibuat. Ini akan menyekat percubaan masuk SSH yang berterusan dengan menghadkan sambungan baru setiap jam.
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP
Ubah semua permintaan pada port 443ke port 4430(berguna jika anda mahu mengikat port 443tanpa root).
sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
	ens3 antara muka rangkaian. 
	-m geoip modul blok negara (lihat langkah 5). 
Amaran: Jangan gunakan lo, OS akan membuang semua paket yang diarahkan ke antara muka loopback .
5. Benarkan atau blok seluruh negara
5.1 Pasang xtables-addons
Anda boleh memasang xtables-addonsmodul menggunakan pelbagai kaedah, sila gunakan kaedah pemasangan yang paling sesuai untuk anda.
	- 
	
Pasang menggunakan apt-get.
	
sudo apt-get install xtables-addons-common
	 
	- 
	
Pasang menggunakan module-assistant.
	
sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant --verbose --text-mode auto-install xtables-addons
	 
	- 
	
Pasang dari sumber.
	
sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
cd xtables-addons
./autogen.sh
./configure
make
sudo make install
	 
Bina pangkalan data "negara".
sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv
Nyalakan semula sistem anda.
sudo reboot
Setelah xtables-addonsberjaya dipasang, selepas reboot pertama, jalankan depmodjika sekatan negara tidak akan berfungsi dengan baik (ini hanya diperlukan untuk kali pertama).
sudo depmod 
Buat skrip di /etc/cron.monthly/geoip-updateruntuk mengemas kini geoippangkalan data setiap bulan.
#!/usr/bin/env bash
# this script is intended to run with sudo privileges
echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip
echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl
echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater
Menjadikan /etc/cron.monthly/geoip-updaterboleh dilaksanakan.
sudo chmod +x /etc/cron.monthly/geoip-updater
5.2 Contoh peraturan
_Catatan: Jika anda menerima iptables: No chain/target/match by that nameralat ketika mencoba menerapkan geoipperaturan, kemungkinan itu xtables-addonsbelum dipasang dengan betul. Cuba kaedah pemasangan lain.
Sekat semua paket masuk dari China, Hong Kong, Rusia dan Korea.
sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP
Benarkan paket masuk di pelabuhan 80dari mana-mana sahaja kecuali negara-negara di atas.
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Benarkan paket masuk di ens3antara muka di port 22hanya dari Peru (jangan ragu untuk memilih kod negara yang anda mahu terima dari paket, misalnya, USuntuk Amerika Syarikat).
sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT
Benarkan paket masuk di pelabuhan 443hanya dari Peru.
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT