RHEL / CentOS Şimdi sistem önyüklemesinde güvenlik duvarına nftable kurallar eklemek için?

Dec 15 2020

RHEL 8'de firewalld kullanıyorum ve birkaç nftable kuralı eklemem gerekiyor.

(Nftable kuralları, CentOS 8'in nft ve firewalld ile NAT yönlendirici olarak yanıtına dayanmaktadır - TFTP'yi nasıl geçecek? )

Çalışan bir güvenlik duvarında bu, nft -f komutuyla iyi çalışır.

Ancak bu, yeniden başlatma sırasında kaybolur.

RedHat belgeleri (ödeme duvarının arkasında) yeniden başlatmada kurallarını yüklemek için nftables.service hizmetini kullanılmasını önerir, ancak bu firewalld birlikte çalışmayı yapmaz. İki hizmet birbiriyle çelişen olarak listelenmiştir ve olmasalar bile firewalld muhtemelen nftable kuralları temizleyecektir.

Nftable kurallarının yeniden başlatıldığında yüklenmesini sağlamanın başka bir yolu var mı?

Yanıtlar

2 A.B Dec 15 2020 at 18:45

Firewalld yarar, kullanırken nftables arka uç, irade buna aittir yok değil floş tablolar :

Yalnızca güvenlik duvarının kurallarını temizleyin

Nftables ad alanlarına (tablolar aracılığıyla) izin verdiğinden, firewalld artık güvenlik duvarı kurallarını tam olarak temizlemiyor . Yalnızca güvenlik duvarı tablosundaki kuralları temizleyecektir . Bu, diğer araçlar tarafından yüklenen özel kullanıcı kurallarının veya kurallarının, güvenlik duvarı yeniden başlatıldığında veya yeniden yüklendiğinde beklenmedik bir şekilde silindiği senaryoları önler.

Aynı şey diğer tabloları yönetirken de yapılmalıdır.

Aslında önceki yanıtta, zaten bitti: nftables idempotently kuralları siler sadece kendi tablosunu: handletftp.

Ne yazık ki, durdurma eylemi nftables.serviceiçin durum böyle değil :

ExecStop=/sbin/nft flush ruleset

Sistemd hizmetinin durdurma kısmının, işi yaparken hala tüm kuralları doğrudan temizlemediğinden emin olunmalıdır. Bu iş , durdurma eylemi için atanmış nftables kurallarına devredilecektir .

İşte pratik bir yöntem: çoğaltın (örneğin :) systemctl cat nftables.servicesve yerleştirilecek nftables.servicesomutlaştırılmış bir sürüme dönüştürün :[email protected]/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

Yukarıda kullanılan özel konfigürasyon dizinini oluşturun:

mkdir -p /etc/nftables/idempotent

Tanımlanan her tablo için her zaman bu şekilde başlayan kurallar yerleştirin, böylece kuralların yüklenmesi diğer tablolardan ve idempotent'ten bağımsızdır (örneğin tablolar ip foove bridge bar):

table ip foo
delete table ip foo

table bridge bar
delete table bridge bar

table ip foo {
    ...
}

table bridge bar {
    ....
}

veya dosya başına yalnızca bir tablo kullanın. flush rulesetKüresel beri deyim yasaktır.

Bir tablonun yaratılmasının, silinmesinin ve yeniden oluşturulmasının nedeni idempotent sonucunu elde etmektir: Var olmayan bir tabloyu silmek bir hatadır ve atomik olarak tüm yüklemeyi başarısız kılar, mevcut bir tabloyu tanımlamadan bildirir (boş bir tablo ekleyerek) asla başarısız olmaz ve daha önce yoksa boş oluşturmak dışında hiçbir şey yapmaz . Her iki durumda da (önyüklemede yoktu, yeniden yüklemede mevcut) silme işlemi artık çalışabilir ve hemen ardından tabloyu gerçekten tanımlayacak yeri bırakabilir. Bütün bunlar aynı işlemde oluyor ve hala atomik: Bu sırada daha önce var olan hiçbir paket eksik bir ip foo tablosu ile değerlendirilmeyecektir .

Yukarıdakinin yalnızca silinecek bir durdurma sürümünü hazırlayın (burada boş bildirimler kesinlikle gerekli değildir ve yalnızca bir tablo varsa kaldırılabilir, ancak birden fazla tablo varsa saklanmalıdır: başarısızlık tüm işlem içindir):

table ip foo
delete table ip foo

table bridge bar
delete table bridge bar

ve her şeyi yerine koyun:

/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft

Bu artık şununla etkinleştirilebilir:

systemctl enable --now local-idempotent-nft@foobar

Önceki OP'nin sorusundan örnek:

içinde /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"
    }
}

İçinde /etc/nftables/idempotent/stop-handletftp.nft

table ip handletftp
delete table ip handletftp

Etkinleştirmek ve başlatmak:

systemctl enable --now local-idempotent-nft@handletftp

Durdurmak:

systemctl stop local-idempotent-nft@handletftp

güvenlik duvarının kurallarını yerinde bırakacaktır . Aynı şekilde, güvenlik duvarının durdurulması veya yeniden başlatılması bu kuralları yerinde bırakacaktır.

Muhtemelen yapılacak iyileştirmeler vardır:

  • nftables , standart metnin tekrarlanmasını önlemek için bir şekilde kullanılabilecek bir include ifadesine sahiptir.
  • TFTP ile ilgili spesifik örnek, yüklemenin nf_nat_tftpotomatik olarak yapılmayacağına dayanır ( bunun tersine nf_conntrack_tftp, kurallarda referanstan otomatik olarak yüklenir veya açıkça yüklenecek olan güvenlik duvarının aksine nf_nat_tftp). Bu nedenle, ilgili ancak kesin olarak nftable yapılandırmaları akılda tutulmalıdır (bu tek ayar basitçe yerleştirilebilir /etc/modules-load.d/).