Cara Setting Firewall dengan IPTables di Linux
Firewall adalah sebuah sistem perangkat lunak atau perangkat keras untuk keamanan jaringan dengan cara menyaring lalu lintas yang masuk atau keluar pada jaringan komputer. Pada sistem operasi berbasis Linux tersedia IPTables sebagai perangkat lunak firewall untuk menyaring paket dan NAT, umumnya telah tersedia secara default.
Dalam konfigurasi IPTables terdiri dari beberapa table, kemudian table berisi beberapa chain. Chain ada yang tersedia default dan bisa ditambah oleh sysadmin. Chain dapat berisi beberapa rule untuk paket.
Jadi struktur IPTables adalah IPTables -> Tables -> Chains -> Rules.
A. TABLES dan CHAINS
IPTables memiliki 4 built-in tables.
1. Filter Table
Filter adalah default table untuk IPTables. Jika sysadmin tidak mendefinisikan table sendiri, digunakanlah filter table. Filter table memiliki built-in chains:
- INPUT chain: Untuk menyaring paket yang menuju ke server.
- OUTPUT chain: Untuk menyaring paket yang keluar dari server.
- FORWARD chain: Untuk menyaring paket yang menuju ke NIC lain dalam sever atau host lain.
2. NAT Table
Chain pada NAT table:
- PREROUTING chain: Mengubah paket sebelum routing. Paket ditranslasi setelah paket masuk ke sistem sebelum routing. Ini untuk membantu menerjemahkan alamat IP tujuan (destination IP address) dari paket ke sesuatu yang cocok dengan perutean di server. Ini digunakan untuk DNAT (Destination NAT).
- POSTROUTING chain: Mengubah paket setelah routing. Paket ditranslasi ketika paket tersebut meninggalkan sistem. Ini untuk membantu menerjemahkan alamat IP sumber (source IP address) ke sesuatu yang cocok dengan perutean pada destinasi. Ini digunakan untuk SNAT (Source NAT).
- OUTPUT chain: NAT untuk paket yang dibuat secara lokal di server.
3. Mangle Table
Mangle table adalah unuk pengubahan paket khusus. Ini mengubah bit QOS di header TCP. Chain pada Mangle table:
- PREROUTING chain
- OUTPUT chain
- FORWARD chain
- INPUT chain
- POSTROUTING chain
4. Raw Table
Raw table adalah untuk pengecualian konfigurasi. Chain pada Raw table:
- PREROUTING chain
- OUTPUT chain
B. IPTABLES RULES
Berikut ini poin-poin penting yang harus diingat dalam IPTables rules.
- Rule mengandung kriteria dan target.
- Jika kriteria tersebut cocok, menuju ke rule yang ditentukan dalam target atau mengeksekusi nilai-nilai khusus yang disebutkan dalam target.
- Jika kriteria tidak cocok, pindah ke rule berikutnya.
Target Values
Berikut ini value yang dapat dipasangkan pada target.
- ACCEPT: Firewall akan menerima paket.
- DROP: Firewall akan menghancurkan paket.
- QUEUE: Firewall akan meneruskan paket ke userspace.
- RETURN: Firewall akan berhenti mengeksekusi rule berikutnya dalam chain saat ini khusus untuk paket ini. Kontrol akan dikembalikan ke calling chain.
C. INSTALL & CONFIG IPTABLES
Install iptables pada Linux Ubuntu Server 16.04
1 | $ sudo apt-get install iptables iptables-persistent |
Menampilkan Rules
Menampilkan rules dari Filter table
1 2 3 4 5 6 7 8 9 | # iptables -t filter --list Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
Menampilkan rules dari Mangle table
1 | # iptables -t mangle --list |
Menampilkan rules dari NAT table
1 | # iptables -t nat --list |
Menampilkan rules dari Raw table
1 | # iptables -t raw --list |
Mengubah Default Policy Filter Table
Melihat status policy iptables
1 2 3 4 5 | sudo iptables -L | grep policy Chain INPUT (policy ACCEPT) Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT) |
Mengubah policy chain
1 2 3 | sudo iptables --policy INPUT DROP sudo iptables --policy FORWARD DROP sudo iptables --policy OUTPUT ACCEPT |
Mengecek ulang policy
1 2 3 4 5 | sudo iptables -L | grep policy Chain INPUT (policy DROP) Chain FORWARD (policy DROP) Chain OUTPUT (policy ACCEPT) |
PERINGATAN: Hati-hati dalam mengubah policy INPUT menjadi DROP, dapat mengakibatkan server tidak bisa diremote SSH.
Menambah Rule
Pada contoh di bawah ini, IPTables mengijinkan paket ke server untuk protokol ICMP, SSH, HTTP, HTTPS, dan FTP.
Menambah rule
1 2 3 4 5 | sudo iptables -A INPUT -p icmp -j ACCEPT sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT |
Menghapus satu rule, misalnya port 21 (FTP)
1 | sudo iptables -D INPUT -p tcp --dport 21 -j ACCEPT |
Menghapus semua rule
1 | sudo iptables -F |
Melihat semua rule
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | sudo iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT icmp -- anywhere anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT tcp -- anywhere anywhere tcp dpt:ftp Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
Simpan konfigurasi IPTables
1 2 | sudo netfilter-persistent save sudo netfilter-persistent reload |
Rule IPTables tersimpan di /etc/iptables/rules.v4.
Berikut ini rule yang saya copy dari digitalocean.com yang dapat digunakan untuk menyaring paket menuju server. Saya menambahkan rule untuk ICMP, FTP, HTTP, dan HTTPS agar diterima.
Edit file rules.v4
1 | sudo nano /etc/iptables/rules.v4 |
Paste rules di bawah ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | *filter # Allow all outgoing, but drop incoming and forwarding packets by default :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Custom per-protocol chains :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Acceptable UDP traffic # Acceptable TCP traffic -A TCP -p tcp --dport 21 -j ACCEPT -A TCP -p tcp --dport 22 -j ACCEPT -A TCP -p tcp --dport 80 -j ACCEPT -A TCP -p tcp --dport 443 -j ACCEPT # Acceptable ICMP traffic -A ICMP -p icmp -j ACCEPT # Boilerplate acceptance policy -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Drop invalid packets -A INPUT -m conntrack --ctstate INVALID -j DROP # Pass traffic to protocol-specific chains ## Only allow new connections (established and related should already be handled) ## For TCP, additionally only allow new SYN packets since that is the only valid ## method for establishing a new TCP connection -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Reject anything that's fallen through to this point ## Try to be protocol-specific w/ rejection message -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Commit the changes COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
Simpan file, keluar dari nano.
Agar file konfigurasi terload jalankan perintah
1 2 3 | sudo iptables-restore -t < /etc/iptables/rules.v4 sudo netfilter-persistent save sudo netfilter-persistent reload |
Pastikan rule IPTables masih tetap ada setelah server direstart.
Selamat mencoba 🙂