Menulis aturan firewall langsung di nftables memberi kendali penuh, tetapi sintaksnya panjang dan satu kesalahan kecil bisa membuat kita terkunci di luar server sendiri. Dua frontend paling populer lahir untuk itu: ufw (uncomplicated firewall) di keluarga Ubuntu dan Debian, serta firewalld di keluarga Red Hat dan Fedora. Keduanya menerjemahkan perintah yang ramah manusia menjadi aturan netfilter — konsep chain, policy, dan connection tracking dari Chapter Firewall
tetap berlaku di belakangnya. Mesin latihan kita tidak memasang kedua alat itu, jadi aturan kita latih lewat file teks sementara perintah aslinya ditampilkan sebagai panduan lengkap dengan struktur output yang khas.
ufw: Kebijakan dalam Satu Baris #
ufw dirancang untuk satu tujuan: membuat firewall yang layak dalam lima menit. Titik awalnya selalu dua kebijakan bawaan — menolak semua koneksi masuk, membebaskan semua koneksi keluar — lalu membuka port satu per satu hanya yang benar-benar dipakai:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enableMari kita baca keenam perintah itu:
default deny incoming: kebijakan bawaan chain INPUT menjadi DROP — filosofi default-deny dari chapter sebelumnya, dipasang sekali untuk selamanya.default allow outgoing: chain OUTPUT tetap ACCEPT, sehingga pembaruan sistem dan browsing keluar bebas; balasannya diurus connection tracking.limit ssh: membuka SSH dengan rem — lebih dari enam koneksi baru dalam 30 detik dari satu alamat akan ditolak. Ini penghubung langsung ke perang melawan brute force pada Chapter SSH Hardening .allow 80/tcpdanallow 443/tcp: dua pintu web server; klasik, satu baris per pintu.enable: menyalakan semuanya. Sebelum perintah ini, semua kebijakan tadi hanya proposal yang belum bekerja.
Nama Service dan Angka Port #
Perintah ufw limit ssh memakai nama, bukan angka. Padanannya dicari oleh ufw di file /etc/services — kamus yang sama yang kita pakai untuk menulis aturan manual:
grep -E '^(ssh|http|https)[[:space:]]' /etc/servicesOutput yang Dihasilkan:
ssh 22/tcp # SSH Remote Login Protocol
http 80/tcp www # WorldWideWeb HTTP
https 443/tcp # http protocol over TLS/SSL
https 443/udp # HTTP/3Dua hal layak dibaca dari kamus ini. Baris http memiliki alias www, dan https terdaftar dua kali — 443/tcp untuk koneksi klasik serta 443/udp untuk HTTP/3 di atas QUIC — sehingga web server modern lazim membuka keduanya: sudo ufw allow 443. Aturan dengan nama seperti ini terbaca jelas saat diaudit berbulan-bulan kemudian; angka port memang tetap sah, tetapi nama membuat maksudnya awet.
Membaca Hasil: ufw status #
Seluruh kebijakan aktif dirangkum satu perintah. Berikut contoh tampilan sudo ufw status verbose pada server web yang baru dikunci:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp LIMIT IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN AnywhereEmpat baris pertama merangkum kebijakan bawaan — perhatikan deny (incoming) dan allow (outgoing) persis seperti yang kita pasang — lalu tabelnya mendaftar aturan per port beserta aksinya: LIMIT IN untuk SSH yang direm, ALLOW IN untuk dua pintu web. Menghapus aturan semudah sudo ufw delete allow 80/tcp; daftar bernomor dari ufw status numbered membantu saat aturannya sudah banyak.
Melatih Aturan sebagai File Teks #
ufw menyimpan aturan yang sudah dikompilasi di /etc/ufw/user.rules berisi sintaks netfilter — file itu tidak ada di mesin latihan kita karena ufw memang tidak terpasang. Karena itu kita latih daftar aturannya sebagai file teks yang strukturnya meniru perintah-perintah di atas, satu aturan per baris:
printf 'limit ssh\nallow 80/tcp\nallow 443/tcp\ndeny 23/tcp\n' > latihan-aturan-ufw.txt
cat latihan-aturan-ufw.txtOutput yang Dihasilkan:
limit ssh
allow 80/tcp
allow 443/tcp
deny 23/tcpBaris deny 23/tcp adalah penolakan eksplisit untuk telnet — protokol lawas yang mengirim password sebagai teks polos. Karena kebijakan bawaan kita memang sudah menolak semua yang tak dizinkan, baris ini sebenarnya mubazir; ia dipertahankan di sini justru untuk melatih cara membaca aksi DENY. Sekarang kita terjemahkan daftar itu menjadi tabel ringkasan seperti ufw status:
printf 'limit ssh\nallow 80/tcp\nallow 443/tcp\ndeny 23/tcp\n' > latihan-aturan-ufw.txt
while read -r aksi target _; do
case "$aksi" in
allow) ket="ALLOW" ;;
limit) ket="LIMIT" ;;
deny) ket="DENY" ;;
esac
printf '%-10s %-8s %s\n' "$target" "$ket" "Anywhere"
done < latihan-aturan-ufw.txtOutput yang Dihasilkan:
ssh LIMIT Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
23/tcp DENY AnywhereMari kita bedah loop di atas:
- Baris 1 (
printf ... > latihan-aturan-ufw.txt): menulis ulang file latihan di awal blok — setiap blok latihan kita memang dirancang mandiri, jadi dijalankan dari mana pun hasilnya sama. - Baris 2 (
while read -r aksi target _): membaca satu baris aturan, memecahnya menjadi dua kolom pertama; variabel ketiga_menampung sisa baris bila ada. - Baris 3-7 (
case "$aksi" ...): menerjemahkan kata kerja perintah menjadi label aksi — persis kolomActionpada ufw status. - Baris 8 (
printf '%-10s %-8s %s\n'): mencetak target, aksi, dan sumberAnywheredengan lebar tetap agar kolomnya lurus meniru tabel aslinya.
firewalld: Zona sebagai Grup Kebijakan #
firewalld memikirkan kebijakan dengan satuan yang lebih besar: zone — paket kebijakan siap pakai untuk satu jenis lingkungan. Setiap interface network ditugaskan ke satu zona, dan zona-lah yang menentukan service mana yang terbuka. Zona bawaannya bernama public, dan pilihan yang paling sering kita temui:
| Zona | Sikap terhadap paket masuk | Kapan dipakai |
|---|---|---|
| drop | dibuang tanpa jawaban | mesin yang hanya butuh keluar |
| block | ditolak dengan pesan | sama, tapi pengirim diberi tahu |
| public | service terpilih saja | wifi kafe, default server |
| home, internal | tambahan untuk LAN | rumah atau jaringan kantor |
| trusted | semuanya diterima | jaringan yang benar-benar dipercaya |
Pekerjaan sehari-hari dengan firewalld berpusat pada firewall-cmd:
sudo firewall-cmd --state
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-allPerintah --get-active-zones menjawab interface mana duduk di zona mana, dua --add-service membuka web server di zona bawaan, dan --list-all merangkum hasil akhirnya. Berikut contoh tampilan perintah terakhir itu:
public (active)
target: default
interfaces: enp3s0
sources:
services: cockpit dhcpv6-client http https ssh
ports:
protocols:
masquerade: no
forward-ports:
rich rules:Baris services adalah daftar pintu yang terbuka — nama service, bukan angka, semuanya diterjemahkan dari kamus /etc/services tadi.
Zona sebagai File XML #
Setiap zona pada firewalld tersimpan sebagai file XML di bawah /etc/firewalld/zones/ — dan inilah wujud public setelah dua service web kita buka. Kita tulis versi latihannya:
mkdir -p firewalld/zones
printf '<?xml version="1.0" encoding="utf-8"?>\n<zone>\n <short>Public</short>\n <description>Untuk dipakai di area publik.</description>\n <service name="ssh"/>\n <service name="http"/>\n <service name="https"/>\n</zone>\n' > firewalld/zones/public.xml
cat firewalld/zones/public.xmlOutput yang Dihasilkan:
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>Untuk dipakai di area publik.</description>
<service name="ssh"/>
<service name="http"/>
<service name="https"/>
</zone>Tag <service name="..."/> adalah satu pintu terbuka per tag — persis daftar yang tampil pada baris services di --list-all. Membaca file ini memberi kita audit statis: zona apa saja yang ada dan service apa saja yang dibukanya, tanpa menyalakan mesin. Untuk aturan yang lebih selektif daripada “service ini terbuka untuk semua”, firewalld menyediakan rich rule, misalnya membuka HTTP hanya untuk satu subnet: sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" service name="http" accept'.
Dua Frontend, Satu Backend #
ufw dan firewalld tampak berbeda di permukaan, tetapi keduanya menulis ke tempat yang sama: ruleset nftables di kernel. Aturan apa pun yang kita pasang lewat ufw allow atau firewall-cmd --add-service bisa dilihat bentuk akhirnya dengan nft list ruleset — dan sebaliknya, mengedit ruleset itu dengan tangan sementara frontend aktif hanya akan membuat dua lapis aturan saling tidak sadar. Pilih satu pintu kendali per mesin. Bila suatu saat kita membutuhkan kemampuan yang tidak tersedia di kedua frontend ini — table nat, set alamat besar, atau aturan berbasis waktu — saat itulah kita turun satu tingkat ke bahasa aslinya: nftables, chapter berikutnya.
Referensi lanjut: dokumentasi server Ubuntu tentang firewall untuk panduan ufw resmi, ufw(8) untuk daftar lengkap perintahnya, serta dokumentasi firewalld di Fedora untuk contoh zona dan rich rule.