Pengantar Firewalld: Manajemen Firewall Dinamis di Linux
Firewalld adalah daemon manajemen firewall userspace untuk Linux yang menyediakan antarmuka berbasis zona yang dinamis di atas backend pemfilteran paket tingkat kernel iptables dan nftables. Tidak seperti alat firewall statis yang memerlukan restart layanan penuh untuk menerapkan perubahan aturan, Firewalld memodifikasi aturan netfilter secara langsung — mempertahankan sesi TCP aktif dan menghilangkan downtime selama pembaruan kebijakan.
Panduan ini mencakup setiap lapisan operasional Firewalld: model arsitekturalnya, abstraksi zona dan layanan, rich rules, konfigurasi runtime versus permanen, dan perintah-perintah yang tepat yang Anda butuhkan untuk mengelola server produksi dengan aman.
Mengapa Firewalld Menggantikan Alur Kerja iptables Statis
Manajemen iptables tradisional berarti menulis aturan ke dalam skrip shell atau file konfigurasi datar, kemudian menghapus dan memuat ulang seluruh ruleset setiap kali perubahan diperlukan. Pada server yang sibuk, siklus flush-and-reload tersebut memutus koneksi yang sedang berjalan dan memperkenalkan jendela singkat di mana tidak ada pemfilteran yang aktif.
Firewalld mengatasi hal ini melalui daemon yang diaktifkan D-Bus (firewalld) yang menyimpan status aturan yang otoritatif dan mengomunikasikan perubahan ke kernel secara bertahap. Hasilnya adalah pembaruan aturan atomik tanpa gangguan koneksi — kritis untuk server mana pun yang menjalankan beban kerja persisten seperti database, terowongan VPN, atau koneksi API yang berumur panjang.
Ketika Anda menyediakan lingkungan VPS Hosting dan perlu mengamankannya tanpa reboot atau menginterupsi layanan, Firewalld adalah pilihan operasional yang alami pada distribusi keluarga RHEL dan banyak distribusi keluarga Debian.
Arsitektur Inti: Bagaimana Firewalld Berinteraksi dengan Kernel
Memahami tumpukan di bawah Firewalld mencegah kesalahan konfigurasi dan membantu Anda men-debug perilaku yang tidak terduga.
User Space
┌─────────────────────────────────────────────┐
│ firewall-cmd / firewall-config / D-Bus API │
└────────────────────┬────────────────────────┘
│ D-Bus
┌────────────────────▼────────────────────────┐
│ firewalld daemon │
│ (zone engine, service definitions, rich │
│ rule parser, direct rule passthrough) │
└────────────────────┬────────────────────────┘
│ nftables / iptables backend
Kernel Space
┌────────────────────▼────────────────────────┐
│ netfilter (kernel module) │
└─────────────────────────────────────────────┘Sejak RHEL 8 dan Fedora 32, Firewalld menggunakan backend nftables secara default. Pada sistem yang lebih lama atau lingkungan yang dikonfigurasi secara eksplisit, ia menggunakan backend iptables. Anda dapat memeriksa atau mengganti backend aktif di /etc/firewalld/firewalld.conf melalui direktif FirewallBackend.
Jebakan kritis: Jangan pernah mencampur perintah iptables atau nft langsung dengan Firewalld pada antarmuka yang sama. Firewalld memiliki tabel netfilter yang dibuatnya; aturan manual yang dimasukkan di luar daemon akan ditimpa secara diam-diam pada reload berikutnya.
Konsep Utama dalam Firewalld
Zona
Sebuah zona adalah tingkat kepercayaan bernama yang diterapkan pada antarmuka jaringan atau rentang alamat sumber. Setiap paket yang memasuki sistem dicocokkan dengan zona yang ditetapkan pada antarmuka masuknya, dan ruleset zona menentukan apa yang diizinkan.
Firewalld dilengkapi dengan zona yang telah ditentukan sebelumnya berikut ini, diurutkan dari yang paling hingga paling tidak permisif:
| Zona | Kebijakan Default | Kasus Penggunaan Umum |
|---|---|---|
| — | — | — |
| `trusted` | Terima semua | Jaringan lab internal, loopback |
| `home` | Tolak, layanan tertentu diizinkan | LAN rumah dengan perangkat yang dikenal |
| `internal` | Tolak, layanan tertentu diizinkan | Segmen jaringan korporat internal |
| `work` | Tolak, layanan tertentu diizinkan | Jaringan kantor, kepercayaan sedang |
| `public` | Tolak, SSH/DHCPv6 diizinkan | Antarmuka yang menghadap internet |
| `external` | Tolak, masquerade diaktifkan | Kaki eksternal router/gateway NAT |
| `dmz` | Tolak, SSH diizinkan | Server zona demiliterisasi |
| `block` | Tolak dengan ICMP admin-prohibited | Penolakan eksplisit dengan respons |
| `drop` | Drop secara diam-diam | Sumber berbahaya, stealth maksimum |
Nuansa arsitektur: Sebuah zona dapat diikat ke antarmuka jaringan (misalnya, eth0) atau ke sumber CIDR (misalnya, 192.168.1.0/24). Pengikatan berbasis sumber lebih diutamakan daripada pengikatan berbasis antarmuka, yang memungkinkan Anda menerapkan kebijakan berbeda pada lalu lintas yang tiba di antarmuka fisik yang sama dari subnet yang berbeda — pola yang umum dalam lingkungan multi-tenant atau terkontainerisasi.
Layanan
Sebuah layanan dalam Firewalld adalah file definisi XML yang disimpan di bawah /usr/lib/firewalld/services/ (default sistem) atau /etc/firewalld/services/ (penggantian pengguna). Setiap file mendeklarasikan port, protokol, dan modul helper opsional yang diperlukan untuk aplikasi bernama.
Misalnya, definisi layanan https membuka port TCP 443 dan tidak memuat helper kernel tambahan. Layanan ftp membuka port TCP 21 dan memuat helper nf_conntrack_ftp untuk menangani negosiasi port dinamis saluran data FTP.
Menggunakan nama layanan alih-alih nomor port mentah membuat kebijakan firewall Anda terdokumentasi sendiri dan mengurangi risiko kesalahan ketik yang membiarkan port terbuka atau tertutup secara tidak sengaja.
Untuk mencantumkan semua definisi layanan yang tersedia di sistem Anda:
firewall-cmd --get-servicesUntuk memeriksa definisi XML dari layanan tertentu:
cat /usr/lib/firewalld/services/https.xmlRich Rules
Rich rules memperluas model zona dengan logika kondisional yang tidak dapat diekspresikan oleh abstraksi layanan/port sederhana. Mereka mendukung pencocokan pada alamat sumber dan tujuan, rentang port, protokol, jendela waktu, dan status koneksi, serta dapat memicu tindakan termasuk accept, drop, reject, log, dan audit.
Sintaks rich rule mengikuti tata bahasa terstruktur:
rule [family="ipv4|ipv6"]
[source address="addr[/mask]" [invert="true"]]
[destination address="addr[/mask]" [invert="true"]]
[service name="service-name"] | [port port="port" protocol="tcp|udp"]
[log [prefix="prefix"] [level="level"] [limit value="rate/duration"]]
[audit]
[accept|drop|reject [type="reject-type"]]Contoh praktis — batasi upaya login SSH menjadi 3 per menit dari satu sumber IPv4 mana pun, kemudian catat dan drop kelebihannya:
firewall-cmd --zone=public --add-rich-rule='
rule family="ipv4"
service name="ssh"
log prefix="SSH_RATELIMIT " level="warning" limit value="3/m"
accept' --permanentfirewall-cmd --zone=public --add-rich-rule='
rule family="ipv4"
service name="ssh"
drop' --permanentKasus tepi: Urutan rich rule penting. Firewalld mengevaluasi rich rule sesuai urutan penambahannya dalam zona. Jika Anda menambahkan aturan drop yang luas sebelum aturan accept yang spesifik, accept tidak akan pernah tercapai. Selalu tambahkan aturan yang lebih spesifik terlebih dahulu.
Konfigurasi Runtime vs. Permanen
Ini adalah perbedaan yang paling penting secara operasional dalam Firewalld dan sumber kesalahan produksi yang paling umum.
| Dimensi | Runtime | Permanen |
|---|---|---|
| — | — | — |
| Lokasi penyimpanan | Di memori (status daemon) | File XML `/etc/firewalld/` |
| Kapan diterapkan | Segera | Setelah `–reload` atau reboot |
| Bertahan setelah reboot | Tidak | Ya |
| Aman untuk diuji | Ya | Memerlukan reload untuk verifikasi |
| Risiko | Hilang saat restart | Bertahan setelah reboot |
Alur kerja praktik terbaik untuk perubahan produksi:
- Terapkan aturan hanya pada runtime (tanpa flag
--permanent) dan verifikasi bahwa aturan tersebut berperilaku sesuai harapan. - Jika benar, terapkan aturan yang sama dengan
--permanentuntuk menulisnya ke disk. - Jalankan
firewall-cmd --reloaduntuk menyinkronkan konfigurasi permanen ke status runtime dan konfirmasi paritas.
Alur kerja ini mencegah skenario klasik di mana administrator menambahkan aturan --permanent, memuat ulang, dan menemukan diri mereka terkunci dari SSH — karena pengujian runtime akan mengungkapkan masalah sebelum menjadi permanen.
Menginstal dan Mengaktifkan Firewalld
Firewalld diinstal secara default pada RHEL, CentOS Stream, Fedora, AlmaLinux, dan Rocky Linux. Pada Debian dan Ubuntu, firewalld harus diinstal secara eksplisit.
RHEL / CentOS Stream / AlmaLinux / Rocky Linux:
sudo dnf install firewalldDebian / Ubuntu:
sudo apt-get update && sudo apt-get install firewalldCatatan untuk pengguna Ubuntu: Jika ufw aktif, nonaktifkan sebelum mengaktifkan Firewalld untuk menghindari konflik aturan netfilter:
sudo ufw disable
sudo systemctl disable ufwMulai dan aktifkan daemon:
sudo systemctl start firewalld
sudo systemctl enable firewalldVerifikasi daemon berjalan dan backend kernel aktif:
sudo firewall-cmd --state
sudo firewall-cmd --info-zone=publicPerintah Firewalld yang Penting
Periksa Status Saat Ini
Periksa status daemon:
sudo firewall-cmd --stateDaftarkan semua zona aktif dengan antarmuka dan sumber yang ditetapkan:
sudo firewall-cmd --get-active-zonesTampilkan ruleset lengkap untuk zona tertentu:
sudo firewall-cmd --zone=public --list-allTampilkan ruleset lengkap untuk semua zona secara bersamaan:
sudo firewall-cmd --list-all-zonesKelola Zona Default
Zona default diterapkan pada antarmuka mana pun yang tidak secara eksplisit ditetapkan ke zona lain:
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --set-default-zone=publicTetapkan Antarmuka ke Zona
sudo firewall-cmd --zone=internal --change-interface=eth1 --permanent
sudo firewall-cmd --reloadJebakan: Pada sistem yang menggunakan NetworkManager, penetapan antarmuka-ke-zona yang dilakukan melalui firewall-cmd dapat ditimpa oleh profil koneksi NetworkManager saat reconnect. Tetapkan zona secara persisten dalam koneksi NetworkManager:
nmcli connection modify "Wired connection 1" connection.zone internalTambah dan Hapus Layanan
Izinkan HTTP di zona publik pada runtime:
sudo firewall-cmd --zone=public --add-service=httpJadikan permanen:
sudo firewall-cmd --zone=public --add-service=http --permanentHapus layanan:
sudo firewall-cmd --zone=public --remove-service=http --permanentBuka dan Tutup Port Tertentu
Buka port TCP 8080 pada runtime:
sudo firewall-cmd --zone=public --add-port=8080/tcpBuka rentang port UDP secara permanen:
sudo firewall-cmd --zone=public --add-port=60000-61000/udp --permanentHapus port:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanentAllowlisting dan Blocklisting Alamat IP
Izinkan semua lalu lintas dari subnet manajemen yang tepercaya:
sudo firewall-cmd --zone=trusted --add-source=10.0.0.0/24 --permanentBlokir semua lalu lintas dari IP tertentu (drop berbasis sumber):
sudo firewall-cmd --zone=drop --add-source=203.0.113.45/32 --permanentPenerusan Port
Teruskan port TCP eksternal 2222 ke port SSH internal 22 (berguna untuk menyembunyikan port SSH default tanpa mengubah sshd_config):
sudo firewall-cmd --zone=public --add-forward-port=port=2222:proto=tcp:toport=22 --permanent
sudo firewall-cmd --reloadIP Masquerading (NAT)
Aktifkan masquerade pada zona eksternal untuk memungkinkan VPS yang bertindak sebagai gateway melakukan NAT lalu lintas dari subnet privat:
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reloadMuat Ulang dan Sinkronkan Konfigurasi
Terapkan semua perubahan permanen ke status yang berjalan tanpa memutus koneksi:
sudo firewall-cmd --reloadLakukan restart penuh (memutus semua koneksi — gunakan hanya dalam keadaan darurat):
sudo systemctl restart firewalldMembuat Zona dan Definisi Layanan Kustom
Zona Kustom
sudo firewall-cmd --new-zone=management --permanent
sudo firewall-cmd --zone=management --add-source=10.10.0.0/16 --permanent
sudo firewall-cmd --zone=management --add-service=ssh --permanent
sudo firewall-cmd --zone=management --add-service=cockpit --permanent
sudo firewall-cmd --reloadDefinisi Layanan Kustom
Buat file layanan untuk aplikasi kustom yang mendengarkan pada TCP 9200 (misalnya, Elasticsearch):
sudo nano /etc/firewalld/services/elasticsearch.xml<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Elasticsearch</short>
<description>Elasticsearch HTTP API and transport port</description>
<port protocol="tcp" port="9200"/>
<port protocol="tcp" port="9300"/>
</service>sudo firewall-cmd --reload
sudo firewall-cmd --zone=internal --add-service=elasticsearch --permanent
sudo firewall-cmd --reloadFirewalld vs. Alternatif: Memilih Alat yang Tepat
| Fitur | Firewalld | UFW | iptables (langsung) | nftables (langsung) |
|---|---|---|---|---|
| — | — | — | — | — |
| Pembaruan aturan dinamis | Ya | Tidak (memerlukan reload) | Tidak | Tidak |
| Model berbasis zona | Ya | Tidak | Tidak | Tidak |
| Integrasi D-Bus / API | Ya | Tidak | Tidak | Tidak |
| Rich rule / logika kondisional | Ya | Terbatas | Ya | Ya |
| Default pada keluarga RHEL | Ya | Tidak | Lama | Ya (backend) |
| Default pada Ubuntu | Tidak | Ya | Lama | Ya (backend) |
| Kurva pembelajaran | Sedang | Rendah | Tinggi | Tinggi |
| Cocok untuk scripting | Ya | Ya | Ya | Ya |
| Alat manajemen GUI | Ya (firewall-config) | Tidak | Tidak | Tidak |
Untuk tim yang mengelola Dedicated Servers dalam skala besar, API D-Bus Firewalld memungkinkan manajemen aturan secara terprogram dari alat manajemen konfigurasi seperti Ansible (modul ansible.posix.firewalld) atau Puppet, yang merupakan keunggulan operasional yang signifikan dibandingkan mempertahankan skrip iptables mentah.
Pola Penguatan Keamanan Praktis
Mengamankan Server Web
Konfigurasi umum untuk server yang menjalankan HTTPS dengan SSH dibatasi ke IP manajemen:
# Set the default zone
sudo firewall-cmd --set-default-zone=public --permanent
# Allow HTTPS globally
sudo firewall-cmd --zone=public --add-service=https --permanent
# Allow HTTP only to redirect to HTTPS (optional)
sudo firewall-cmd --zone=public --add-service=http --permanent
# Restrict SSH to a specific management IP only
sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --zone=public --add-rich-rule='
rule family="ipv4"
service name="ssh"
source address="198.51.100.10/32"
accept' --permanent
sudo firewall-cmd --reloadJika Anda menjalankan server web bersama dengan penerapan SSL Certificates, memastikan port 443 terbuka di zona yang benar sebelum penerbitan sertifikat (terutama untuk tantangan ACME HTTP-01 atau TLS-ALPN-01) adalah langkah prasyarat yang sering diabaikan.
Melindungi Server Mail
Untuk server yang menjalankan tumpukan Email Hosting (Postfix, Dovecot), set layanan yang diperlukan adalah:
sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=smtps --permanent
sudo firewall-cmd --zone=public --add-service=imap --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent
sudo firewall-cmd --reloadMencatat Paket yang Di-drop untuk Forensik
sudo firewall-cmd --zone=public --add-rich-rule='
rule family="ipv4"
log prefix="DROPPED_PUBLIC " level="warning" limit value="10/m"
drop' --permanent
sudo firewall-cmd --reloadLog muncul di /var/log/messages atau jurnal systemd (journalctl -k -g DROPPED_PUBLIC). Batasi tingkat log (seperti yang ditunjukkan di atas) untuk mencegah banjir log dalam skenario DDoS.
Firewalld pada VPS yang Dikelola cPanel
Jika Anda menggunakan VPS dengan cPanel, perlu diketahui bahwa cPanel menginstal dan mengelola lapisan firewall sendiri (CSF/LFD secara default). Menjalankan Firewalld bersama CSF tanpa koordinasi eksplisit akan menghasilkan aturan netfilter yang bertentangan. Pendekatan yang direkomendasikan adalah memilih satu lapisan manajemen firewall per server dan menonaktifkan yang lain, atau menggunakan antarmuka passthrough aturan langsung Firewalld untuk berintegrasi dengan persyaratan cPanel.
Memecahkan Masalah Firewalld yang Umum
Masalah: Aturan yang ditambahkan dengan --permanent tidak berlaku.
Penyebab: Aturan permanen memerlukan reload untuk masuk ke status runtime.
Perbaikan:
sudo firewall-cmd --reloadMasalah: Koneksi SSH terputus setelah perubahan firewall.
Penyebab: Layanan SSH dihapus dari zona aktif, atau rich rule drop ditambahkan sebelum aturan accept.
Perbaikan: Akses server melalui konsol out-of-band (konsol VNC/KVM penyedia hosting Anda), kemudian pulihkan layanan SSH:
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reloadMasalah: firewall-cmd mengembalikan FirewallD is not running.
Penyebab: Daemon mengalami crash atau tidak pernah dimulai.
Perbaikan:
sudo systemctl start firewalld
sudo journalctl -u firewalld -n 50Masalah: Aturan tampak benar tetapi lalu lintas masih diblokir.
Penyebab: Aturan iptables atau nft yang bertentangan ada di luar tabel yang dikelola Firewalld, atau SELinux/AppArmor memblokir koneksi di lapisan aplikasi.
Perbaikan: Periksa aturan manual dan penolakan SELinux:
sudo iptables -L -n -v
sudo ausearch -m avc -ts recentMasalah: Antarmuka tidak ditetapkan ke zona yang diharapkan setelah reboot.
Penyebab: Profil koneksi NetworkManager mengganti penetapan antarmuka Firewalld.
Perbaikan: Tetapkan zona dalam profil NetworkManager seperti yang dijelaskan di bagian penetapan antarmuka di atas.
Matriks Keputusan dan Daftar Periksa Teknis
Gunakan daftar periksa ini sebelum menerapkan Firewalld pada server produksi:
- Konfirmasi backend firewall aktif (
FirewallBackenddi/etc/firewalld/firewalld.conf) sesuai dengan dukungan nftables/iptables kernel Anda. - Verifikasi tidak ada alat firewall yang bertentangan (UFW, CSF, skrip
iptableslangsung) yang aktif pada antarmuka yang sama. - Tetapkan setiap antarmuka jaringan secara eksplisit ke zona — jangan pernah hanya mengandalkan zona default untuk server multi-homed.
- Terapkan semua perubahan pada runtime terlebih dahulu, verifikasi konektivitas, kemudian commit dengan
--permanentdan--reload. - Batasi akses SSH ke IP sumber tertentu melalui rich rules sebelum menghapus layanan SSH dari zona publik.
- Tambahkan rich rules pembatasan laju untuk semua layanan autentikasi yang terekspos secara publik (SSH, SMTP, endpoint login HTTPS).
- Aktifkan logging untuk zona
dropdengan batas laju untuk menangkap intelijen ancaman tanpa membanjiri penyimpanan. - Untuk server yang dikelola melalui VPS Control Panels, konfirmasi port yang diperlukan panel kontrol masuk dalam daftar putih sebelum menerapkan kebijakan default yang ketat.
- Uji konfigurasi permanen dengan menjalankan
firewall-cmd --reloaddan segera verifikasi semua layanan kritis tetap dapat dijangkau. - Dokumentasikan setiap zona kustom, rich rule, dan definisi layanan dalam version control bersama infrastructure-as-code Anda.
FAQ
Apa perbedaan antara --reload dan sudo systemctl restart firewalld?
--reload menerapkan perubahan konfigurasi permanen ke daemon yang berjalan tanpa memutus koneksi yang sudah ada. systemctl restart sepenuhnya me-restart proses daemon, yang menghapus semua aturan netfilter dan sebentar menginterupsi koneksi aktif. Selalu utamakan --reload pada sistem produksi.
Bisakah Firewalld dan iptables berdampingan di server yang sama?
Tidak dengan aman pada antarmuka yang sama. Firewalld mengelola chain netfilter miliknya sendiri; perintah iptables langsung yang memodifikasi chain yang sama akan ditimpa pada reload Firewalld berikutnya. Jika Anda perlu menyuntikkan aturan kustom, gunakan antarmuka --direct Firewalld atau rich rules sebagai gantinya.
Bagaimana cara membuat aturan runtime menjadi permanen tanpa mengetiknya ulang?
Tidak ada perintah bawaan untuk mempromosikan semua aturan runtime ke permanen dalam satu langkah. Alur kerja yang benar adalah menerapkan setiap aturan dua kali — sekali tanpa --permanent untuk pengujian, kemudian dengan --permanent untuk persistensi — diikuti dengan --reload. Atau, gunakan firewall-cmd --runtime-to-permanent (tersedia di Firewalld 0.9+) untuk mengambil snapshot status runtime saat ini ke disk.
Mengapa penetapan zona saya direset setelah reconnect NetworkManager?
NetworkManager menyimpan penetapan zona dalam profil koneksinya sendiri. Penetapan firewall-cmd --change-interface adalah penggantian runtime yang dapat ditimpa oleh NetworkManager. Pertahankan penetapan dengan nmcli connection modify <profile-name> connection.zone <zone>.
Apakah Firewalld mendukung IPv6?
Ya. Firewalld mengelola aturan netfilter IPv4 dan IPv6 secara bersamaan. Rich rules memerlukan atribut family="ipv6" untuk menargetkan lalu lintas IPv6 secara khusus. Aturan zona dan layanan berlaku untuk kedua keluarga alamat secara default kecuali definisi layanan atau rich rule membatasi cakupannya.
