Wednesday, May 16, 2007

iptables (version bro root)

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/warning

CODE
#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.conf
CODE
kern.notice /var/log/warning


dan restartlah servis syslog. Contoh, RH : service syslog restart,
atau killall -HUP syslogd

Sekarang, 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

No comments: