Membangun firewall stateful dengan connection tracking: memahami modul conntrack dan --ctstate ESTABLISHED RELATED, perbedaannya dengan modul state yang lama, serta pola rule stateless vs stateful dan prioritas ESTABLISHED RELATED di awal chain

Hingga episode 6, semua aturan yang kita buat bersifat stateless — setiap paket dinilai sendiri-sendiri tanpa ingatan. Tapi jaringan nyata bersifat stateful: balasan paket yang kita kirim keluar harus bisa masuk kembali. Kalau firewall cuma punya ingatan kosong, kalian harus membuka semua port masuk secara manual — atau memutus semua koneksi keluar.
Solusinya adalah connection tracking (conntrack): kernel melacak setiap koneksi yang sudah ada, dan iptables bisa bertanya "paket ini bagian dari koneksi yang sudah sah?" lewat modul conntrack. Ini adalah salah satu konsep yang membedakan firewall profesional dari sekadar kumpulan aturan DROP.
conntrack adalah sub-sistem netfilter yang merekam status setiap koneksi TCP/UDP/ICMP yang melewati mesin. Dari catatan ini, sebuah paket diklasifikasikan ke dalam state:
| State | Arti |
|---|---|
NEW | Koneksi baru — paket pertama dari arah tertentu |
ESTABLISHED | Bagian dari koneksi yang sudah terekam dua arah |
RELATED | Koneksi baru yang lahir dari koneksi yang sudah ada (mis. koneksi data FTP, ICMP error) |
INVALID | Paket tidak cocok dengan koneksi mana pun yang dikenal |
Lihat tabel conntrack secara langsung:
sudo conntrack -Ltcp 6 431999 ESTABLISHED src=192.168.1.10 dst=93.184.216.34 sport=41234 dport=80 ...Setiap baris adalah satu koneksi yang sedang dilacak — lengkap dengan arah, port, dan waktu hidupnya. Di episode 18 tabel ini jadi alat diagnosis utama.
iptables punya dua modul untuk hal yang sama:
# Modern (disarankan)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Lama (deprecated tapi masih dipakai)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT-m conntrack --ctstate adalah versi modern yang direkomendasikan; -m state --state adalah alias lama yang masih banyak di tutorial dan script legacy. Perbedaannya murni sintaksis — keduanya membaca tabel conntrack yang sama. Saat membaca script lama kalian, ketahuilah bahwa keduanya bisa ditemui.
Inilah pola yang menjadi tulang punggung hampir semua ruleset produksi: izinkan koneksi keluar, terima balasannya, tapi tolak koneksi masuk yang baru:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPTAlur berpikirnya:
NEW — koneksi SSH yang benar-benar baru. Paket SSH lanjutan sudah diliput baris pertama.Note
Karena aturan ESTABLISHED,RELATED berada di atas, urutan NEW di bawahnya bisa memakai -m conntrack --ctstate NEW sebagai konfirmasi eksplisit. Sebenarnya --dport 22 saja sudah cukup karena paket lanjutan sudah ditangkap baris pertama — tapi menulis NEW membuat niat kalian jelas bagi yang membaca ruleset.
State RELATED terlihat paling jelas pada FTP aktif. FTP memakai dua koneksi: kontrol di port 21 dan data di port 20 — dan koneksi data lahir karena koneksi kontrol sudah ada. Dengan conntrack, firewall otomatis mengenali koneksi data FTP sebagai RELATED:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 21 -m conntrack --ctstate NEW -j ACCEPTTanpa conntrack, kalian harus membuka port 20 juga — dan bahkan itu tidak cukup karena port data FTP sering dinamis. RELATED adalah alasan kenapa firewall modern bisa mendukung protokol kompleks dengan sedikit aturan.
| Aspek | Stateless | Stateful |
|---|---|---|
| Cara kerja | Setiap paket dinilai sendiri | Kernel melacak koneksi |
| Rule | --dport 22 tanpa state | --ctstate ESTABLISHED,RELATED |
| Resiko | Perlu membuka banyak port | Overhead tabel conntrack |
| Kapan dipakai | Antarmuka segment, protokol sederhana | Server internet-facing, NAT, routing |
Stateless tetap berguna untuk memfilter trafik massal dengan biaya rendah (misal blokir subnet di FORWARD). Stateful adalah default untuk proteksi layanan nyata.
Kadang kalian justru ingin melepas beberapa trafik dari tracking — misalnya trafik volume tinggi antar server internal yang tidak perlu status:
sudo iptables -t raw -A PREROUTING -i eth0 -p tcp --dport 6379 -j NOTRACK
sudo iptables -t raw -A OUTPUT -o eth0 -p tcp --dport 6379 -j NOTRACKKarena conntrack berjalan setelah chain raw (dari episode 2), target NOTRACK membuat paket tersebut tidak dicatat. Untungnya kecil, kontrol lebih besar — tetapi ingat: paket yang di-NOTRACK juga tidak akan pernah cocok dengan aturan --ctstate apa pun. Pakai hanya saat benar-benar yakin.
ESTABLISHED,RELATED di akhir chain — padahal justru harus di awal, supaya paket balasan tidak perlu melewati aturan lain lebih dulu.--ctstate NEW untuk protokol yang tidak ditrack — ICMP ping misalnya membutuhkan icmp di rule-nya sendiri.Inti yang harus dibawa pulang:
NEW, ESTABLISHED, RELATED, INVALID.-m conntrack --ctstate menggantikan -m state --state yang lama.ESTABLISHED,RELATED di awal chain, layanan publik dengan NEW di bawahnya.NOTRACK di tabel raw melepas trafik dari tracking — pakai dengan hati-hati.Di episode 8 selanjutnya kita akan membahas save & restore ruleset — mempertahankan aturan kalian melewati reboot dengan iptables-save/iptables-restore, file /etc/iptables/rules.v4, dan netfilter-persistent, plus strategi rollback cepat ketika konfigurasi baru bermasalah. Sampai jumpa di episode 8!