RHEL / CentOS Sekarang untuk menambahkan aturan nftable ke firewalld saat boot sistem?
Saya menggunakan firewalld di RHEL 8, dan perlu menambahkan beberapa aturan nftable juga.
(Aturan nftable didasarkan pada jawaban untuk CentOS 8 sebagai router NAT dengan nft dan firewalld - bagaimana cara mendapatkannya melewati TFTP? )
Dalam firewall yang sedang berjalan, ini bekerja dengan baik dengan perintah nft -f.
Namun, ini hilang saat reboot.
The dokumentasi RedHat (belakang paywall) menyarankan menggunakan layanan nftables.service untuk memuat aturan di reboot, tapi ini tidak bekerja bersama dengan firewalld. Kedua layanan terdaftar sebagai konflik, dan bahkan jika tidak, firewalld kemungkinan besar akan menghapus aturan nftable.
Apakah ada cara lain agar aturan nftable dimuat saat restart?
Jawaban
The firewalld utilitas, bila menggunakan nftables backend, akan tabel menyiram yang tidak milik itu :
Hanya hapus aturan firewalld
Karena nftables memungkinkan namespace (melalui tabel) firewalld tidak lagi melakukan pembersihan aturan firewall secara menyeluruh . Ini hanya akan menghapus aturan di tabel firewalld . Ini menghindari skenario di mana aturan atau aturan pengguna khusus yang dipasang oleh alat lain tiba-tiba terhapus saat firewalld dimulai ulang atau dimuat ulang.
Hal yang sama harus dilakukan saat mengelola tabel lain.
Sebenarnya dalam jawaban sebelumnya, itu sudah dilakukan: yang nftables aturan idempotently menghapus hanya meja mereka sendiri: handletftp
.
Sayangnya, itu tidak terjadi untuk nftables.service
untuk berhenti tindakan:
ExecStop=/sbin/nft flush ruleset
Seseorang harus memastikan bahwa bagian stop dari layanan systemd tidak secara langsung menghapus semua aturan saat masih melakukan pekerjaan. Pekerjaan ini akan didelegasikan ke dalam aturan nftables khusus untuk tindakan berhenti .
Jadi, inilah metode praktisnya: duplikat (misalnya systemctl cat nftables.services
:) dan ubah nftables.service
menjadi versi yang dipakai [email protected]
untuk dimasukkan /etc/systemd/system/[email protected]
:
[Unit]
Description=Idempotent nftables rules for %I
Wants=network-pre.target
Before=network-pre.target
[Service]
Type=oneshot
ProtectSystem=full
ProtectHome=true
ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# As the rules are idempotent, ExecReload is same as ExecStart
ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# The stop rules should only have the first boilerplate parts
ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Buat direktori konfigurasi khusus yang digunakan di atas:
mkdir -p /etc/nftables/idempotent
Tempatkan aturan yang ditentukan untuk setiap tabel, selalu dimulai seperti ini, sehingga memuat aturan tidak bergantung pada tabel dan idempoten lain (contoh dengan tabel ip foo
dan bridge bar
):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
table ip foo {
...
}
table bridge bar {
....
}
atau cukup gunakan satu tabel per file. The flush ruleset
pernyataan dilarang karena itu global.
Alasan tabel dibuat, dihapus, dan dibuat ulang adalah untuk mendapatkan hasil idempoten: sementara menghapus tabel yang tidak ada adalah kesalahan dan secara atomis akan membuat seluruh pemuatan gagal, mendeklarasikan tabel yang ada tanpa menentukannya (dengan menambahkan tabel kosong) tidak pernah gagal dan tidak melakukan apa pun kecuali membuatnya kosong jika tidak ada sebelumnya. Dalam kedua kasus (tidak ada saat boot, ada saat reload) delete sekarang dapat berfungsi, meninggalkan tempat untuk benar-benar mendefinisikan tabel setelahnya. Semua ini terjadi dalam transaksi yang sama dan masih bersifat atomik: tidak ada paket yang akan dievaluasi dengan tabel ip foo yang hilang jika ada sebelumnya selama ini.
Siapkan versi stop di atas yang hanya akan menghapus (di sini deklarasi kosong tidak sepenuhnya diperlukan dan dapat dihapus jika hanya ada satu tabel, tetapi harus disimpan jika ada lebih dari satu tabel: kegagalan untuk seluruh transaksi):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
dan meletakkan semuanya di lokasinya:
/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft
Ini sekarang dapat diaktifkan dengan:
systemctl enable --now local-idempotent-nft@foobar
Contoh dari pertanyaan OP sebelumnya:
di /etc/nftables/idempotent/handletftp.nft
:
table ip handletftp
delete table ip handletftp
table ip handletftp {
ct helper helper-tftp {
type "tftp" protocol udp
}
chain sethelper {
type filter hook forward priority 0; policy accept;
ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp"
}
}
Di /etc/nftables/idempotent/stop-handletftp.nft
table ip handletftp
delete table ip handletftp
Mengaktifkan dan memulainya:
systemctl enable --now local-idempotent-nft@handletftp
Menghentikannya:
systemctl stop local-idempotent-nft@handletftp
yang akan meninggalkan aturan firewalld . Demikian pula, menghentikan atau memulai ulang firewalld akan membiarkan aturan ini tetap berlaku.
Mungkin ada perbaikan yang harus dilakukan:
- nftables memiliki pernyataan include yang bisa digunakan entah bagaimana untuk menghindari duplikasi boilerplate.
- contoh spesifik tentang TFTP bergantung pada pemuatan
nf_nat_tftp
yang tidak akan dilakukan secara otomatis (berlawanan dengannf_conntrack_tftp
yang dimuat secara otomatis dari referensi dalam aturan atau berlawanan dengan firewalld yang akan memuatnf_nat_tftp
secara eksplisit). Jadi konfigurasi yang terkait tetapi non-ketat nftables harus diingat (pengaturan yang satu ini bisa dengan mudah dimasukkan/etc/modules-load.d/
).