in Security

Cara Setting Firewall dengan IPTables di Linux

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.

Cara Setting Firewall dengan IPTables di Linux

IPTables Table, Chain, dan Rule Structure (credit: thegeekstuff.com)

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:

  1. INPUT chain: Untuk menyaring paket yang menuju ke server.
  2. OUTPUT chain: Untuk menyaring paket yang keluar dari server.
  3. FORWARD chain: Untuk menyaring paket yang menuju ke NIC lain dalam sever atau host lain.
Cara Setting Firewall dengan IPTables di Linux

INPUT, FORWAD, dan OUTPUT di Firewall (credit: hostinger.com)

2. NAT Table

Chain pada NAT table:

  1. 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).
  2. 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).
  3. 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:

  1. PREROUTING chain
  2. OUTPUT chain
  3. FORWARD chain
  4. INPUT chain
  5. POSTROUTING chain

4. Raw Table

Raw table adalah untuk pengecualian konfigurasi. Chain pada Raw table:

  1. PREROUTING chain
  2. OUTPUT chain
Cara Setting Firewall dengan IPTables di Linux

IPTables built-in tables (credit: thegeekstuff.com)

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

$ sudo apt-get install iptables iptables-persistent

Menampilkan Rules

Menampilkan rules dari Filter table

# 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

# iptables -t mangle --list

Menampilkan rules dari NAT table

# iptables -t nat --list

Menampilkan rules dari Raw table

# iptables -t raw --list

Mengubah Default Policy Filter Table

Melihat status policy iptables

sudo iptables -L | grep policy

Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)  	

Mengubah policy chain

sudo iptables --policy INPUT DROP
sudo iptables --policy FORWARD DROP
sudo iptables --policy OUTPUT ACCEPT

Mengecek ulang policy

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

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)

sudo iptables -D INPUT -p tcp --dport 21 -j ACCEPT

Menghapus semua rule

sudo iptables -F

Melihat semua rule

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

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

sudo nano /etc/iptables/rules.v4

Paste rules di bawah ini

*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

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 🙂

Referensi:

Write a Comment

Comment