
私は RHEL 8 で firewalld を使用しており、いくつかの nftable ルールも追加する必要があります。
(nftableルールは、CentOS 8 を nft と firewalld を備えた NAT ルーターとして使用 - TFTP を通過させるにはどうすればよいですか?)
実行中のファイアウォールでは、nft -f コマンドを使用するとうまく機能します。
ただし、再起動するとこれは失われます。
のRedHat ドキュメント(有料) では、再起動時にルールをロードするために nftables.service サービスを使用することが提案されていますが、これは、firewalld と連携しては機能しません。2 つのサービスは競合しているとリストされており、競合していなくても、firewalld は nftable ルールをフラッシュする可能性があります。
再起動時に nftable ルールをロードする別の方法はありますか?
答え1
のファイアウォールユーティリティを使用する場合nftablesバックエンド、所属していないテーブルはフラッシュしません:
ファイアウォールのルールのみをフラッシュする
nftablesは名前空間(テーブル経由)を許可しているためファイアウォールルールの完全なフラッシュは実行されなくなりましたルールをフラッシュするのは ファイアウォールテーブル。これにより、firewalld が再起動または再ロードされたときに、カスタム ユーザー ルールまたは他のツールによってインストールされたルールが予期せず消去されるシナリオを回避できます。
他のテーブルを管理する場合も同様に行う必要があります。
実は前の回答ですでに行われています。nftablesルールは冪等的に削除するのみ独自のテーブル: handletftp
。
残念なことに、それは当てはまりませnftables.service
ん停止アクション:
ExecStop=/sbin/nft flush ruleset
systemdサービスの停止部分が、ジョブの実行中にすべてのルールを直接フラッシュしないようにする必要があります。このジョブは専用のnftablesルール停止アクション。
そこで、実用的な方法を紹介します。 を複製し (例: systemctl cat nftables.services
)、に配置するnftables.service
インスタンス化されたバージョンに変更します。[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
上記で使用した専用の構成ディレクトリを作成します。
mkdir -p /etc/nftables/idempotent
定義された各テーブルに対して、常にこのように開始するルールを配置します。これにより、ルールのロードは他のテーブルとは独立し、べき等性ip foo
(表との例bridge bar
):
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
table ip foo {
...
}
table bridge bar {
....
}
または、ファイルごとに 1 つのテーブルを使用します。このflush ruleset
ステートメントはグローバルであるため禁止されています。
テーブルが作成、削除、再作成される理由は、結果をべき等にするためです。存在しないテーブルを削除するとエラーになり、読み込み全体がアトミックに失敗しますが、既存のテーブルを定義せずに宣言すると(空のテーブルを追加することで)、失敗することはなく、何も起こりません。空にする以外は以前に存在しなかった場合。どちらの場合も(起動時に存在せず、リロード時に存在)消去これで、テーブルを実際に定義する場所がすぐに残ります。これらすべてが同じトランザクションで行われ、依然としてアトミックです。パケットが欠落している状態で評価されることはありません。ip フーこの間にテーブルが存在していた場合。
準備する停止上記のバージョンは削除のみを行います (ここでの空の宣言は厳密には必要ではなく、テーブルが 1 つしかない場合は削除できますが、テーブルが複数ある場合は保持する必要があります。失敗はトランザクション全体に対して発生します)。
table ip foo
delete table ip foo
table bridge bar
delete table bridge bar
そしてすべてを所定の場所に置きます:
/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft
これは、次の方法でアクティブ化できます。
systemctl enable --now local-idempotent-nft@foobar
前の OP の質問からの例:
で/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"
}
}
で/etc/nftables/idempotent/stop-handletftp.nft
table ip handletftp
delete table ip handletftp
有効化と起動:
systemctl enable --now local-idempotent-nft@handletftp
止める:
systemctl stop local-idempotent-nft@handletftp
残るのはファイアウォールのルールが適用されます。同様に、停止または再起動ファイアウォールこれらのルールはそのまま残ります。
おそらく改善すべき点があるでしょう:
- nftables持っています含む定型文の重複を避けるために何らかの方法で使用できるステートメント。
- TFTPに関する具体的な例は、
nf_nat_tftp
自動的にロードされない(nf_conntrack_tftp
ルール内の参照から自動的にロードされるか、またはファイアウォール明示的にロードされますnf_nat_tftp
。したがって、関連はありますが、厳密にはnftables構成を念頭に置く必要があります (この 1 つの設定は、単に に配置できます/etc/modules-load.d/
)。