Bismillah,

Ini adalah lanjutan dari tulisan saya yang kedua tentang nftables.

Sebuah Firewall yang baik, memiliki 3 (tiga) kriteria utama, yaitu:

  • Koneksi dibatasi hanya dari negara tertentu
  • Mampu mencegah reverse telnet
  • Mampu mencegah DDOS

Pada tulisan bagian ketiga ini, akan saya tampilkan contoh pembatasan koneksi hanya dari IP yang berasal dari Indonesia. Serangan terhadap webserver bisa datang dari negara mana saja, sehingga dengan membatasi koneksi/akses hanya dari IP Indonesia, telah mengurangi peluang server kita di rusak oleh pihak asing.

Daftar IP yang berasal dari Indonesia saya dapatkan dari website https://www.ipdeny.com/ yaitu file id.zone

Nah, inilah file /etc/nftables.conf nya.

Wah-wah, filenya panjang sekali ya…he…he… (senyum) yah itulah karena file ini menampung hasil data IP dari file id.zone ini.

Saya akan menjelaskan beberapa baris perintah yang saya anggap penting untuk di jelaskan, dan kalau di perlukan, silahkan merujuk pada tulisan saya bagian pertama dan kedua.

	set ip_indonesia {
		type ipv4_addr
		flags interval
		auto-merge
		elements = {

Pendefinisian IP yang berasal dari Indonesia

	chain INPUT {
		type filter hook input priority 0; policy drop;
		ct state established,related accept
		iifname $lo_if accept
		ip saddr @ip_indonesia tcp dport { ssh, http } ct state new accept
		drop
	}

Chain input, rinciannya sebagai berikut:

type filter hook input priority 0; policy drop;

Default Deny, blok semua koneksi masuk secara default

ct state established,related accept

Terima Koneksi balasan yang berasal dari dalam

iifname $lo_if accept

Izinkan localhost

ip saddr @ip_indonesia tcp dport { ssh, http } ct state new accept

Izinkan akses ke port 22 dan port 80 hanya dari IP yang berasal dari Indonesia.

drop

Blok semua IP lainnya.

NFTables ini memiliki prinsip The first rule to match is the “winner”, yaitu perintah pertama yang sesuai, itu yang akan langsung di jalankan, sehingga kita tempatkan perintah drop pada bagian paling bawah, yang berarti semua yang tidak sesuai rule di atas nya akan di blok.

Kalau kita tempatkan perintah drop di atas, maka semua koneksi di blok dan NFTables tidak membaca lagi rule di bawah nya.

Dari Contoh Di atas, saat IP berasal dari Indonesia, maka akan sesuai dengan rule:

ip saddr @ip_indonesia tcp dport { ssh, http } ct state new accept

maka IP Indonesia di izinkan, sedangkan seluruh IP lain, tidak match dengan rule tersebut, sehingga terkena rule drop.

	chain OUTPUT {
		type filter hook output priority 0; policy drop;
		ct state established,related accept
		oifname $lo_if accept
		ip daddr @ip_output accept
		drop
	}

Untuk chain output, secara ringkas bahwa semua koneksi ke seluruh IP di tolak, kecuali IP yang di definisikan di kolom ip_output.

Untuk daftar IP yang masuk ke <@ip_output> maka di contoh ini saya masukkan IP DNS Google, IP localhost, IP deb.debian.org dan IP securty.debian.org

Secara detailnya, sebagai berikut:

type filter hook output priority 0; policy drop;

Default Deny, Blok semua koneksi keluar. Fitur ini untuk mencegah serangan reverse ssh.

ct state established,related accept

Ini untuk koneksi dari luar, saat ada paket balasan dari dalam, maka paket balasan tersebut perlu izin keluar, padahal semua koneksi secara default kita blok, sehingga perlu rule ini. Dengan rule ini, paket balasan dari dalam untuk koneksi awal dari luar bisa lewat.

Ini lah bedanya dengan fitur keep state pada OpenBSD PF, yang mana pada fitur itu, koneksi balasan langsung bisa melewati firewall tanpa mendefinisikan secara tersendiri di rule output.

oifname $lo_if accept

Izinkan akses keluar menuju IP yang ada di interface lo.

ip daddr @ip_output accept

Izinkan koneksi keluar, dari dalam, menuju daftar IP di table ip_output. Hal ini akan saya coba jelaskan di tulisan berikutnya tentang NFTables, InsyaAllah.

drop

Semua koneksi lain di blok.

Nah, sekian dulu dari saya, semoga bisa di lanjutkan ke tingkat yang lebih tinggi dan semoga bermanfaat, aamiin.

Alhamdulillah

Daftar Pustaka