IPtables adalah utilitas linux yang memungkinkan Anda mengonfigurasi aturan firewall pada tingkat OS seperti memblokir berdasarkan alamat IP, port dan protokol.
Berikut adalah beberapa aturan firewall dengan IPtables yang mungkin Anda butuhkan untuk mengamankan server Linux Anda.
Listing Rules #
Untuk melihat aturan firewall filter.
iptables -S
Untuk melihat aturan firewall nat.
iptables -S -t nat
Melihat seluruh aturan firewall iptables.
iptables-save
Untuk melihat aturan firewall berdasarkan Chain.
iptables -L INPUT
Menampilkan nomor baris aturan firewall.
iptables -L --line-numbers
Menampilkan jumlah paket dan Aggregate size.
iptables -L INPUT -v
Reset jumlah paket dan Aggregate size.
iptables -Z
Deleting Rules #
Untuk menghapus aturan firewall berdasarkan line-numbers.
iptables -D INPUT 3
Menghapus aturan firewall berdasarkan Chain.
iptables -F INPUT
Menghapus seluruh aturan firewall.
iptables -F
Untuk menghapus Chain.
iptables -X LOGDROPIN
Logging #
Anda dapat mengaktifkan logging pada suatu aturan dengan cara berikut.
iptables -N LOGDROPIN
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j LOGDROPIN
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j LOGDROPIN
iptables -A LOGDROPIN -p tcp -m limit --limit 30/min -j LOG --log-prefix "*Blokir Trafik HTTP* " --log-uid
iptables -A LOGDROPIN -j DROP
Dari contoh aturan firewall tersebut, kita akan mendapatkan log setiap ada trafik masuk yang mengarah ke port 80 (HTTP) dan 443 (HTTPS).
Jun 3 23:48:20 lamp kernel: *Blokir Trafik HTTP* IN=eth0 OUT= MAC=00:0c:29:03:8f:2d:00:0c:29:fa:93:f6:08:00 SRC=192.168.160.145 DST=192.168.160.30 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28829 DF PROTO=TCP SPT=45996 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0
Jun 3 23:48:24 lamp kernel: *Blokir Trafik HTTP* IN= OUT=eth0 SRC=192.168.160.30 DST=104.21.30.34 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=8322 DF PROTO=TCP SPT=52702 DPT=80 WINDOW=29200 RES=0x00 SYN URGP=0 UID=1002 GID=1002
Anda juga dapat menerapkan aturan firewall tersebut untuk user Linux tertentu berdasarkan UID.
iptables -N LOGDROPIN
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j LOGDROPIN
iptables -A OUTPUT -p tcp -m multiport --dport 80,443 -m owner --uid-owner 1002 -j LOGDROPIN
iptables -A LOGDROPIN -j LOG --log-prefix "*Blokir Trafik HTTP* " --log-uid
iptables -A LOGDROPIN -j DROP
Untuk menampilkan LOG trafik keluar pada user Linux teertentu berdasarkan UID.
iptables -N LOGACCIN
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m owner --uid-owner 1002 -j LOGACCIN
iptables -A LOGACCIN -j LOG --log-prefix "*INFO TRAFIK* " --log-uid
iptables -A LOGACCIN -j ACCEPT
Log yang akan didapat.
Jun 3 23:56:53 lamp kernel: *INFO TRAFIK* IN= OUT=eth0 SRC=192.168.160.30 DST=172.67.150.119 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=21276 DF PROTO=TCP SPT=34368 DPT=80 WINDOW=239 RES=0x00 ACK FIN URGP=0 UID=1002 GID=1002
Untuk melakukan trace IP tertentu di seluruh chain iptables.
iptables -t raw -A PREROUTING -s 192.168.160.41 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j TRACE
Lalu cek trace IP menggunakan xtables-monitor
.
# xtables-monitor -t
PACKET: 2 5faa8904 IN=eth0 MACSRC=52:54:0:30:67:b6 MACDST=52:54:0:9c:52:a4 MACPROTO=0800 SRC=192.168.160.41 DST=192.168.160.30 LEN=60 TOS=0x0 TTL=64 ID=43395 DF SPORT=51172 DPORT=22 SYN
TRACE: 2 5faa8904 raw:PREROUTING:rule:0x3:CONTINUE -4 -t raw -A PREROUTING -s 192.168.160.41/32 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j TRACE
TRACE: 2 5faa8904 raw:PREROUTING:return:
TRACE: 2 5faa8904 raw:PREROUTING:policy:ACCEPT
Example Blocking Rules #
Blokir IP tertentu yang mengakses port 80 (HTTP) dan 443 (HTTPS).
iptables -A INPUT -s 192.168.0.0/16 -p tcp --match multiport --dport 80,443 -j DROP
Untuk menambahkan comment ke aturan firewall.
iptables -A INPUT -s 192.168.0.0/16 -m comment --comment "Private IP Block"
Untuk mengizinkan 2 koneksi SSH per host klien.
iptables -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
Untuk membatasi koneksi dan memblokir IP dalam waktu tertentu.
iptables -N PORTFLOOD
iptables -A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j PORTFLOOD
iptables -A PORTFLOOD -m recent --set --name portflood
iptables -A PORTFLOOD -m recent --update --seconds 300 --hitcount 20 --name portflood -j LOG --log-prefix "*BLOCK FLOOD* "
iptables -A PORTFLOOD -m recent --update --seconds 300 --hitcount 20 --name portflood -j DROP
Untuk memblokir semua permintaan MX dengan IPtables.
iptables -A OUTPUT -p udp --dport 53 --match string --algo kmp --hex-string '|00000f0001|' -j DROP
Untuk memblokir semua permintaan MX google.com dengan IPtables.
iptables -I OUTPUT -p udp --dport 53 -m string --algo kmp --hex-string "|06|google|03|com|00 000F|" -j DROP
Untuk memblokir trafik masuk HTTP berdasarkan MAC address. Hanya berlaku pada chain PREROUTING, FORWARD atau INPUT.
iptables -A INPUT -p tcp -m tcp --dport 80 -m mac --mac-source 00:0C:29:DB:B5:67 -j ACCEPT
Untuk memblokir trafik masuk HTTP berdasarkan list IP pada IPset.
iptables -A INPUT -p tcp -m tcp --dport 80 -m set --match-set dame_judol src,dst -j DROP
Untuk memblokir koneksi paket dengan status INVALID.
iptables -A INPUT -p tcp -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
Untuk mencegah serangan ping flood.
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
Untuk melindungi server dari upaya DOS paket SYN TCP.
iptables -A INPUT ! -i lo -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j SYNFLOOD
iptables -A SYNFLOOD -m limit --limit 100/sec --limit-burst 150 -j RETURN
iptables -A SYNFLOOD -m limit --limit 30/min -j LOG --log-prefix "*BLOCK SYNFLOOD* "
iptables -A SYNFLOOD -j DROP
Example load balancer rule #
Server Load Balancer
- IP: 192.168.160.30
Web Server 1
- IP: 192.168.160.42
Web Server 2
- IP: 192.168.160.43
Sebelum menerapkan rule load balancer, pastikan Server Load Balancer telah disetting ip_forwarding.
sysctl net.ipv4.ip_forward=1
Untuk rule load balancing dengan metode random balancing.
iptables -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -m statistic --mode random --probability 0.33 -j DNAT --to-destination 192.168.160.42
iptables -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.160.43
iptables -A POSTROUTING -o eth0 -p tcp -m tcp -j SNAT --to-source 192.168.160.30
Untuk rule load balancing dengan metode round robin.
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.160.42
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j DNAT --to-destination 192.168.160.43
iptables -t nat -A POSTROUTING -p tcp -m tcp -o eth0 -j SNAT --to-source 192.168.160.30
Opsi --every
disetting bertingkat sesuai jumlah web server. Misal jika memiliki 4 web server maka aturan yang digunakan seperti berikut.
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.160.42
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.160.43
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -m statistic --mode nth --every 1 --packet 0 -j DNAT --to-destination 192.168.160.44
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j DNAT --to-destination 192.168.160.45
Referensi: