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
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++;
}
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.
#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