私は以下を持っていますnftables.conf
:
table inet nat {
set blocked {
type ipv4_addr
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip daddr @blocked counter drop;
oifname "ppp0" masquerade;
iifname "br-3e4d90a574de" masquerade;
}
}
セットblocked
は名前付きセット動的に更新できます。このセット内でブロックするIPセットを持ちたいので、各IPに対して更新されます。N分。保存する原子性、そうです。いいえupdateblock.sh
リストを更新するには、次の()を使用します。
#!/bin/bash
sudo nft flush set inet nat blocked
sudo nft add element inet nat blocked {$nodes}
代わりにblockediplist.ruleset
:
#!/usr/sbin/nft -f
flush set inet nat blocked
add element inet nat blocked { <example_ip> }
私は次の一連のコマンドを使用します。
nft -f /etc/nftables.conf
nft -f blockediplist.ruleset
ただし、これらの変更はblockediplist.ruleset
すぐには適用されません。これらのIPがnft list ruleset
およびに存在するため、ルールセットに新しいIPが含まれていることがわかりますnft list set inet nat blocked
。ただ使用してもnft add element inet nat blocked { <IP> }
IPがブロックされるわけではありません。
別のアプローチは、新しいコレクションを定義し、nftables.conf
コレクション全体を再ロードすることです。しかし、これは良くなく非効率的な方法だと思います。
blockediplist.ruleset
変更をすぐに適用する方法はありますか?
修正する:pingをしていないIPをブロックするとすぐにブロックされるという事実を見つけました。ただし、ブロックリストにIPが追加されると、ブロックに時間がかかります。 IPを設定しようとするとnetdev ingress
すぐにブロックされます。おそらく、この調査方法によって何かが明らかになるかもしれません。
ベストアンサー1
natフック(他のすべてのフックと同様)は、Netfilterのnftablesに提供されています。 NATフックは特別です。接続の最初のパケットだけがこのフックを通過します。 conntrackによってすでに追跡されている接続の他のすべてのパケットは、NATフックを通過せずに直接送信されます。つながるこのフロー用に設定されたNAT操作を続行します。
これは、削除にこのフックを絶対に使用しないでください。これは、NATの有無にかかわらず、すでに追跡されている接続には影響しません。
トラフィックを落とす部分のフックタイプをからに変更するだけですtype nat
。type filter
反対側にiptablesテーブルは1つのフックタイプに限定されません。実際、この場合は複数のタイプを使用する必要があります。置くテーブルはローカルであり、2つのテーブル間で共有することはできません。同じ理由で、このテーブルはinet nat
NATのみを実行するわけではないため、論理的に呼び出されてはいけません(ただし、名前を変更しませんでした)。
だから結局:
nftables.conf
:
table inet nat {
set blocked {
type ipv4_addr
}
chain block {
type filter hook postrouting priority 0; policy accept;
ip daddr @blocked counter drop
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
oifname "ppp0" masquerade
iifname "br-3e4d90a574de" masquerade
}
}
今:
すべてのパケットはチェーンによって検査されるため、
inet nat block
グループblocked
は次のトラフィックが影響を受けるのを待たずにトラフィックに即座に影響を与える可能性があります。通常どおり、新しいフローの最初のパケット(一時的なconntrackステータスNEW)のみがチェーンを通過します
inet nat postrouting
。
また、iifname "br-3e4d90a574de" masquerade;
十分に新しいカーネル(Linuxカーネル >= 5.5):以前は、ルーティング後にフックが出るインターフェイスによるフィルタリングのみをサポートしていました。さらに、これはDocker関連のインターフェイスのように見え、この種のルールを追加するとブリッジインターフェイスを参照するため、Dockerと対話することができます(たとえば、同じネットワーク上の2つのコンテナ間のNATトラフィックなど)。これはDockerがブリッジされたトラフィックを可能にするためです。nftables(またiptables)ロードしてbr_netfilter
基準寸法)。