Cara Konfigurasi Firewalld di Rocky atau AlmaLinux
Ketahui cara mengurus zon firewalld pada Rocky dan AlmaLinux dengan betul. Panduan ini menjelaskan penggunaan flag --permanent agar peraturan kekal aktif selepas but semula.
Apakah itu firewalld, dan mengapa Rocky serta AlmaLinux menyertakannya
firewalld ialah pengurus firewall yang dipasang secara lalai pada Rocky Linux, AlmaLinux dan sistem lain yang dibina semula daripada Red Hat Enterprise Linux (RHEL). Ia tidak memeriksa paket secara terus. Ia menyimpan konfigurasi dan menukarkan konfigurasi tersebut kepada peraturan nftables. Satu arahan, firewall-cmd, menyuntingnya semasa pelayan masih dalam talian.
Jika anda sudah tahu bagaimana ufw berfungsi pada VPS Ubuntu, anda sudah memahami tugasnya. firewalld menambah dua konsep yang tidak dimiliki oleh ufw. Pertama ialah zon: polisi bernama yang digunakan untuk mengasingkan paket. Kedua ialah pemisahan antara peraturan semasa (live) dan peraturan tersimpan, yang melibatkan flag --permanent dan merupakan punca kekeliruan paling besar dalam alat ini.
Segala perkara di bawah ialah arahan yang anda jalankan pada pelayan anda sendiri. Uji setiap perubahan daripada mesin kedua, kerana peraturan yang kelihatan betul pada pelayan mungkin masih salah apabila diakses dari internet.
Buka SSH sebelum anda melakukan apa-apa lagi
Kebanyakan pemasangan Rocky dan AlmaLinux sudah mempunyai firewalld yang tersedia dan berjalan, dan konfigurasi lalai membenarkan SSH. Sesetengah imej awan minimal membuang perkhidmatan ini. Semak statusnya dan jangan membuat andaian.
sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --statefirewall-cmd --state mencetak running. Jika perkhidmatan dihentikan, setiap panggilan firewall-cmd yang lain akan menjawab FirewallD is not running dan keluar dengan kod bukan sifar. Itu adalah perkara pertama yang perlu disemak apabila sesuatu arahan kelihatan tidak melakukan apa-apa.
Sekarang, baca apa yang dibenarkan pada masa ini.
sudo firewall-cmd --list-allOutput sebenar mempunyai beberapa baris lagi. Ini adalah baris yang penting:
public (active)
target: default
interfaces: eth0
sources:
services: cockpit dhcpv6-client ssh
ports:
rich rules:ssh dalam baris services: adalah sebab sesi anda masih berfungsi. Jika ia tiada, tambahkannya sebelum anda menyentuh apa-apa lagi, kerana memulakan firewall tanpa peraturan SSH akan menamatkan sesi anda dan menghalang anda daripada masuk semula.
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reloadtarget: default bermaksud paket yang tidak sepadan dengan apa-apa akan ditolak dengan balasan ICMP (internet control message protocol) host-prohibited, jadi klien yang mencapai port tertutup akan melihat No route to host serta-merta. Menetapkan sasaran kepada DROP akan menyebabkan pelayan menjadi senyap, dan pengimbas kemudian akan menunggu sehingga tamat tempoh (timeout).
sudo firewall-cmd --permanent --zone=public --set-target=DROP
sudo firewall-cmd --reloadKetahui kesannya sebelum anda menjalankan arahan tersebut: DROP juga menghalang pelayan daripada menjawab ping, jadi pemantauan anda sendiri juga akan menjadi senyap.
Mengapa peraturan saya hilang? Flag --permanent
firewalld menyimpan dua konfigurasi serentak. Konfigurasi runtime ialah apa yang dikuatkuasakan oleh kernel pada saat ini. Konfigurasi permanent ialah apa yang tersimpan dalam /etc/firewalld/zones/public.xml dan apa yang kembali selepas muat semula (reload) atau but semula (reboot).
Perintah tanpa --permanent hanya mengubah runtime. Ia berfungsi serta-merta dan hilang pada muat semula atau but seterusnya. Perintah dengan --permanent menulis fail tersebut dan tidak mengubah apa-apa yang sedang berjalan, jadi port kekal tertutup sehingga anda melakukan muat semula. Kedua-dua kelakuan ini bukanlah pepijat. Kedua-duanya mengejutkan pengguna kerana perintah tersebut mencetak success dalam kedua-dua keadaan.
Tulis pasangan tersebut setiap kali.
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reloadAnda boleh membaca kedua-dua konfigurasi, yang merupakan cara terpantas untuk mengetahui kesilapan mana antara dua perkara tersebut yang anda lakukan.
sudo firewall-cmd --list-services
sudo firewall-cmd --permanent --list-servicesPerintah pertama mencetak set yang sedang aktif. Perintah kedua mencetak set yang disimpan. Jika set aktif mengandungi servis yang tidak ada dalam set yang disimpan, peraturan itu akan hilang pada muat semula seterusnya. Jika set yang disimpan mengandungi servis yang tidak ada dalam set aktif, anda terlupa melakukan muat semula. sudo firewall-cmd --runtime-to-permanent menyalin semua perkara yang aktif ke dalam fail simpanan, yang berguna selepas sesi eksperimen.
--reload mengekalkan status penjejakan sambungan, jadi sesi SSH anda terselamat daripadanya. --complete-reload memuat semula modul kernel juga dan kehilangan status tersebut, yang biasanya menamatkan setiap sambungan terbuka termasuk sambungan anda. Gunakan muat semula biasa.
Satu jaring keselamatan telah dibina di dalamnya. Peraturan runtime boleh tamat tempoh dengan sendirinya.
sudo firewall-cmd --add-service=http --timeout=5mPeraturan itu membuang dirinya sendiri selepas lima minit. Ia tidak boleh digabungkan dengan --permanent, dan itulah tujuannya: ia wujud untuk menguji perubahan yang anda tidak pasti. Jaring keselamatan yang lebih lama adalah lebih baik. Pastikan sesi SSH kedua terbuka semasa anda mengedit peraturan, dan jangan tutupnya sehingga log masuk baharu membuktikan peraturan baharu tersebut berfungsi.
Zon, dan sebab mengapa hanya zon lalai yang penting pada VPS
Zon ialah set kebenaran bernama yang mempunyai tahap kepercayaan yang dilampirkan. firewalld meletakkan setiap paket masuk ke dalam tepat satu zon. Ia memadankan alamat sumber paket dengan senarai sources: setiap zon terlebih dahulu. Jika tiada padanan, ia menggunakan zon yang diikat pada antara muka masuk. Jika antara muka tidak diikat pada mana-mana zon, paket tersebut pergi ke zon lalai.
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --get-active-zonesPada VPS dengan satu antara muka rangkaian, jawapan pertama hampir selalunya public, dan itulah satu-satunya zon yang akan anda gunakan. firewall-cmd tanpa argumen --zone= bertindak ke atas zon lalai, itulah sebabnya setiap arahan ringkas dalam panduan ini berfungsi tanpa perlu menamakannya.
Berikut ialah kegagalan yang membuang masa sepanjang petang. Jika antara muka diikat pada zon lain, peraturan anda akan mendarat di public manakala trafik dikendalikan di tempat lain, jadi tiada apa yang anda tambah akan memberi kesan dan tiada amaran diberikan kepada anda. --get-active-zones menunjukkan ikatan tersebut:
public
interfaces: eth0Jika antara muka muncul di bawah nama zon yang berbeza, sama ada tulis peraturan anda di sana dengan --zone=, atau alihkan antara muka tersebut.
sudo firewall-cmd --permanent --zone=public --change-interface=eth0
sudo firewall-cmd --reloadNetworkManager menguruskan antara muka pada Rocky dan AlmaLinux, dan ia menetapkan semula zon apabila sambungan diaktifkan. Tetapkannya di sana juga supaya but semula tidak membatalkan kerja anda. Ambil nama sambungan daripada arahan pertama, kerana ia jarang sekali sama dengan nama peranti.
sudo nmcli connection show
sudo nmcli connection modify "System eth0" connection.zone publicPadanan sumber mengatasi padanan antara muka, itulah cara satu alamat mendapat polisi yang berbeza. Zon terbina dalam trusted menerima segala-galanya.
sudo firewall-cmd --permanent --zone=trusted --add-source=203.0.113.10/32
sudo firewall-cmd --reloadBerhati-hati dengan zon tersebut. Ia membuka setiap port pada pelayan kepada alamat itu, termasuk pangkalan data yang anda sangka bersifat peribadi. Gunakan rich rule apabila anda mahukan satu port, bukan satu hos.
Apakah itu servis firewalld?
Servis ialah himpunan port bernama yang dibekalkan sebagai fail XML. --add-service=https membuka 443/tcp kerana /usr/lib/firewalld/services/https.xml mentakrifkan maksud https.
sudo firewall-cmd --get-services
sudo firewall-cmd --info-service=https--info-service mencetak port yang tersembunyi di sebalik nama tersebut:
https
ports: 443/tcpGunakan nama tersebut apabila ia tersedia. Ia lebih mudah dibaca dalam --list-all enam bulan kemudian, dan pakej seperti Cockpit memasang fail servisnya sendiri. Gunakan --add-port untuk sebarang perkara yang tidak mempunyai takrifan.
Jurang yang perlu diperhatikan: servis ssh bermaksud 22/tcp dan tiada yang lain. Jika anda telah memindahkan SSH ke port lain semasa mengeraskan akses SSH pada pelayan, maka --add-service=ssh tidak membuka port yang sebenarnya anda gunakan.
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reloadPada binaan semula RHEL, terdapat kunci kedua pada pintu tersebut. SELinux (security-enhanced Linux) melabelkan nombor port, dan sshd tidak dibenarkan untuk bind pada port di luar labelnya. Ia kemudian enggan bermula dan log memaparkan error: Bind to port 2222 on 0.0.0.0 failed: Permission denied. Labelkan port tersebut terlebih dahulu.
sudo dnf install -y policycoreutils-python-utils
sudo semanage port -a -t ssh_port_t -p tcp 2222Bagaimanakah cara untuk melihat apa yang terbuka sekarang?
sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules
sudo nft list table inet firewalld | head -n 40Dua arahan pertama melaporkan apa yang dipercayai oleh firewalld. Arahan ketiga membaca peraturan yang sebenarnya dipegang oleh kernel, di dalam jadual yang dimiliki oleh firewalld. Kesemuanya haruslah sepadan.
Tiada satu pun daripada itu merupakan bukti muktamad. Lakukan ujian daripada mesin lain:
nc -zv 203.0.113.20 443Jangan jalankan ujian tersebut pada pelayan itu sendiri. firewalld menerima segala-galanya yang tiba pada antara muka loopback, jadi curl http://localhost:8080 akan berjaya walau apa pun peraturan anda. Ujian itu hanya memberitahu anda bahawa servis tersebut aktif. Ia tidak memberitahu anda apa-apa tentang firewall.
Benarkan port web
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-servicesPerintah terakhir kini sepatutnya menyenaraikan http https di samping apa yang ada sebelum ini. Jika laman web masih tidak bertindak balas, firewall mungkin bukan puncanya. Satu peraturan hanya membenarkan paket. Sesuatu proses masih perlu mendengar (listening) untuk paket tersebut.
sudo ss -tlnpSocket yang dipaparkan sebagai 0.0.0.0:443 atau *:443 menerima sambungan daripada mana-mana alamat. Socket yang dipaparkan sebagai 127.0.0.1:443 hanya menjawab pada loopback, dan tiada peraturan firewall yang akan menjadikannya boleh dicapai dari luar. Port dan socket pendengar pada Linux membincangkan perbezaan tersebut dengan lebih terperinci.
Bagaimanakah cara untuk menutup semula port?
sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reloadPeraturan --permanent juga terpakai di sini, dan ia memberi kesan yang lebih ketara dalam arah ini. Jika anda membuang servis daripada runtime sahaja, port tersebut akan kelihatan tertutup, namun muat semula atau but semula seterusnya akan membukanya semula daripada fail yang disimpan. Ini merupakan satu kelompangan yang tidak akan anda sedari, kerana semakan yang anda jalankan telah berjaya.
Membuang sesuatu yang tidak wujud akan mencetak Warning: NOT_ENABLED: http dan masih keluar dengan kod 0. Menambah perkara yang sama sebanyak dua kali akan mencetak Warning: ALREADY_ENABLED: http. Kedua-duanya adalah selamat. Nama yang tersalah eja adalah berbeza: Error: INVALID_SERVICE bermaksud firewalld tidak mempunyai definisi dengan nama tersebut dan tiada apa-apa yang berubah.
Jika --list-all anda menunjukkan cockpit dan anda tidak menggunakan konsol web Cockpit pada port 9090, buang servis tersebut. Setiap port yang terbuka adalah servis yang perlu anda pastikan sentiasa ditampal (patched).
Mengehadkan port kepada satu alamat sumber
Rich rules ialah bentuk panjang, digunakan apabila nama servis biasa tidak dapat menyatakan maksud anda. Mengehadkan SSH kepada satu alamat pejabat memerlukan dua arahan, dan arahan kedua sering dilupakan oleh pengguna.
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 --reloadZon ialah set kebenaran, bukan senarai bernombor yang berhenti pada padanan pertama. Rich rule menambah kebenaran (accept) untuk satu alamat. Ia tidak menolak sesiapa pun. Selagi ssh masih berada dalam baris services:, seluruh internet masih boleh mencapai port 22 dan rich rule tersebut tidak mengubah apa-apa yang boleh anda ukur. Buang entri umum tersebut, atau entri khusus itu hanyalah hiasan.
Untuk port yang tiada nama servis, namakan port tersebut sebagai ganti.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10/32" port port="5432" protocol="tcp" accept'Untuk menggugurkan (drop) rangkaian yang bising dan menyimpan rekod, letakkan elemen log sebelum tindakan, iaitu urutan yang dijangkakan 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-dropNilai limit menghalang lambakan paket daripada memenuhi journal. Sebelum anda mengunci SSH kepada satu alamat tunggal, pastikan alamat tersebut stabil. Sambungan rumah dengan alamat IP yang berubah-ubah akan mengunci akses anda pada hari ia berubah, jadi pastikan akses konsol pembekal anda telah diuji dan berfungsi terlebih dahulu.
Perintah ufw dan setara firewall-cmd miliknya
Tugas yang sama, alat yang berbeza. Setiap baris --permanent memerlukan sudo firewall-cmd --reload selepasnya, yang merupakan satu perkara yang tidak dapat ditunjukkan oleh senarai seperti ini kepada anda.
sudo ufw enablemenjadisudo systemctl enable --now firewalldsudo ufw disablemenjadisudo systemctl disable --now firewalldsudo ufw status verbosemenjadisudo firewall-cmd --list-allsudo ufw allow OpenSSHmenjadisudo firewall-cmd --permanent --add-service=sshsudo ufw allow 443/tcpmenjadisudo firewall-cmd --permanent --add-port=443/tcpsudo ufw delete allow 443/tcpmenjadisudo firewall-cmd --permanent --remove-port=443/tcpsudo ufw allow from 203.0.113.10 to any port 22menjadi rich rule yang ditunjukkan di atassudo ufw reloadmenjadisudo firewall-cmd --reloadsudo ufw default deny incomingadalah cara zonpublicberfungsi, dan--set-target=DROPialah versi senyapnyasudo ufw logging onmenjadisudo firewall-cmd --set-log-denied=all
Satu perbezaan perlu dinyatakan dengan jelas. ufw mengekalkan senarai bernombor dan anda boleh memasukkan peraturan pada kedudukan 1. firewalld tidak mempunyai nombor peraturan, jadi "letakkan peraturan ini di tempat pertama" tidak membawa maksud di sini. Apabila dua entri firewalld kelihatan bercanggah antara satu sama lain, peraturan accept yang lebih luas akan menang, kerana tiada apa-apa dalam set tersebut yang menafikan. Anda perlu membuang entri yang luas itu sendiri.
Mengapa kontena Docker saya boleh dicapai sedangkan firewall kelihatan tertutup?
Ini kerana port kontena yang diterbitkan tidak pernah sampai ke bahagian firewall yang dikawal oleh zon anda. docker run -d -p 8080:80 nginx memberitahu Docker untuk menulis peraturan NAT (network address translation) dan forwarding miliknya sendiri. Paket yang tiba pada port 8080 ditulis semula dan dihalakan terus ke kontena, jadi ia diforward dan bukannya dihantar ke hos. Baris services: dan ports: dalam zon anda mengawal paket yang dihantar ke hos. Peraturan Docker pula mengawal laluan forward, dan ia menerima trafik tersebut.
Hasilnya ialah pelayan di mana sudo firewall-cmd --list-all tidak menunjukkan port 8080, namun nc -zv 203.0.113.20 8080 daripada mesin lain tetap boleh bersambung. Lihat apa yang dipasang oleh Docker:
sudo iptables -t nat -L DOCKER -nPenyelesaiannya terletak pada flag publish. Bind port tersebut ke loopback dan letakkan reverse proxy di hadapannya.
docker run -d -p 127.0.0.1:8080:80 nginxKontena kini menjawab curl http://127.0.0.1:8080 pada pelayan dan tiada apa-apa daripada luar. Pengguna Ubuntu menghadapi masalah yang sama, seperti yang diterangkan dalam mengapa kontena Docker menerbitkan port terus melepasi ufw. Podman dengan keistimewaan root, yang disertakan oleh Rocky dan AlmaLinux dalam repositori asas, menerbitkan port dengan pendekatan NAT yang sama, jadi lakukan ujian daripada mesin lain dan jangan hanya bergantung pada senarai zon.
Memastikan ia bertahan selepas but semula, dan ralat yang akan anda lihat
sudo systemctl is-enabled firewalld
sudo systemctl status firewalldenabled dan active (running) adalah apa yang anda perlukan. Firewall yang sedang berjalan tetapi tidak didayakan hanya melindungi anda sehingga but semula yang pertama. Semakan itu perlu dimasukkan ke dalam senarai yang anda laksanakan dalam sepuluh minit pertama pada VPS baharu, bersebelahan dengan kunci SSH dan kemas kini.
Perintah mentah nftables dan firewalld tidak boleh bercampur. firewalld memiliki jadual yang dipanggil inet firewalld. sudo nft flush ruleset memadamkannya, pelayan kemudiannya terdedah kepada segala-galanya, dan firewall-cmd --list-all masih mencetak konfigurasi yang anda inginkan, kerana firewalld melaporkan apa yang ia percayai dan bukannya apa yang dipegang oleh kernel. sudo firewall-cmd --reload memasang semula peraturan tersebut. Tulis peraturan dengan firewall-cmd supaya ia kembali selepas muat semula.
Dua pengurus firewall pada satu pelayan. Memasang ufw atau iptables-services di samping firewalld memberikan anda dua program yang menulis peraturan tanpa pengetahuan antara satu sama lain, dan pemenangnya bergantung pada servis mana yang bermula terakhir. Pilih satu. Pada Rocky dan AlmaLinux, firewalld adalah yang mempunyai sokongan pengedaran.
Firewall penyedia di hadapan kotak. Banyak panel VPS mempunyai firewall rangkaian yang berasingan. Jika --list-all menunjukkan port terbuka dan sambungan dari luar masih gagal, semak panel sebelum anda menukar apa-apa pada pelayan. Ia juga berfungsi sebaliknya: peraturan panel yang terbuka tidak melakukan apa-apa sementara firewalld menolak paket tersebut.
Menjalankan firewall-cmd tanpa sudo. Setiap perubahan memerlukan root. Tanpanya, permintaan ditolak oleh semakan kebenaran dan tiada apa-apa yang diubah, yang sekilas pandang kelihatan seperti perintah itu diabaikan.
Enam perintah meliputi kebanyakan hari: --list-all untuk membaca status, --permanent --add-service atau --add-port untuk membuka sesuatu, --permanent --remove-service untuk menutupnya, --reload untuk menggunakan fail yang disimpan, dan --runtime-to-permanent selepas satu pusingan eksperimen. Zonnya ialah public, flagnya ialah --permanent, dan satu-satunya semakan yang jujur datang daripada mesin lain.
FAQ
Mengapakah peraturan firewalld saya hilang selepas but semula?
Peraturan tersebut hanya dimasukkan ke dalam konfigurasi masa jalan (runtime). sudo firewall-cmd --add-service=http berkuat kuasa serta-merta tetapi akan dibuang pada muat semula atau but seterusnya, kerana konfigurasi yang disimpan dalam /etc/firewalld/zones/public.xml tidak pernah diubah. Tambahkan --permanent dan kemudian jalankan sudo firewall-cmd --reload. Untuk mengekalkan peraturan yang telah anda tambah secara manual, jalankan sudo firewall-cmd --runtime-to-permanent, yang menyalin set peraturan semasa ke dalam fail simpanan.
Mengapakah tiada perubahan selepas saya menambah peraturan dengan --permanent?
Kerana --permanent hanya menulis fail tersebut dan tidak mengganggu firewall yang sedang berjalan. Port kekal tertutup sehingga sudo firewall-cmd --reload memuatkan konfigurasi yang disimpan ke dalam kernel. Bandingkan sudo firewall-cmd --list-services dengan sudo firewall-cmd --permanent --list-services: jika senarai simpanan mengandungi entri yang tiada dalam senarai semasa, bermakna anda belum melakukan muat semula (reload).
Patutkah saya menggunakan --add-service atau --add-port?
Gunakan --add-service apabila terdapat nama yang tersedia untuk servis yang anda jalankan. Ia menyatakan tujuan, dan sudo firewall-cmd --info-service=https menunjukkan dengan tepat port mana yang diliputi oleh nama tersebut. Gunakan --add-port apabila tiada definisi untuk servis anda, atau apabila ia mendengar pada port bukan standard. Servis ssh hanya bermaksud 22/tcp, jadi jika SSH dialihkan ke 2222, anda memerlukan --add-port=2222/tcp berserta label SELinux untuk port tersebut.
Mengapakah kontena Docker saya boleh dicapai sedangkan firewall-cmd menunjukkan port tersebut tertutup?
Port yang diterbitkan (published) ditulis semula oleh peraturan NAT milik Docker sendiri dan dihalakan ke kontena, jadi paket tersebut tidak pernah dihantar ke hos, manakala senarai servis dan port dalam zon hanya meliputi paket yang dihantar ke hos. Kontena menjawab permintaan daripada internet walaupun --list-all tidak menunjukkan apa-apa. Terbitkan ke loopback sebaliknya, dengan docker run -d -p 127.0.0.1:8080:80 nginx, dan letakkan reverse proxy di hadapannya.
Bolehkah saya memasang ufw pada Rocky Linux sebagai ganti firewalld?
Dua pengurus firewall pada satu pelayan akan menulis peraturan tanpa pengetahuan antara satu sama lain, dan set peraturan yang bertahan bergantung pada servis mana yang bermula terakhir. firewalld ialah alat yang disokong pada Rocky Linux dan AlmaLinux, ia sudah dipasang, dan ia memacu backend nftables yang sama seperti yang akan dipacu oleh ufw. Pelajari zon lalai dan flag --permanent sekali sahaja dan anda sudah menguasai keseluruhan alat tersebut.