Webフィルタリングテーブルを作成しました。台本に書きました。このスクリプトを常にロードすることはできません。テーブルを更新または削除すると、テーブルが存在しない場合は機能しません。更新または削除しないと、古いルールと新しいルールがマージされます。
テーブルがある場合は、どのように更新または削除できますか?
#!/usr/sbin/nft -f
flush table my_table
table ip my_table {
chain output {
type filter hook output priority 0; policy accept;
ip daddr 8.8.8.8 counter
ip daddr 1.1.1.1 counter
skuid "other" jump restrict_chain
skuid "d" jump d_chain
}
chain accept_chain {
nftrace set 1 counter accept
}
chain reject_chain {
nftrace set 1 counter reject
}
chain restrict_chain {
#type filter priority 0; policy drop;
counter
ip daddr 1.1.1.1 counter
oifname "lo" jump accept_chain
oifname != "lo" jump reject_chain
}
chain d_chain {
counter
}
}
ベストアンサー1
まず、空のテーブルを宣言します。テーブルがすでに存在する場合、エラーは発生せず、内容も変更されません。何も起こりません。存在しない場合は、空のテーブルが作成されました。すべての場合に存在するため、除去が可能です。これはすべて次のように実行できます。同じルールセット。
したがって、チェーンやルールなしでテーブルを宣言してから削除します(マニュアルページリフレッシュすると、チェーンとルールが更新されますが、チェーン自体は削除されずに空になり、名前が変更された古いチェーンまたはセットが保持されているか属性が変更された場合にクラッシュします。これnftables Wikiには削除とフラッシュに関する詳細情報があります。アクション。 )。これで実際に作成できます。同じでユニークルールセットファイル。これで、同じルールセットを最初にエラーを発生させることなく、複数回等しくロードできます。
#!/usr/sbin/nft -f
table ip my_table
delete table ip my_table
table ip my_table {
chain output {
type filter hook output priority 0; policy accept;
ip daddr 8.8.8.8 counter
# [...]
}
}
アップデート:十分に新しいカーネルとnftablesdestroy
また、同じべき等化効果を得るために最初の2つのコマンド([ add
] +)を置き換えることができる「存在する場合は削除」を意味するキーワードを受け入れます。delete
選択して使用してくださいinclude
準備ラインが多く、ルールセットを汚染したくない場合は、これらの準備ラインをすべて別々のファイルに保存するステートメントです。
チェーンレベルで同じことができます。つまり、同じテーブル内の他のチェーンを変更せずに、テーブルとそのチェーンが以前にここにあったと仮定したり要求したりすることなく実行できます。reject_chain
活性化の例ですNTRACE、他のテーブルやチェーンは削除されませんmy_table
。この例は実用的な用途ではなく、単なる例です。
#!/usr/sbin/nft -f
table ip my_table {
chain reject_chain {
}
}
delete chain ip my_table reject_chain
table ip my_table {
chain reject_chain {
nftrace set 1 counter reject
}
}
互換性注:以下のように正しく機能するには、カーネル<3.18を更新して削除する必要があります。説明したウィキペディアで。これ(およびそれに対応するチェーン)は、すべてのカーネルバージョンでも機能します。
table ip my_table
flush table ip my_table
delete table ip my_table