SSD Nodes Learn 🎉 VPS mulai $5.50/bln
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-13

Panduan firewalld Rocky dan AlmaLinux untuk VPS

Pelajari cara membuka SSH dan port web, menutup port, memahami zone, serta menghindari jebakan --permanent agar aturan firewalld tetap aktif setelah reboot.

Apa itu firewalld dan alasan Rocky serta AlmaLinux menyertakannya

firewalld adalah pengelola firewall yang terpasang secara default pada Rocky Linux, AlmaLinux, dan rebuild lain dari Red Hat Enterprise Linux (RHEL). firewalld tidak memeriksa paket secara langsung. firewalld menyimpan konfigurasi, lalu menerjemahkan konfigurasi tersebut menjadi aturan nftables. Satu perintah, firewall-cmd, dapat mengubahnya saat server tetap online.

Jika Anda sudah memahami cara kerja ufw pada VPS Ubuntu, Anda sudah memahami tugas dasarnya. firewalld menambahkan dua konsep yang tidak dimiliki ufw. Konsep pertama adalah zone, yaitu kebijakan bernama yang menjadi tujuan pengelompokan paket. Konsep kedua adalah pemisahan antara aturan aktif dan aturan tersimpan. Pemisahan ini dikendalikan oleh flag --permanent dan menjadi sumber kebingungan terbesar saat menggunakan alat ini.

Semua perintah di bawah ini dijalankan pada server Anda sendiri. Uji setiap perubahan dari mesin kedua. Aturan yang tampak benar pada server tetap dapat salah jika dilihat dari Internet.

Buka SSH sebelum melakukan hal lain

Sebagian besar instalasi Rocky dan AlmaLinux sudah memiliki firewalld dan menjalankannya. Konfigurasi yang disertakan mengizinkan SSH. Beberapa image cloud minimal menghapusnya. Periksa kondisinya, jangan berasumsi.

sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --state

firewall-cmd --state menampilkan running. Jika service berhenti, setiap pemanggilan firewall-cmd lainnya menjawab FirewallD is not running dan keluar dengan status non-zero. Ini hal pertama yang harus diperiksa ketika perintah tampaknya tidak melakukan apa pun.

Sekarang baca aturan yang saat ini diizinkan.

sudo firewall-cmd --list-all

Output sebenarnya memiliki beberapa baris tambahan. Berikut baris yang penting:

public (active)
  target: default
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  rich rules:

ssh pada baris services: adalah alasan sesi Anda masih berfungsi. Jika aturan tersebut tidak ada, tambahkan sebelum melakukan hal lain, karena memulai firewall tanpa aturan SSH akan mengakhiri sesi dan membuat Anda tidak dapat masuk kembali.

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

target: default berarti paket yang tidak cocok dengan aturan apa pun ditolak dengan balasan ICMP (internet control message protocol) host-prohibited, sehingga klien yang mengakses port tertutup langsung melihat No route to host. Menetapkan target ke DROP membuat server tidak memberikan respons. Pemindai kemudian menunggu hingga waktu habis.

sudo firewall-cmd --permanent --zone=public --set-target=DROP
sudo firewall-cmd --reload

Pahami dampaknya sebelum menjalankan perintah tersebut: DROP juga menghentikan server agar tidak menjawab ping, sehingga pemantauan Anda sendiri juga berhenti menerima respons.

Mengapa rule saya hilang? Flag --permanent

firewalld menyimpan dua konfigurasi sekaligus. Konfigurasi runtime adalah konfigurasi yang sedang diterapkan kernel saat ini. Konfigurasi permanent tersimpan di /etc/firewalld/zones/public.xml dan akan digunakan kembali setelah reload atau reboot.

Perintah tanpa --permanent hanya mengubah konfigurasi runtime. Perintah tersebut langsung berlaku, tetapi hilang saat reload atau boot berikutnya. Perintah dengan --permanent menulis file dan tidak mengubah konfigurasi yang sedang berjalan, sehingga port tetap tertutup sampai Anda melakukan reload. Tidak satu pun perilaku ini merupakan bug. Keduanya sering membingungkan karena perintah menampilkan success dalam kedua kasus.

Selalu tulis keduanya.

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

Anda dapat membaca kedua konfigurasi tersebut. Ini adalah cara tercepat untuk mengetahui kesalahan mana yang Anda lakukan.

sudo firewall-cmd --list-services
sudo firewall-cmd --permanent --list-services

Perintah pertama menampilkan set yang sedang aktif. Perintah kedua menampilkan set yang tersimpan. Jika set aktif berisi sebuah service yang tidak ada dalam set tersimpan, rule tersebut akan hilang saat reload berikutnya. Jika set tersimpan berisi rule yang tidak ada dalam set aktif, Anda lupa melakukan reload. sudo firewall-cmd --runtime-to-permanent menyalin seluruh konfigurasi aktif ke file tersimpan. Ini berguna setelah sesi percobaan.

--reload mempertahankan status pelacakan koneksi, sehingga sesi SSH Anda tetap berjalan. --complete-reload juga me-reload modul kernel dan menghapus status tersebut. Akibatnya, biasanya semua koneksi terbuka, termasuk koneksi Anda, akan terputus. Gunakan reload biasa.

Salah satu mekanisme pengaman sudah tersedia. Rule runtime dapat kedaluwarsa secara otomatis.

sudo firewall-cmd --add-service=http --timeout=5m

Rule tersebut akan menghapus dirinya sendiri setelah lima menit. Rule ini tidak dapat digabungkan dengan --permanent. Itulah tujuannya: rule ini digunakan untuk menguji perubahan yang belum Anda yakini. Mekanisme pengaman yang lebih lama lebih baik. Buka sesi SSH kedua saat mengedit rule, lalu jangan tutup sesi tersebut sampai login baru membuktikan bahwa rule yang baru berfungsi.

Zona dan alasan hanya zona default yang penting pada VPS

Zona adalah sekumpulan izin bernama yang memiliki tingkat kepercayaan. firewalld memasukkan setiap paket masuk ke tepat satu zona. firewalld terlebih dahulu mencocokkan alamat sumber paket dengan daftar sources: setiap zona. Jika tidak ada yang cocok, firewalld menggunakan zona tempat interface masuk terikat. Jika interface tidak terikat ke zona mana pun, paket masuk ke zona default.

sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zones

Pada VPS dengan satu interface jaringan, jawaban pertama hampir selalu public, dan itulah satu-satunya zona yang akan Anda gunakan. firewall-cmd tanpa argumen --zone= bekerja pada zona default. Karena itu, setiap perintah singkat dalam panduan ini dapat digunakan tanpa menyebutkan zona.

Berikut adalah kegagalan yang dapat menghabiskan waktu berjam-jam. Jika interface terikat ke zona lain, aturan Anda masuk ke public, sedangkan trafik ditangani di tempat lain. Akibatnya, tidak ada aturan yang Anda tambahkan yang berpengaruh dan tidak ada peringatan yang muncul. --get-active-zones menampilkan pengikatan tersebut:

public
  interfaces: eth0

Jika interface muncul di bawah nama zona yang berbeda, tulis aturan Anda di zona tersebut dengan --zone=, atau pindahkan interface.

sudo firewall-cmd --permanent --zone=public --change-interface=eth0
sudo firewall-cmd --reload

NetworkManager mengelola interface pada Rocky dan AlmaLinux, serta menerapkan kembali zona saat koneksi aktif. Tetapkan zona di sana juga agar reboot tidak membatalkan konfigurasi Anda. Ambil nama koneksi dari perintah pertama, karena nama tersebut jarang sama dengan nama device.

sudo nmcli connection show
sudo nmcli connection modify "System eth0" connection.zone public

Pencocokan sumber memiliki prioritas di atas pencocokan interface. Dengan demikian, satu alamat dapat memiliki kebijakan yang berbeda. Zona bawaan trusted menerima semua hal.

sudo firewall-cmd --permanent --zone=trusted --add-source=203.0.113.10/32
sudo firewall-cmd --reload

Berhati-hatilah dengan zona tersebut. Zona ini membuka setiap port pada server untuk alamat itu, termasuk database yang Anda kira bersifat privat. Gunakan rich rule jika Anda hanya ingin membuka satu port, bukan seluruh host.

Apa yang dimaksud dengan service firewalld?

Service adalah kumpulan port bernama yang disediakan sebagai file XML. --add-service=https membuka 443/tcp karena /usr/lib/firewalld/services/https.xml menentukan arti https.

sudo firewall-cmd --get-services
sudo firewall-cmd --info-service=https

--info-service menampilkan port yang berada di balik nama tersebut:

https
  ports: 443/tcp

Gunakan nama jika tersedia. Nama tersebut tetap mudah dipahami dalam --list-all enam bulan kemudian, dan paket seperti Cockpit memasang file service-nya sendiri. Gunakan --add-port untuk apa pun yang tidak memiliki definisi.

Perhatikan celah berikut: service ssh berarti 22/tcp dan tidak ada yang lain. Jika Anda memindahkan SSH ke port lain saat memperketat akses SSH pada server, maka --add-service=ssh tidak membuka port yang benar-benar Anda gunakan.

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

Pada rebuild RHEL, ada pembatas kedua pada port tersebut. SELinux (security-enhanced Linux) memberi label pada nomor port, dan sshd tidak diizinkan melakukan bind ke port di luar labelnya. Akibatnya, service tidak dapat start dan log menampilkan error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. Beri label pada port terlebih dahulu.

sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2222

Bagaimana cara melihat apa yang sedang terbuka?

sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules
sudo nft list table inet firewalld | head -n 40

Dua perintah pertama melaporkan apa yang diyakini oleh firewalld. Perintah ketiga membaca aturan yang sebenarnya disimpan kernel, dalam tabel yang dikelola firewalld. Hasilnya seharusnya sama.

Tidak satu pun dari pemeriksaan tersebut merupakan bukti. Lakukan pengujian dari mesin lain:

nc -zv 203.0.113.20 443

Jangan jalankan pengujian dari server itu sendiri. firewalld menerima semua koneksi yang datang melalui antarmuka loopback, sehingga curl http://localhost:8080 berhasil apa pun aturan Anda. Pengujian tersebut hanya menunjukkan bahwa service aktif. Pengujian tersebut tidak memberi informasi apa pun tentang firewall.

Izinkan port web

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

Perintah terakhir sekarang seharusnya menampilkan http https bersama entri yang sudah ada sebelumnya. Jika situs masih tidak merespons, firewall mungkin bukan penyebabnya. Sebuah aturan hanya mengizinkan paket. Suatu proses tetap harus mendengarkan koneksi tersebut.

sudo ss -tlnp

Socket yang ditampilkan sebagai 0.0.0.0:443 atau *:443 menerima koneksi dari alamat mana pun. Socket yang ditampilkan sebagai 127.0.0.1:443 hanya merespons pada loopback, dan aturan firewall apa pun tidak akan membuatnya dapat diakses dari luar. Port dan socket yang mendengarkan di Linux menjelaskan perbedaan tersebut secara lebih rinci.

Bagaimana cara menutup port?

sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reload

Aturan --permanent juga berlaku di sini, dan dampaknya lebih besar pada arah ini. Hapus sebuah service hanya dari runtime, lalu port tampak tertutup. Reload atau reboot berikutnya akan membukanya kembali dari file tersimpan. Ini adalah celah yang tidak akan Anda sadari karena pemeriksaan yang dijalankan berhasil.

Menghapus sesuatu yang sebelumnya tidak ada akan menampilkan Warning: NOT_ENABLED: http dan tetap keluar dengan kode 0. Menambahkan hal yang sama dua kali akan menampilkan Warning: ALREADY_ENABLED: http. Keduanya aman. Nama yang salah eja berbeda: Error: INVALID_SERVICE berarti firewalld tidak memiliki definisi dengan nama tersebut, sehingga tidak ada perubahan sama sekali.

Jika --list-all Anda menampilkan cockpit dan Anda tidak menggunakan konsol web Cockpit pada port 9090, hapus service tersebut. Setiap port yang terbuka adalah service yang harus terus Anda perbarui ke patch terbaru.

Batasi port ke satu alamat sumber

Rich rule digunakan untuk aturan yang lebih panjang ketika nama service biasa tidak dapat menyatakan kebutuhan Anda. Membatasi SSH ke satu alamat kantor memerlukan dua perintah, dan perintah kedua sering terlupakan.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" service name="ssh" accept'
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

Zone adalah sekumpulan izin, bukan daftar bernomor yang berhenti pada kecocokan pertama. Rich rule menambahkan izin accept untuk satu alamat. Aturan ini tidak menolak alamat mana pun. Selama ssh masih berada pada baris services:, seluruh Internet tetap dapat mengakses port 22 dan rich rule tidak mengubah apa pun yang dapat diukur. Hapus entri yang terlalu luas tersebut. Jika tidak, aturan yang lebih spesifik hanya menjadi hiasan.

Untuk port yang tidak memiliki nama service, tentukan nama portnya secara langsung.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" port port="5432" protocol="tcp" accept'

Untuk menjatuhkan trafik dari jaringan yang berisik sekaligus mencatatnya, letakkan elemen log sebelum action. Urutan ini diperlukan oleh bahasa rich rule.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.0/24" log prefix="fw-drop " level="info" limit value="3/m" drop'
sudo firewall-cmd --reload
sudo journalctl -k -g fw-drop

Nilai limit mencegah banjir paket memenuhi journal. Sebelum membatasi SSH ke satu alamat, pastikan alamat tersebut stabil. Koneksi rumah dengan alamat IP yang berubah dapat mengunci Anda dari server pada hari alamat itu berubah. Karena itu, uji dan pastikan console access dari provider Anda berfungsi terlebih dahulu.

perintah ufw dan padanannya dalam firewall-cmd

Tugasnya sama, tetapi alatnya berbeda. Setiap baris --permanent memerlukan sudo firewall-cmd --reload setelahnya. Hal ini tidak dapat ditunjukkan oleh daftar seperti ini.

  • sudo ufw enable menjadi sudo systemctl enable --now firewalld
  • sudo ufw disable menjadi sudo systemctl disable --now firewalld
  • sudo ufw status verbose menjadi sudo firewall-cmd --list-all
  • sudo ufw allow OpenSSH menjadi sudo firewall-cmd --permanent --add-service=ssh
  • sudo ufw allow 443/tcp menjadi sudo firewall-cmd --permanent --add-port=443/tcp
  • sudo ufw delete allow 443/tcp menjadi sudo firewall-cmd --permanent --remove-port=443/tcp
  • sudo ufw allow from 203.0.113.10 to any port 22 menjadi rich rule yang ditunjukkan di atas
  • sudo ufw reload menjadi sudo firewall-cmd --reload
  • sudo ufw default deny incoming sudah merupakan perilaku zone public, sedangkan --set-target=DROP adalah versi diamnya
  • sudo ufw logging on menjadi sudo firewall-cmd --set-log-denied=all

Satu perbedaan perlu dijelaskan secara langsung. ufw menyimpan daftar bernomor, dan Anda dapat menyisipkan rule pada posisi 1. firewalld tidak memiliki nomor rule. Jadi, perintah "letakkan rule ini di urutan pertama" tidak memiliki arti di sini. Ketika dua entri firewalld tampak saling bertentangan, aturan accept yang lebih umum akan berlaku karena tidak ada aturan deny dalam kumpulan tersebut. Anda harus menghapus entri umum itu sendiri.

Mengapa container Docker saya dapat diakses ketika firewall terlihat tertutup?

Karena port container yang dipublikasikan tidak pernah melewati bagian firewall yang dikendalikan oleh zone Anda. docker run -d -p 8080:80 nginx memberi tahu Docker untuk menulis aturan NAT (network address translation) dan forwarding-nya sendiri. Paket yang tiba pada port 8080 ditulis ulang dan dirutekan ke container, sehingga paket tersebut diteruskan, bukan dikirimkan ke host. Baris services: dan ports: dalam zone Anda mengatur paket yang dikirimkan ke host. Aturan Docker mengatur jalur forward, dan aturan tersebut mengizinkannya.

Hasilnya adalah server yang menurut sudo firewall-cmd --list-all tidak memiliki port 8080, tetapi nc -zv 203.0.113.20 8080 dari komputer lain tetap dapat terhubung. Periksa aturan yang dipasang Docker:

sudo iptables -t nat -L DOCKER -n

Perbaikannya ada pada flag publish. Bind port ke loopback, lalu tempatkan reverse proxy di depannya.

docker run -d -p 127.0.0.1:8080:80 nginx

Sekarang container hanya merespons curl http://127.0.0.1:8080 pada server dan tidak dapat diakses dari luar. Pengguna Ubuntu menghadapi masalah yang sama, seperti dijelaskan dalam mengapa container Docker memublikasikan port langsung melewati ufw. Rootful Podman, yang disertakan Rocky dan AlmaLinux dalam repositori dasar, memublikasikan port dengan pendekatan NAT yang sama. Karena itu, lakukan pengujian dari komputer lain, bukan hanya mengandalkan daftar zone.

Membuatnya tetap aktif setelah reboot dan error yang akan Anda lihat

sudo systemctl is-enabled firewalld
sudo systemctl status firewalld

enabled dan active (running) adalah hasil yang diinginkan. Firewall yang sedang berjalan tetapi belum diaktifkan hanya melindungi server sampai reboot pertama. Pemeriksaan ini harus masuk dalam daftar yang Anda lakukan selama sepuluh menit pertama pada VPS baru, bersama pemeriksaan SSH keys dan updates.

Perintah mentah nftables dan firewalld tidak boleh digunakan bersamaan. firewalld memiliki tabel bernama inet firewalld. sudo nft flush ruleset menghapus tabel tersebut. Setelah itu, server terbuka terhadap semua trafik, tetapi firewall-cmd --list-all masih menampilkan konfigurasi yang Anda inginkan karena firewalld melaporkan konfigurasi yang diyakininya, bukan konfigurasi yang tersimpan di kernel. sudo firewall-cmd --reload memasang ulang rules. Tulis rules dengan firewall-cmd agar rules tersebut tetap tersedia setelah reload.

Dua firewall manager pada satu server. Menginstal ufw atau iptables-services bersama firewalld membuat dua program menulis rules tanpa mengetahui perubahan satu sama lain. Program yang terakhir menjalankan service akan menentukan hasil akhirnya. Pilih satu. Pada Rocky dan AlmaLinux, firewalld adalah firewall manager yang didukung oleh distribusi.

Firewall provider di depan server. Banyak panel VPS memiliki firewall jaringan terpisah. Jika --list-all menunjukkan sebuah port terbuka tetapi koneksi dari luar tetap gagal, periksa panel tersebut sebelum mengubah apa pun pada server. Hal sebaliknya juga berlaku: rules yang terbuka pada panel tidak berpengaruh jika firewalld menolak packet.

Menjalankan firewall-cmd tanpa sudo. Setiap perubahan memerlukan root. Tanpa root, permintaan ditolak oleh pemeriksaan otorisasi dan tidak ada yang diubah. Sekilas, kondisi ini terlihat seperti perintah diabaikan.

Enam perintah mencakup sebagian besar kebutuhan sehari-hari: --list-all untuk membaca status, --permanent --add-service atau --add-port untuk membuka sesuatu, --permanent --remove-service untuk menutupnya, --reload untuk menerapkan file yang tersimpan, dan --runtime-to-permanent setelah serangkaian eksperimen. Zone-nya adalah public, flag-nya adalah --permanent, dan satu-satunya pemeriksaan yang benar-benar valid berasal dari mesin lain.

FAQ

Mengapa aturan firewalld saya hilang setelah reboot?

Aturan tersebut hanya masuk ke konfigurasi runtime. sudo firewall-cmd --add-service=http langsung menerapkan aturan dan membuangnya saat reload atau boot berikutnya karena konfigurasi tersimpan di /etc/firewalld/zones/public.xml tidak pernah diubah. Tambahkan --permanent, lalu jalankan sudo firewall-cmd --reload. Untuk menyimpan aturan yang sebelumnya Anda tambahkan secara manual, jalankan sudo firewall-cmd --runtime-to-permanent. Perintah ini menyalin kumpulan aturan aktif ke file tersimpan.

Mengapa tidak ada perubahan setelah saya menambahkan aturan dengan --permanent?

Karena --permanent menulis file dan tidak mengubah firewall yang sedang berjalan. Port tetap tertutup sampai sudo firewall-cmd --reload memuat konfigurasi tersimpan ke kernel. Bandingkan sudo firewall-cmd --list-services dengan sudo firewall-cmd --permanent --list-services. Jika daftar tersimpan berisi entri yang tidak ada dalam daftar aktif, berarti Anda belum menjalankan reload.

Sebaiknya saya menggunakan --add-service atau --add-port?

Gunakan --add-service jika tersedia nama untuk layanan yang Anda jalankan. Opsi ini menyatakan tujuan aturan, dan sudo firewall-cmd --info-service=https menunjukkan port yang dicakup oleh nama tersebut. Gunakan --add-port jika tidak ada definisi untuk layanan Anda atau jika layanan tersebut mendengarkan pada port nonstandar. Service ssh hanya berarti 22/tcp. Jadi, jika SSH dipindahkan ke 2222, Anda memerlukan --add-port=2222/tcp dan label SELinux untuk port tersebut.

Mengapa container Docker saya dapat diakses ketika firewall-cmd menunjukkan port tertutup?

Port yang dipublikasikan ditulis ulang oleh aturan NAT milik Docker sendiri dan diteruskan ke container. Karena itu, paket tidak pernah dikirimkan ke host, sedangkan daftar service dan port pada suatu zone hanya mencakup paket yang dikirimkan ke host. Container tetap merespons dari Internet, sementara --list-all tidak menampilkan apa pun. Publikasikan port tersebut ke loopback dengan docker run -d -p 127.0.0.1:8080:80 nginx, lalu tempatkan reverse proxy di depannya.

Dapatkah saya menginstal ufw di Rocky Linux sebagai pengganti firewalld?

Dua pengelola firewall pada satu server menulis aturan tanpa mengetahui aturan yang dibuat pengelola lainnya. Kumpulan aturan yang bertahan bergantung pada service yang terakhir dijalankan. firewalld adalah tool yang didukung di Rocky Linux dan AlmaLinux, sudah terinstal, serta menggunakan backend nftables yang sama dengan yang akan digunakan ufw. Pelajari zone default dan flag --permanent sekali, lalu Anda sudah memahami seluruh tool tersebut.