15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai
21.10.2024
2 +1

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:

ZonaKebijakan DefaultKasus Penggunaan Umum
`trusted`Terima semuaJaringan lab internal, loopback
`home`Tolak, layanan tertentu diizinkanLAN rumah dengan perangkat yang dikenal
`internal`Tolak, layanan tertentu diizinkanSegmen jaringan korporat internal
`work`Tolak, layanan tertentu diizinkanJaringan kantor, kepercayaan sedang
`public`Tolak, SSH/DHCPv6 diizinkanAntarmuka yang menghadap internet
`external`Tolak, masquerade diaktifkanKaki eksternal router/gateway NAT
`dmz`Tolak, SSH diizinkanServer zona demiliterisasi
`block`Tolak dengan ICMP admin-prohibitedPenolakan eksplisit dengan respons
`drop`Drop secara diam-diamSumber 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-services

Untuk memeriksa definisi XML dari layanan tertentu:

cat /usr/lib/firewalld/services/https.xml

Rich 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' --permanent
firewall-cmd --zone=public --add-rich-rule='
  rule family="ipv4"
  service name="ssh"
  drop' --permanent

Kasus 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.

DimensiRuntimePermanen
Lokasi penyimpananDi memori (status daemon)File XML `/etc/firewalld/`
Kapan diterapkanSegeraSetelah `–reload` atau reboot
Bertahan setelah rebootTidakYa
Aman untuk diujiYaMemerlukan reload untuk verifikasi
RisikoHilang saat restartBertahan setelah reboot

Alur kerja praktik terbaik untuk perubahan produksi:

  1. Terapkan aturan hanya pada runtime (tanpa flag --permanent) dan verifikasi bahwa aturan tersebut berperilaku sesuai harapan.
  2. Jika benar, terapkan aturan yang sama dengan --permanent untuk menulisnya ke disk.
  3. Jalankan firewall-cmd --reload untuk 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 firewalld

Debian / Ubuntu:

sudo apt-get update && sudo apt-get install firewalld

Catatan untuk pengguna Ubuntu: Jika ufw aktif, nonaktifkan sebelum mengaktifkan Firewalld untuk menghindari konflik aturan netfilter:

sudo ufw disable
sudo systemctl disable ufw

Mulai dan aktifkan daemon:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Verifikasi daemon berjalan dan backend kernel aktif:

sudo firewall-cmd --state
sudo firewall-cmd --info-zone=public

Perintah Firewalld yang Penting

Periksa Status Saat Ini

Periksa status daemon:

sudo firewall-cmd --state

Daftarkan semua zona aktif dengan antarmuka dan sumber yang ditetapkan:

sudo firewall-cmd --get-active-zones

Tampilkan ruleset lengkap untuk zona tertentu:

sudo firewall-cmd --zone=public --list-all

Tampilkan ruleset lengkap untuk semua zona secara bersamaan:

sudo firewall-cmd --list-all-zones

Kelola 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=public

Tetapkan Antarmuka ke Zona

sudo firewall-cmd --zone=internal --change-interface=eth1 --permanent
sudo firewall-cmd --reload

Jebakan: 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 internal

Tambah dan Hapus Layanan

Izinkan HTTP di zona publik pada runtime:

sudo firewall-cmd --zone=public --add-service=http

Jadikan permanen:

sudo firewall-cmd --zone=public --add-service=http --permanent

Hapus layanan:

sudo firewall-cmd --zone=public --remove-service=http --permanent

Buka dan Tutup Port Tertentu

Buka port TCP 8080 pada runtime:

sudo firewall-cmd --zone=public --add-port=8080/tcp

Buka rentang port UDP secara permanen:

sudo firewall-cmd --zone=public --add-port=60000-61000/udp --permanent

Hapus port:

sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent

Allowlisting 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 --permanent

Blokir semua lalu lintas dari IP tertentu (drop berbasis sumber):

sudo firewall-cmd --zone=drop --add-source=203.0.113.45/32 --permanent

Penerusan 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 --reload

IP 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 --reload

Muat Ulang dan Sinkronkan Konfigurasi

Terapkan semua perubahan permanen ke status yang berjalan tanpa memutus koneksi:

sudo firewall-cmd --reload

Lakukan restart penuh (memutus semua koneksi — gunakan hanya dalam keadaan darurat):

sudo systemctl restart firewalld

Membuat 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 --reload

Definisi 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 --reload

Firewalld vs. Alternatif: Memilih Alat yang Tepat

FiturFirewalldUFWiptables (langsung)nftables (langsung)
Pembaruan aturan dinamisYaTidak (memerlukan reload)TidakTidak
Model berbasis zonaYaTidakTidakTidak
Integrasi D-Bus / APIYaTidakTidakTidak
Rich rule / logika kondisionalYaTerbatasYaYa
Default pada keluarga RHELYaTidakLamaYa (backend)
Default pada UbuntuTidakYaLamaYa (backend)
Kurva pembelajaranSedangRendahTinggiTinggi
Cocok untuk scriptingYaYaYaYa
Alat manajemen GUIYa (firewall-config)TidakTidakTidak

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 --reload

Jika 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 --reload

Mencatat 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 --reload

Log 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 --reload

Masalah: 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 --reload

Masalah: 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 50

Masalah: 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 recent

Masalah: 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 (FirewallBackend di /etc/firewalld/firewalld.conf) sesuai dengan dukungan nftables/iptables kernel Anda.
  • Verifikasi tidak ada alat firewall yang bertentangan (UFW, CSF, skrip iptables langsung) 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 --permanent dan --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 drop dengan 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 --reload dan 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.

15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai