Tutorial ringkas iptables/firewall.
Resepi:
Linux kernel v 2.4.x
- iptables v 2.4 keatas
- syslog
- GNU textutils (sed, tail, uniq)
Situasi:
Jaringan
- eth0 : disambung ke LAN
- eth1 : disambung terus ke Internet.
Katakan anda menyediakan sebuah pelayan WWW/http untuk kegunaan ramai yang
disambungkan terus ke Internet. Selain dari port 80(http), anda tidak
ingin port lain diakses pada pelayan tersebut. Anda juga ingin melihat
cubaan penggodam atau ulat/cecacing yang ingin masuk ke pelayan anda pada
port lain. Apa yang anda harus lakukan?
Dengan implimentasi dinding-api, anda kena TUTUP/DROP kesemua port yang
masuk ke pelayan secara default yang datang dari Internet (katakan eth1).
CODE
# iptables -P INPUT DROP
Tapi anda kena benarkan segala sambungan masuk dari LAN anda sendiri
(katakan eth0) dan dari localhost itu sendiri.
CODE
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -i eth0 -j ACCEPT
Mmm.. dah cukup ke?. Apa kata kita cuba ping ke google.com tengok.
Alamak, tak dapat sambunglah... kenapa ye? Sebenar pelayan anda tidak
dapat menerima sahutan kembali, walaupun telah berjaya berhubung pada
destinasi host diluar. Kenapa? Sebab anda telah tutup kesemua port pada
'INPUT' tadi secara default. Jadi apa yang perlu dibuat?
Bagi memastikan segala akses keluar ke Internet dapat diterima kembali
dengan selamat. Gunalah kelebihan iptables yang bertaraf 'statefull'
firewall. Tambah je barisan canggih dibawah ini.
CODE
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Sekarang anda cuba ping google.com balik. iptables anda memastikan
sahutan/reply paket yang KELUAR dari pelayan kita itu dapat masuk dengan
membuka port yang berkaitan secara otomatik. Kalau dah siap, port ini akan
ditutup. Waaaaahhh.. canggihnya.... punyalah karan dan sempoi...
Ok, sekarang saya buka port 80 sahaja bagi membenarkan orang dapat
menggunakan servis http/web kita tadi.
CODE
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT
Jadi sekarang sapa-sapa pun boleh masuk ke pelayan ke port 80 (http) tanpa
sebarang masalah. Paket yang masuk LAIN dari port 80 akan di abaikan/DROP,
sebab kita dah setkan default policy DROP diatas tadi.
Sekarang saya teringin pulak, nak tau, berapa banyak/kekerapan penggodam
atau ulat/cecacing yang ingin menceroboh ke pelayan kita ini.... Kalau
boleh kita nak log kan kedalam fail khas, katakan
/var/log/warningCODE
#iptables -A INPUT -i eth1 -j LOG --log-level 5
Segala paket yang tidak memenuhi rules diatas tadi akan direkodkan pada
sistem log kernel pada tahap 5.
Anda kena tambah sikit barisan dibawah ke fail
/etc/syslog.confCODE
kern.notice /var/log/warning
dan restartlah servis syslog. Contoh, RH :
service syslog restart,
atau
killall -HUP syslogdSekarang, kesemua cubaan akan direkodkan ke /var/log/warning.
Mungkin anda nak tahu, kekerapan cubaan yang telah dilakukan dan dari mana.
Dengan pengetahuan 'shell scripting' anda boleh cuba arahan dibawah
CODE
# sed -n '/Jan 9/s/.*SRC=([0-9.]*).*/1/p' /var/log/warning | sort | uniq -c | sort -n
Ianya akan mencari kesemua cubaan pada 9 Januari, mengeluarkan IP host
dengan kekerapannya sekali. Contoh pada pelayan saya disini, dan hasil
data adalah data yang sebenar.
CODE
# sed -n '/Jan 8/s/.*SRC=([0-9.]*).*/1/p' /var/log/warning | sort | uniq -c | sort -n
1 202.163.199.90
1 202.188.1.23
1 208.59.182.183
1 211.161.231.243
1 213.86.145.9
1 219.106.72.123
1 61.171.204.4
2 210.1.13.167
2 210.12.31.250
2 210.207.65.44
2 213.47.103.236
2 61.151.183.6
2 64.228.90.28
3 172.176.230.172
3 203.106.3.138
3 206.49.71.194
3 207.134.167.61
3 207.215.127.248
3 211.208.151.22
3 212.169.49.35
3 65.95.117.95
7 169.207.230.119
8 192.228.143.4
9 192.228.143.125
9 202.188.114.30
9 216.112.103.21
21 210.186.141.70
62 210.186.142.61
Oooo.. nampaknya host
210.186.142.6 ni tengah DoS pelayan saya ye.... dia nak kena nih !! . Tapi apa boleh buat, itu adalah dialup IP (kalau tak salah saya)
Waaa... bestnya... Kemudian dengan idea yang sama anda boleh dapatkan
kekerapan cubaan pada setiap port. Dibawah adalah contoh bagaimana saya
dapatkan 'TOP TEN' port yang kerap diakses dalam bulan Januari.
CODE
# sed -n '/^Jan/s/.*DPT=([0-9]*).*/1/p' /var/log/warning | sort | uniq -c | sort -n | tail -10
20 3389
22 8080
24 3128
28 445
29 57
32 1080
80 2764
125 21
172 1433
437 137
Mmmm.. nampaknya ramai juga 'peminat' yang cuba akses ke port 137 (netbios).
Lihat, nampak mudah, kan . Sapa kata Unix ini sukar? Belajar sikit dengan
tekun je, anda pun boleh buat semudah ini dan mungkin lebih baik dari ini .
Semoga tips/tutorial ini dapat digunakan bersama-sama.
Wassalamz, terima kasih.
yang benar,
root.
p/s:
Segala kod 'shell scripting' diatas dilindungi dengan lesen GPL, hakmilik
cipta terpelihara 2003, Mohammad Bahathir Hashim