Membangun pertahanan lapis luar server dengan firewall Linux: konsep packet filtering, praktik UFW di Debian/Ubuntu, zona Firewalld di RHEL/Rocky, hingga iptables/nftables tingkat rendah beserta jebakan yang mengunci kalian dari server sendiri.

Setelah di episode 18 sebelumnya kita membahas Remote Access Menggunakan SSH — mengamankan sshd_config, autentikasi kunci, dan tunnel — kalian sekarang bisa masuk ke server dengan aman. Tapi masuk dengan aman itu baru setengah jalan. Pertanyaan berikutnya: siapa lagi yang boleh mencoba masuk? Server kalian terbuka ke internet, dan setiap detik ada bot yang memindai port 22, 80, 443, 3389 — mencoba jutaan kombinasi password. Tanpa pertahanan, server kalian seperti rumah yang semua pintunya terbuka lebar dan mengandalkan kebaikan orang asing.
Di sinilah firewall berperan. Ia adalah penjaga gerbang yang memutuskan paket mana yang boleh masuk, keluar, atau diteruskan — berdasarkan aturan yang kalian tetapkan. Firewall bukan alat yang "sekali pasang lalu lupa": ia adalah kebijakan yang harus dirancang. Apa yang kalian buka? Dari sumber mana? Untuk tujuan mana? Jawaban atas pertanyaan-pertanyaan inilah yang membedakan server yang aman dari server yang bocor.
Di episode 19 ini, kita akan membahas tiga tool firewall yang mendominasi ekosistem Linux: UFW (Ubuntu/Debian), Firewalld (RHEL/Rocky), dan iptables/nftables sebagai fondasi tingkat rendah di balik semuanya. Kita akan membahas konsep packet filtering, mempraktikkan masing-masing tool, dan — sama pentingnya — menghindari jebakan klasik yang membuat kalian terkunci dari server sendiri.
Firewall Linux bekerja pada level paket. Setiap paket yang lewat diperiksa dan dibandingkan dengan aturan-aturan berurutan; aturan pertama yang cocok menentukan nasib paket: ACCEPT (izinkan), DROP (buang diam-diam), atau REJECT (tolak dengan balasan).
Ada tiga jalur utama (atau chains) yang wajib kalian hafal:
| Chain | Arah Trafik | Analogi |
|---|---|---|
| INPUT | Paket yang masuk ke mesin ini | Penjaga pintu masuk rumah |
| OUTPUT | Paket yang keluar dari mesin ini | Orang yang keluar rumah |
| FORWARD | Paket yang melewati mesin ini (routing) | Pos perbatasan kota transit |
Mengapa server butuh firewall, padahal layanannya hanya tiga atau empat port? Karena firewall menegakkan kebijakan default-deny: tutup semuanya, buka hanya yang dibutuhkan. Ini mengurangi permukaan serangan, memblokir port yang tidak dipakai, dan mempersempit dampak jika sebuah layanan diretas. Bot akan menemukan pintu yang sudah tertutup, bukan pintu yang menunggu.
Important
Aturan emas firewall: default-deny — tutup semua yang tidak eksplisit dibuka. Server dengan kebijakan "buka semua, tutup nanti kalau ada masalah" bukanlah server yang diamankan; ia hanya menunda bencana. Mulailah dari "semua tertutup", lalu buka port satu per satu dengan alasan.
UFW (Uncomplicated Firewall) dibangun di atas iptables/nftables, tapi menyembunyikan kompleksitas di balik sintaks yang mudah dibaca. Ia adalah pilihan utama di Ubuntu/Debian karena filosofinya: uncomplicated.
sudo ufw status verbosesudo ufw enablesudo ufw allow 22/tcpsudo ufw allow 80,443/tcpsudo ufw allow from 192.168.1.0/24 to any port 5432 proto tcpsudo ufw delete allow 80,443/tcpWarning
Jebakan nomor satu di dunia UFW: menjalankan ufw enable sebelum mengizinkan SSH. UFW mengaktifkan kebijakan default deny incoming, sehingga begitu kalian jalankan ufw enable, koneksi SSH kalian langsung terputus — dan kalian terkunci. Urutan yang benar: ufw allow 22/tcp dulu, baru ufw enable. Untuk menghindari drama, gunakan ufw enable sambil menjaga sesi SSH lain tetap terbuka sebagai jalur penyelamat.
Untuk layanan yang sudah dikenal, UFW punya nama layanan bawaan:
sudo ufw allow OpenSSH
sudo ufw allow 'Apache Full'
sudo ufw allow 'Nginx Full'sudo ufw status numberedOutput status numbered memperlihatkan nomor setiap aturan — berguna untuk menghapus aturan spesifik dengan sudo ufw delete <nomor>.
Firewalld adalah firewall default di keluarga RHEL (Rocky, AlmaLinux, CentOS Stream). Konsep intinya adalah zona — kumpulan aturan yang diterapkan berdasarkan kepercayaan jaringan. Default zone public untuk interface yang menghadap internet, dan internal/trusted untuk jaringan yang lebih dipercaya.
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --statesudo firewall-cmd --list-all-zonessudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-port=2222/tcpsudo firewall-cmd --reloadFlag firewall-cmd | Fungsi |
|---|---|
--permanent | Simpan aturan agar bertahan setelah reload/reboot |
--reload | Terapkan aturan permanen tanpa memutus koneksi |
--add-service | Izinkan layanan bernama (http, https, ssh) |
--add-port | Izinkan port+protokol mentah (80/tcp) |
--add-source | Izinkan seluruh trafik dari IP/netmask tertentu |
--runtime-to-permanent | Jadikan aturan runtime saat ini menjadi permanen |
Warning
Jebakan klasik Firewalld: menambah aturan tanpa --permanent, lalu menjalankan --reload. Aturan runtime akan hilang begitu reload — kalian mengira firewall sudah dibuka, padahal tidak. Aturan baku: hampir selalu pakai --permanent, lalu --reload. Dan ingat, urutan di atas: buka SSH dulu, baru mengubah zona atau default policy.
Mengubah zona interface dan menambahkan zona baru:
sudo firewall-cmd --permanent --zone=internal --change-interface=eth1sudo firewall-cmd --permanent --zone=internal --add-service=postgresql
sudo firewall-cmd --permanent --zone=internal --add-source=192.168.50.0/24sudo ufw status verbose
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enablesudo ufw allow from 192.168.50.0/24 to any port 5432 proto tcpKedua tool menjawab pertanyaan yang sama — siapa boleh mengakses apa — dengan gaya berbeda. UFW sederhana dan flat; Firewalld berbasis zona sehingga lebih cocok untuk server dengan banyak interface dan tingkat kepercayaan berbeda. Pilih sesuai ekosistem distro kalian.
UFW dan Firewalld hanyalah frontend. Mesin yang sebenarnya bekerja adalah netfilter di dalam kernel, yang dikendalikan lewat iptables (legacy) atau nftables (pengganti modern). Memahami ini penting karena: (1) terkadang kalian harus berurusan langsung dengan aturan mentah, dan (2) debugging aturan yang "aneh" dari UFW/Firewalld selalu berujung di sini.
Konfigurasi iptables dibagi ke dalam tables (filter, nat, mangle) dan chains (INPUT, OUTPUT, FORWARD). Kebanyakan tugas sehari-hari hanya menyentuh table filter.
sudo iptables -L -n -vsudo iptables -A INPUT -p tcp --dport 22 -j ACCEPTsudo iptables -A INPUT -s 203.0.113.0/24 -j DROPsudo iptables-save > /etc/iptables/rules.v4Aturan individual itu penting, tapi yang lebih menentukan adalah kebijakan default — apa yang dilakukan firewall terhadap paket yang tidak cocok dengan aturan mana pun. -P menetapkan policy default pada sebuah chain:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPTAturan di atas menyatakan: buang semua paket masuk yang tidak eksplisit diizinkan, tapi biarkan trafik keluar tetap mengalir. Inilah esensi default-deny yang dibahas di awal episode — dengan -P, kalian menerapkannya sebagai kebijakan sistem, bukan sekadar kumpulan aturan.
Caution
Mengubah -P INPUT DROP sementara belum ada aturan ACCEPT untuk port SSH kalian = sesi terputus dan terkunci. Urutan yang aman: tambahkan -A INPUT ... --dport 22 -j ACCEPT dulu, konfirmasi aturannya terlihat di iptables -L -n, baru ubah policy default. Dan jangan lupa iptables-save setelahnya — policy yang tidak disimpan akan hilang saat reboot (dan bisa memutus koneksi kalian lagi di waktu yang paling tidak tepat).
Masquerade (NAT): untuk membuat mesin ini menjadi router/NAT bagi subnet internal, kalian butuh table nat — konsep yang sangat berguna ketika episode 21 membahas routing dan network namespaces:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE| Opsi iptables | Fungsi |
|---|---|
-A | Append (tambahkan aturan di akhir chain) |
-I | Insert (sisipkan aturan di posisi awal chain) |
-D | Delete (hapus aturan) |
-s | Sumber IP/netmask |
-d | Tujuan IP |
-p | Protokol (tcp, udp, icmp) |
--dport | Port tujuan |
-j | Aksi (ACCEPT, DROP, REJECT) |
-L -n -v | List aturan, tanpa resolusi nama, verbose |
Setiap perintah iptables hanya mengubah konfigurasi runtime. Kalian melihat aturan dengan iptables -L, menambahkan dengan -A, lalu menyimpan dengan iptables-save. Tanpa penyimpanan, semua hilang saat reboot.
Tip
-n sangat penting saat debug: tanpa -n, iptables mencoba resolve IP ke hostname — lambat dan bisa menampilkan hasil yang menyesatkan. Biasakan iptables -L -n -v selalu. Dan urutan aturan penting: iptables memproses dari atas ke bawah, aturan pertama yang cocok menang. Aturan -D yang spesifik harus datang sebelum aturan -A yang umum.
nftables adalah penerus iptables — sintaks yang lebih konsisten dan satu framework untuk semua tabel. Distro baru sudah menjadikannya default (yang dipakai UFW di Ubuntu modern):
sudo nft list rulesetnft add table inet filter
nft add chain inet filter input { type filter hook input priority 0; policy drop; }
nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input ip saddr 203.0.113.0/24 dropAturan di atas membentuk kebijakan default-deny: semua paket masuk di-drop kecuali SSH (tcp dport 22 accept) dan sumber-sumber tertentu yang diizinkan.
Setelah menyusun aturan, jangan berhenti di situ. Verifikasi dari perspektif jaringan — persis seperti yang kalian pelajari di episode 17:
sudo ss -tulpn | grep -E ":(22|80|443)"nc -zv 192.168.1.10 22
curl -v https://192.168.1.10nc (netcat) dan curl memberi jawaban jujur dari sisi klien: apakah port benar-benar bisa dijangkau dari luar, melewati semua lapisan firewall. Jika nc sukses tapi curl gagal, masalahnya bukan di firewall — melainkan di layanan atau aplikasinya (pelajaran episode 17 dan 18).
1. ufw enable tanpa membuka SSH dulu. Terkunci dari server sendiri. Urutan: allow 22/tcp → enable.
2. firewall-cmd tanpa --permanent lalu --reload. Aturan hilang seketika. Selalu --permanent + --reload.
3. Kebijakan default DROP yang mengunci kalian. Mengubah policy INPUT ke DROP tanpa aturan ACCEPT untuk SSH = keputusan yang menyesal kemudian. Ubah policy hanya setelah seluruh layanan kritis sudah diizinkan.
4. Membuka port SSH di firewall tapi lupa mengubah port sshd (atau sebaliknya). Kalian mengubah Port 2222 di sshd (episode 18) tapi firewall hanya membuka 22 — koneksi langsung ditolak. Selalu sinkronkan dua lapisan ini.
5. iptables tanpa iptables-save. Aturan runtime lenyap saat reboot. Atau sebaliknya — kalian menambahkan aturan dengan -A setelah aturan yang lebih umum, sehingga aturan baru tidak pernah terpakai karena yang umum sudah menang lebih dulu.
6. Menguji firewall hanya dari localhost. Uji dari mesin lain. Firewall bisa tampak benar di dalam server, tapi trafik nyata datang dari luar. Gunakan nc -zv dari klien eksternal.
Pada episode 19 ini, kalian telah membangun pertahanan lapis luar server: memahami konsep packet filtering (ACCEPT/DROP/REJECT, chain INPUT/OUTPUT/FORWARD), mempraktikkan UFW di Debian/Ubuntu dengan kebijakan default-deny, mengelola Firewalld di RHEL/Rocky dengan zona dan --permanent/--reload, serta membongkar iptables/nftables sebagai mesin di balik semua frontend.
Poin kunci yang perlu kalian bawa pulang:
allow dulu, baru enable. Firewalld: --permanent dulu, baru --reload.iptables-save untuk persistensi.nc -zv, curl) — bukan hanya dari dalam server.Di episode 20 selanjutnya kita akan berbagi file antar mesin lewat topik Network File Sharing (NFS & Samba) & DNS Basics. Kalian akan belajar memasang NFS server, membagikan folder antar server Linux, menyiapkan share Samba untuk klien Windows/macOS, serta memahami dasar-dasar DNS dari /etc/hosts hingga systemd-resolved. Sampai jumpa!