RHEL / CentOS Sekarang untuk menambahkan aturan nftable ke firewalld saat boot sistem?

Dec 15 2020

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

2 A.B Dec 15 2020 at 18:45

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.serviceuntuk 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.servicemenjadi 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 foodan 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 rulesetpernyataan 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_tftpyang tidak akan dilakukan secara otomatis (berlawanan dengan nf_conntrack_tftpyang dimuat secara otomatis dari referensi dalam aturan atau berlawanan dengan firewalld yang akan memuat nf_nat_tftpsecara eksplisit). Jadi konfigurasi yang terkait tetapi non-ketat nftables harus diingat (pengaturan yang satu ini bisa dengan mudah dimasukkan /etc/modules-load.d/).