nftables 名前付きセット更新遅延

nftables 名前付きセット更新遅延

私は以下を持っています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 nattype filter反対側にiptablesテーブルは1つのフックタイプに限定されません。実際、この場合は複数のタイプを使用する必要があります。置くテーブルはローカルであり、2つのテーブル間で共有することはできません。同じ理由で、このテーブルはinet natNATのみを実行するわけではないため、論理的に呼び出されてはいけません(ただし、名前を変更しませんでした)。

だから結局:

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基準寸法)。

おすすめ記事