Friday, March 2, 2007

- Packet Filter




IPTables adalah sebuah ekstensi kernel Linux, digunakan untuk melakukan filtering paket yang masuk kedalam box Linux. Packet filter digunakan pada system kita paling tidak karena 3 alasan berikut ini:


kendali
Paket yang masuk ke dalam kernel Linux dapat diatur policy-nya, berdasarkan port, tipe protocol jenis koneksi dan berbagai fitur lainnya.


keamanan
Dengan kendali yang kita miliki terhadap semua paket data yang masuk kedalam kernel, maka keamanan system juga akan dapat terjaga. Kita dapat memilih paket-paket yang bias masuk dan tidak bias masuk ke dalam kernel kita.


monitoring
Semua paket yang melewati system kita dapat di monitor, terutama bermanfaat pada gateway jaringan, sehingga kita bisa mengatur policy jaringan local kita.


IPTables memiliki 4 buah table yang yaitu: filter (table default), nat, mangle dan raw. Jalankan perintah berikut ini untuk melihat daftar opsi filter paket yang sudah kita buat.


root@riset-c-3208-49:~# iptables -L
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


Table of contents


1 Filter Tabel
2 NAT Table
2.1 SNAT2.2 DNAT



Filter Tabel
Filter table pada awalnya memiliki 3 buah chain yaitu INPUT, FORWARD dan OUTPUT. Contoh berikut ini digunakan untuk mendrop paket yang masuk kedalam chain INPUT dari ip 192.168.5.10


iptables -A INPUT -s 192.168.5.10 -j DROP



Lambang negasi ! dapat digunakan untuk menyatakan not, misalnya kita menginginkan semua paket yang tidak berasal dari 192.168.5.10 di drop, maka perintah berikut dapat digunakan


iptables -A INPUT -s ! 192.168.5.10 -j DROP



Filtering untuk mengatur akses terhadap port tertentu kita gunakan modul multiport, contoh berikut ini kita akan mendrop semua paket tcp yang masuk melalui port 80 dan 21 dan berasal dari ip jaringan 202.173.65.0/24


iptables -A INPUT -s 202.173.65.0/24 -m multiport -p tcp --destination-ports 80,21 -j DROP


Untuk membuat chain baru, kita dapat menggunakan opsi –N, misalnya saja


iptables -N block
iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
iptables -A block -j DROP
iptables -A INPUT -j block
iptables -A FORWARD -j block



Pada contoh diatas kita menyambung chain INPUT dan FORWARD ke chain block, dimana pada chain ini kita mendefinisikan sebuah rule yaitu semua paket baru yang ingin melakukan koneksi melalui interface ppp0 akan didrop.
Contoh berikut ini, kita membuat kernel akan mendrop semua fragmentasi paket yang keluar dari kernel dan menuju ip 192.168.5.5


iptables -A OUTPUT -f -d 192.168.1.1 -j DROP



Jika kita menginginkan memblok protocol ICMP kita dapat menggunakan perintah seperti ini


iptables -A INPUT -p icmp -j REJECT


Opsi lain yang dapat digunakan pada –j adalah QUEUE, yaitu memasukan semua paket kedalam antrian untuk diproses pada level user space. Berikut ini adalah contohnya


iptables -A OUTPUT -p tcp -j QUEUE



Dan misalnya dengan library ip_queue yang dimiliki oleh perl kita dapat membuat sebuah aplikasi yang berjalan di user space


#!/usr/bin/perl


use strict;
use DBI;
use IPTables::IPv4::IPQueue qw(:constants);
use NetPacket::IP qw(:ALL);
use NetPacket::TCP qw(:ALL);



my ($queue, $msg, $ip, $tcp);



$queue = new IPTables::IPv4::IPQueue(copy_mode => IPQ_COPY_PACKET)
or die IPTables::IPv4::IPQueue->errstr;
$queue->set_mode(IPQ_COPY_PACKET, 2048);
while(1) {
$msg = $queue->get_message()
or die IPTables::IPv4::IPQueue->errstr;
$ip = NetPacket::IP->decode($msg->payload());
my $tcp = NetPacket::TCP->decode($ip->{data});



my $app = $tcp->{data};
$queue->set_verdict($msg->packet_id(), NF_ACCEPT) > 0
or die IPTables::IPv4::IPQueue->errstr;
$counter++;
}



Dengan membuat aplikasi di user space kita dapat melakukan filtering dengan lebih advance lagi, tapi dengan konsekuensi respon yang melambat akibat semua paket akan masuk ke user space terlebih dahulu.


NAT Table


Nat table memiliki 3 buah chain pada awalnya yaitu PREROUTING, POSTROUTING dan OUTPUT.


root@riset-c-3208-49:~# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination



Chain POSTROUTING (policy ACCEPT)
target prot opt source destination



Chain OUTPUT (policy ACCEPT)
target prot opt source destination



NAT digunakan umumnya karena hal-hal berikut ini:



Sharing internet connection



Misalnya kita melakukan koneksi ke Internet melalui sebuah ISP yang hanya memberikan satu buah IP, jika kita ingin melakukan sharing koneksi maka semua host lainnya dalam jaringan kita dapat di translate alamatnya ke IP ISP tersebut.



Multiple Server



Jika kita memiliki banyak server public namun hanya memiliki satu buah IP, maka dapat digunakan NAT untuk mengatarkan paket ke server tujuan.



Transparant Proxy


Digunakan misalnya jika kita menginginkan semua paket yang masuk akan diredirect kesebuah aplikasi lain pada Linux box kita. NAT terbagi dua buah yaitu DNAT (Destination NAT) dan SNAT (Source NAT) source NAT digunakan untuk melakukan altering asal paket, sementara DNAT digunakan untuk mengubah destination sebuah paket.
Opsi berikut ini umumnya digunakan pada jaringan yang ingin di NAT keseluruhan


iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP
iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP
echo 1 > /proc/sys/net/ipv4/ip_forward



Prerouting adalah chain sebelum kernel memutuskan policy apa yang akan dilakukan terhadap paket tersebut, sementara postrouting dilakukan setelah selesai prosesing.



SNAT

#ubah tujuan ke 1.2.3.4 semua paket yg keluar dari eth0
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4



#jika digunakan opsi seperti ini maka digunakan logika or
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6



[[Category: Networking]] [[Category: Security]]



#ubah source address menjadi 1.2.3.4 dengan port 1-1023
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023



Masquerading adalah opsi special dari SNAT, umumnya digunakan jika kita mendapatkan IP yang dynamic dari ISP kita.


iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE


DNAT

#ubah tujuan semua paket yang masuk dari eth0 ke 5.6.7.8
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8



#salah satu teknik load balancing
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10



#semua paket yang menuju port 80 dipindahkan ke port 8080 5.6.7.8


iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
-j DNAT --to 5.6.7.8:8080



Selain itu pada DNAT ada opsi special yang bernama REDIRECT, misalnya saja kita menginginkan membuat sebuah transparent proxy maka gunakanlah opsi berikut ini


iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
-j REDIRECT --to-port 3128



Selanjutnya adalah kita perlu mengubah beberapa opsi pada squid


httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on



Misalnya kita mempunyai sebuah ip public yang dijadikan gateway ke internet, dan menginginkan webserver kita tetap berada pada segment private. Opsi berikut ini dapat kita gunakan


iptables -t nat -A PREROUTING -d 1.2.3.4 \
-p tcp --dport 80 -j DNAT --to 192.168.1.1