Product SiteDocumentation Site

14.2. Firewall atau Penyaringan Paket

Firewall adalah gateway jaringan yang menyaring dan hanya efektif pada paket yang harus melaluinya. Oleh karenanya, itu hanya dapat efektif ketika melalui firewall adalah satu-satunya rute untuk paket-paket ini.
Kernel Linux menyertakan firewall netfilter. Ini dapat dikontrol dari ruang pengguna dengan perintah iptables, ip6tables, arptables, dan ebtables.
Namun, perintah iptables Netfilter digantikan oleh nftables, yang menghindari banyak masalahnya. Desainnya melibatkan lebih sedikit duplikasi kode, dan dapat dikelola hanya dengan perintah nft. Sejak Debian Buster, framework nftables digunakan secara baku. Perintah-perintah yang disebutkan sebelumnya disediakan oleh versi, yang menggunakan API kernel nftables, secara baku. Jika seseorang memerlukan perintah "klasik", biner yang relevan dapat disesuaikan menggunakan update-alternatives.
Untuk mengaktifkan firewall default di Debian, jalankan:
# apt install -y nftables
Reading package lists... Done
...
# systemctl enable nftables.service
Created symlink /etc/systemd/system/sysinit.target.wants/nftables.service → /lib/systemd/system/nftables.service.

14.2.1. Perilaku nftables

Ketika kernel mengolah paket jaringan, itu berhenti dan memungkinkan kita untuk memeriksa paket dan memutuskan apa yang harus dilakukan dengan paket tersebut. Misalnya, kita mungkin ingin menjatuhkan atau membuang paket masuk tertentu, memodifikasi paket lainnya dengan berbagai cara, memblokir paket keluar tertentu untuk mengontrol malware atau mengalihkan beberapa paket pada tahap sedini mungkin ke antarmuka jaringan bridge atau untuk menyebarkan beban paket yang masuk antar sistem.
Pemahaman yang baik dari layer 3, 4, dan 5 dari model OSI (Open System Interconnection) sangat penting untuk mendapatkan yang terbaik dari netfilter.
Firewall dikonfigurasi dengan tabel, yang memegang aturan yang terkandung dalam rantai. Tidak seperti iptables, nftables tidak memiliki tabel default. Pengguna memutuskan mana dan berapa banyak tabel yang dibuat. Setiap tabel harus ditugaskan hanya ke satu dari lima keluarga berikut: ip, ip6, inet, arp dan bridge. ip digunakan jika keluarga tidak dinyatakan.
Ada dua jenis rantai: rantai dasar dan rantai reguler. Sebuah rantai dasar adalah titik masuk untuk paket dari stack jaringan, mereka terdaftar ke dalam hook netfilter, yaitu, rantai ini melihat paket yang mengalir melalui stack TCP/IP. Di sisi lain, dan rantai reguler tidak melekat pada hook apa pun, sehingga mereka tidak melihat lalu lintas, tetapi dapat digunakan sebagai target melompat untuk pengorganisasian yang lebih baik.
Aturan yang terbuat dari pernyataan, yang mencakup beberapa ungkapan yang harus dicocokkan dan kemudian pernyataan putusan, seperti accept, drop, queue, continue, return, jump chain, dan goto chain.

14.2.2. Berpindah dari iptables ke nftables

Perintah iptables-translate dan ip6tables-translate dapat digunakan untuk menerjemahkan perintah iptables lama ke dalam sintaks nftables baru. Seluruh aturan juga dapat diterjemahkan, dalam hal ini kita memigrasi peraturan yang dikonfigurasi dalam satu komputer yang dipasangi Docker:
# iptables-save > iptables-ruleset.txt
# iptables-restore-translate -f iptables-ruleset.txt

# Translated by iptables-restore-translate v1.8.7 on Wed Mar 16 22:06:32 2022
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; policy accept; }
add chain ip filter FORWARD { type filter hook forward priority 0; policy drop; }
add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; }
add chain ip filter DOCKER
add chain ip filter DOCKER-ISOLATION-STAGE-1
add chain ip filter DOCKER-ISOLATION-STAGE-2
add chain ip filter DOCKER-USER
add rule ip filter FORWARD counter jump DOCKER-USER
add rule ip filter FORWARD counter jump DOCKER-ISOLATION-STAGE-1
add rule ip filter FORWARD oifname "docker0" ct state related,established counter accept
add rule ip filter FORWARD oifname "docker0" counter jump DOCKER
add rule ip filter FORWARD iifname "docker0" oifname != "docker0" counter accept
add rule ip filter FORWARD iifname "docker0" oifname "docker0" counter accept
add rule ip filter DOCKER-ISOLATION-STAGE-1 iifname "docker0" oifname != "docker0" counter jump DOCKER-ISOLATION-STAGE-2
add rule ip filter DOCKER-ISOLATION-STAGE-1 counter return
add rule ip filter DOCKER-ISOLATION-STAGE-2 oifname "docker0" counter drop
add rule ip filter DOCKER-ISOLATION-STAGE-2 counter return
add rule ip filter DOCKER-USER counter return
add table ip nat
add chain ip nat PREROUTING { type nat hook prerouting priority -100; policy accept; }
add chain ip nat INPUT { type nat hook input priority 100; policy accept; }
add chain ip nat OUTPUT { type nat hook output priority -100; policy accept; }
add chain ip nat POSTROUTING { type nat hook postrouting priority 100; policy accept; }
add chain ip nat DOCKER
add rule ip nat PREROUTING fib daddr type local counter jump DOCKER
add rule ip nat OUTPUT ip daddr != 127.0.0.0/8 fib daddr type local counter jump DOCKER
add rule ip nat POSTROUTING oifname != "docker0" ip saddr 172.17.0.0/16 counter masquerade
add rule ip nat DOCKER iifname "docker0" counter return
# Completed on Wed Mar 16 22:06:32 2022
# iptables-restore-translate -f iptables-ruleset.txt > ruleset.nft
# nft -f ruleset.nft
# nft list ruleset
table inet filter {
	chain input {
		type filter hook input priority filter; policy accept;
	}

	chain forward {
		type filter hook forward priority filter; policy accept;
	}

	chain output {
		type filter hook output priority filter; policy accept;
	}
}
table ip nat {
	chain DOCKER {
		iifname "docker0" counter packets 0 bytes 0 return
		iifname "docker0" counter packets 0 bytes 0 return
	}

	chain POSTROUTING {
		type nat hook postrouting priority srcnat; policy accept;
		oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 0 bytes 0 masquerade
		oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 0 bytes 0 masquerade
	}

	chain PREROUTING {
		type nat hook prerouting priority dstnat; policy accept;
		fib daddr type local counter packets 1 bytes 60 jump DOCKER
		fib daddr type local counter packets 0 bytes 0 jump DOCKER
	}

	chain OUTPUT {
		type nat hook output priority -100; policy accept;
		ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
		ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
	}

	chain INPUT {
		type nat hook input priority 100; policy accept;
	}
}
table ip filter {
	chain DOCKER {
	}

	chain DOCKER-ISOLATION-STAGE-1 {
		iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-2
		counter packets 0 bytes 0 return
		iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-2
		counter packets 0 bytes 0 return
	}

	chain DOCKER-ISOLATION-STAGE-2 {
		oifname "docker0" counter packets 0 bytes 0 drop
		counter packets 0 bytes 0 return
		oifname "docker0" counter packets 0 bytes 0 drop
		counter packets 0 bytes 0 return
	}

	chain FORWARD {
		type filter hook forward priority filter; policy drop;
		counter packets 0 bytes 0 jump DOCKER-USER
		counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-1
		oifname "docker0" ct state related,established counter packets 0 bytes 0 accept
		oifname "docker0" counter packets 0 bytes 0 jump DOCKER
		iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 accept
		iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
		counter packets 0 bytes 0 jump DOCKER-USER
		counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-1
		oifname "docker0" ct state established,related counter packets 0 bytes 0 accept
		oifname "docker0" counter packets 0 bytes 0 jump DOCKER
		iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 accept
		iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
	}

	chain DOCKER-USER {
		counter packets 0 bytes 0 return
		counter packets 0 bytes 0 return
	}

	chain INPUT {
		type filter hook input priority filter; policy accept;
	}

	chain OUTPUT {
		type filter hook output priority filter; policy accept;
	}
}
Alat iptables-nft, ip6tables-nft, arptables-nft, ebtables-nft adalah versi iptables yang menggunakan API nftables, sehingga pengguna dapat tetap menggunakan sintaks iptables lama dengan mereka, tapi itu tidak dianjurkan; alat ini hanya boleh digunakan untuk kesesuaian ke belakang.

14.2.3. Sintaks nft

Perintah nft memungkinkan memanipulasi tabel, rantai, dan aturan. Opsi table mendukung beberapa operasi: add, create, delete, list, dan flush. nft add table ip6 mangle menambahkan tabel baru dari keluarga ip6.
Untuk memasukkan rantai dasar baru ke tabel filter, Anda dapat mengeksekusi perintah berikut (perhatikan bahwa titik koma di-escape dengan garis miring terbalik saat menggunakan Bash):
# nft add chain filter input { type filter hook input priority 0 \; }
Aturan biasanya ditambahkan dengan sintaks berikut: nft add rule [family] table chain handle handle pernyataan .
insert mirip dengan perintah add, namun aturan yang diberikan ditambahkan ke awal rantai atau sebelum aturan dengan handle yang diberikan bukan pada akhir atau setelah aturan itu. Sebagai contoh, perintah berikut ini memasukkan aturan sebelum aturan dengan handler nomor 8:
# nft insert rule filter output position 8 ip daddr 127.0.0.8 drop
Perintah nft yang dieksekusi tidak membuat perubahan permanen untuk konfigurasi, sehingga mereka akan hilang jika mereka tidak disimpan. Aturan firewall terletak di /etc/nftables.conf. Sebuah cara sederhana untuk menyimpan konfigurasi firewall saat ini secara permanen adalah dengan mengeksekusi nft list ruleset > /etc/nftables.conf sebagai root.
nft memungkinkan lebih banyak operasi, lihat halaman manual nft(8) untuk informasi lebih lanjut.

14.2.4. Menginstal Aturan Pada Setiap Boot

Untuk mengaktifkan firewall baku di Debian, Anda perlu menyimpan aturan di /etc/nftables.conf dan mengeksekusi systemctl enable nftables.service sebagai root. Anda dapat menghentikan firewall dengan mengeksekusi nft flush ruleset sebagai root.
Dalam kasus lain, cara yang disarankan adalah mendaftarkan skrip konfigurasi dalam direktif up dari berkas /etc/network/interfaces. Pada contoh berikut, skrip disimpan di bawah /usr/local/etc/arrakis.fw.

Contoh 14.1. berkas interface yang memanggil skrip firewall

auto eth0
iface eth0 inet static
    address 192.168.0.1
    network 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255
    up /usr/local/etc/arrakis.fw
Ini jelas mengasumsikan bahwa Anda menggunakan ifupdown untuk mengkonfigurasi antarmuka jaringan. Jika Anda menggunakan sesuatu yang lain (seperti NetworkManager atau systemd-networkd), maka rujuklah ke dokumentasi mereka masing-masing untuk mengetahui cara menjalankan skrip setelah antarmuka telah dihidupkan.