lcat
My personal /var/log
  • Home
  • Contact
  • HackMe!

Revisiting iptables

Referensi: Linux iptables Pocket Reference (Gregor N. Purdy)

Mungkin bukunya terlalu tua tapi harusnya masih relevan. Catatan ini dibuat sambil membaca bukunya, dicampur juga dengan apa yang saya pikirkan.

iptables mendefinisikan 5 hook point: `PREROUTING`, `INPUT`, `FORWARD`, `POSTROUTING`, dan `OUTPUT`. Ini yang built-in dan diasosiasikan dengan 5 builtin chain dengan nama yang sama.

Mungkin kita biasanya lihat `iptables -t nat -A PREROUTING` (table `nat`, chain `PREROUTING`), tapi ingat bahwa chain `PREROUTING` bukan punya tabel `nat` atau sebaliknya. Chain `PREROUTING` itu dieksekusi di hook point `PREROUTING`. Tabel `nat` hanya berisi kumpulan aturan-aturan terkait NAT yang bisa saja dieksekusi ketika `PREROUTING` atau chain yang lain.

Untuk masing-masing dari lima hook point di atas, bisa dibuat ringkasan seperti ini (sebenarnya dari nama chain-ya saja sudah cukup deskriptif):

1. `PREROUTING` adalah ketika paket datang dari network interface dan belum dirouting (bisa saja ke local process atau balik ke network interface lagi)
2. `INPUT` persis sebelum diteruskan ke local process
3. `OUTPUT` persis setelah paket dibuat oleh local process
4. `FORWARD` ketika numpang lewat saja, tidak diteruskan ke proses
5. `POSTROUTING` persis sebelum meninggalkan network interface

Kata bukunya hook point ini ada di source code kernel di file `/usr/include/linux/netfilter_ipv4.h`.


Built-in table ada tiga yaitu `filter`, `nat`, dan `mangle`. Sesuai namanya, tabel `filter` untuk filtering traffic yang boleh lewat, `nat` untuk NAT (biasanya tergantung source/destination address), dan `mangle` untuk mengubah-ubah atribut paket, contohnya TTL. Kalau `-t` tidak diatur, maka iptables akan pakai tabel `filter` by default.

Setiap tabel punya chain yang awalnya kosong untuk sebagian atau semua hook points. Suatu chain punya *policy* yang mengatur paket harus diapakan jika sudah melewati chain tersebut tapi tidak dikirim ke target manapun. Untuk built-in chain, policy hanya bisa diatur ke target `ACCEPT` dan `DROP` saja. User bisa bikin custom chain, tapi akan punya implicit policy `RETURN` yang tidak bisa diubah.

Suatu paket akan melewati (traverse) chain-chain dan rule-rule pada chain yang dilewati akan dievaluasi. Jika tidak ada yang match dalam suatu chain, maka si *policy* atau *default target* ini akan di-apply.

Suatu rule dalam iptables punya kriteria yang digunakan untuk menyasar paket-paket yang diinginkan. Rule ini juga punya spesifikasi target yang mengatur apa yang akan dilakukan dengan paket-paket yang sesuai kriteria. Setiap rule punya packet counter yang diincrement ketika ada packet yang match dengan rule tersebut. Bagian match dan target dari suatu rule bersifat opsional, jika tidak ada match maka semua paket akan dianggap memenuhi kriteria, dan kalau tidak punya target maka rule dianggap tidak ada (tapi counter tetap diincrement).


Match ini bisa beragam, termasuk jenis protocol, source address, destination address. Misal untuk protokol pakai `-p tcp`. Ada juga extension (pakai `-m` atau module) yang memungkinkan match ini mengambil owner uid/gid (see iptables-extensions).

Untuk target, yang builtin ada 4, yaitu:

1. `ACCEPT`, lanjutkan ke tahap pemrosesan berikutnya, stop berjalan di chain yang saat ini
2. `DROP`, stop proses paketnya, tidak usah cek terhadap tabel, chain, dan rule lain
3. `QUEUE`, kirim paket ke userspace (cek *libipq*)
4. `RETURN`, rule untuk user-defined chain, berhenti memproses chain ini, kemudian kembali ke calling chain dan lanjutkan ke rule berikutnya di sana (setelah rule yang jump ke user-defined chain ini)


Untuk target `DROP`, paket benar-benar di-*drop*, dan jika ingin feedback bisa pakai extension target `REJECT`. Sepertinya iptables ini punya implementasi dasar dan juga extensions yang mungkin tidak portable yaa..

Kegunaan iptables meliputi packet filtering, accounting, connection tracking, packet mangling, NAT, masquerading, port forwarding, load balancing. Untuk load balancing, caranya bisa dengan melakukan round robin terhadap beberapa destination address.


Pengaturan iptables beda-beda tergantung distro. Untuk bisa forward packet antar interface, perlu nyalakan `/proc/sys/ipv4/ip_forward`.

Kalau compile kernel sendiri, config yang mengatur netfilter atau iptables ini adalah `CONFIG_IP_NF_*`, dengan at least config berikut harus nyala: `CONFIG_PACKET` (komunikasi dengan network interface), `CONFIG_NETFILTER` (basic support untuk iptables), `CONFIG_IP_NF_CONNTRACK` (diperlukan untuk NAT dan masquerading), `CONFIG_IP_NF_FILTER` (tabel `filter`), `CONFIG_IP_NF_IPTABLES` (utility `iptables` di userspace), `CONFIG_IP_NF_MANGLE` (tabel `mangle`), `CONFIG_IP_NF_NAT` (tabel `nat`).

iptables mengasosiasikan paket dengan logical connection yang terjadi, termasuk juga untuk koneksi UDP (walau sebenarnya protokolnya bersifat *connectionless*). Ada empat connection tracking states:

1. `ESTABLISHED`, sudah tampak koneksi dua arah
2. `INVALID`, paket tidak termasuk dalam koneksi-koneksi yang ditrack
3. `NEW`, paket mencoba memulai koneksi baru atau bagian dari koneksi yang belum melihat paket dari kedua arah
4. `RELATED`, paket mencoba memulai koneksi baru tapi sebenarnya bagian dari koneksi yang existing (misalnya transfer file pada sesi FTP)

Lebih detail, berikut kutipan dari manpage iptables-extensions untuk ekstensi match conntrack (misal `-m conntrack --ctstate` atau `-m conntrack --ctstatus`). Kelihatan mungkin ada state baru di tahun 2025 ini versus 2004 ketika buku yang sedang saya baca ini ditulis ;)

```
 States for --ctstate:

       INVALID
              The packet is associated with no known connection.

       NEW    The packet has started a new connection or otherwise associated with a connection which has not seen packets in both directions.

       ESTABLISHED
              The packet is associated with a connection which has seen packets in both directions.

       RELATED
              The packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer or an ICMP error.

       UNTRACKED
              The packet is not tracked at all, which happens if you explicitly untrack it by using -j CT --notrack in the raw table.

       SNAT   A virtual state, matching if the original source address differs from the reply destination.

       DNAT   A virtual state, matching if the original destination differs from the reply source.

       Statuses for --ctstatus:

       NONE   None of the below.

       EXPECTED
              This is an expected connection (i.e. a conntrack helper set it up).

       SEEN_REPLY
              Conntrack has seen packets in both directions.

       ASSURED
              Conntrack entry should never be early-expired.

       CONFIRMED
              Connection is confirmed: originating packet has left box.
```



... sekian, seharusnya sisanya bisa dipelajari dengan mencicil baca-baca manpages sesuai kebutuhan.
Created: 2025-05-25 11:32:26, Updated: 2025-05-25 11:32:26, ID: 719bf4a5-b41d-4aaf-b01e-ca9b6d6bb798