RHEL / CentOS Şimdi sistem önyüklemesinde güvenlik duvarına nftable kurallar eklemek için?
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
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.service
iç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.services
ve yerleştirilecek nftables.service
somutlaş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 foo
ve 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 ruleset
Kü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_tftp
otomatik olarak yapılmayacağına dayanır ( bunun tersinenf_conntrack_tftp
, kurallarda referanstan otomatik olarak yüklenir veya açıkça yüklenecek olan güvenlik duvarının aksinenf_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/
).