RHEL / CentOSシステム起動時にfirewalldにnftableルールを追加しますか?

Dec 15 2020

RHEL 8でfirewalldを使用していますが、いくつかのnftableルールも追加する必要があります。

(nftableルールは、nftおよびfirewalldを備えたNATルーターとしてのCentOS 8への回答に基づいています-TFTPを通過させる方法は?)

実行中のファイアウォールでは、これはnft-fコマンドでうまく機能します。

ただし、これは再起動時に失われます。

RedHatのドキュメント(ペイウォールの背後には)再起動時にルールをロードするためにnftables.serviceサービスを使用することを示唆しているが、これはfirewalldと一緒に仕事をしません。2つのサービスは競合していると記載されており、競合していない場合でも、firewalldはnftableルールをフラッシュする可能性があります。

再起動時にnftableルールをロードする別の方法はありますか?

回答

2 A.B Dec 15 2020 at 18:45

firewalldユーティリティ、使用しているときnftablesをバックエンド、それに属さないFLUSH TABLESしません。

Firewalldのルールのみをフラッシュする

nftablesは(テーブルを介して)名前空間を許可するため、firewalldはファイアウォールルールの完全なフラッシュを実行しなくなりました。これは、firewalldテーブルのルールのみをフラッシュします。これにより、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声明はグローバルであるため禁止されています。

テーブルが作成、削除、再作成される理由は、結果をべき等にするためです。存在しないテーブルを削除するとエラーになり、アトミックに読み込み全体が失敗し、既存のテーブルを定義せずに宣言します(空のテーブルを追加することにより)失敗することはなく、以前に存在していなかった場合は空にする以外は何もしません。どちらの場合も(起動時に存在しなかった、リロード時に存在した)、削除が機能するようになり、直後にテーブルを実際に定義する場所が残ります。これはすべて同じトランザクションで発生し、依然としてアトミックです。この間に以前に存在していた場合、欠落しているipfooテーブルでパケットが評価されることはありません。

削除するだけの上記の停止バージョンを準備します(ここでは、空の宣言は厳密には必要ではなく、テーブルが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

これにより、firewalldのルールがそのまま残ります。同様に、firewalldを停止または再起動すると、これらのルールはそのまま残ります。

おそらく改善すべき点があります。

  • nftablesには、ボイラープレートの重複を回避するために何らかの方法で使用できるincludeステートメントがあります
  • TFTPに関する特定の例は、ロードがnf_nat_tftp自動的に実行されないことに依存しています(nf_conntrack_tftpルール内の参照から自動的にロードされるか、明示的にロードされるfirewalldとは異なりますnf_nat_tftp)。したがって、関連しているが厳密ではないnftables構成を覚えておく必要があります(この1つの設定は単純に入れることができます/etc/modules-load.d/)。