nftables:セグメント間の冗長ブロードキャストパケット

nftables:セグメント間の冗長ブロードキャストパケット

4つの異なるネットワークセグメントに接続されたDebian Busterボックス(nftables 0.9.0、カーネル4.19)があります。ネットワークセグメントの3つは、UDPポート21027にブロードキャストして独自のローカルスキャンを実行するSyncthingを実行するデバイスの本拠地です。したがって、ブロードキャストがネットワークセグメントにまたがっていないため、これらのデバイスはすべて互いに「見る」ことができません。バスターボックス自体は同期クラスタに参加しません。

BusterボックスでSyncthingの検索サーバーまたはリレーサーバーを実行してこの問題を解決できますが、それを無効にするように求められます(デバイスの設定や他のサイトへのローミングのため)。だから私たちはnftablesベースのソリューションを探しています。私の考えでは、これは一般的には行われませんが、これがうまくいくためには、次のことが必要です。

  • UDP 21027からの着信パケットと一致します。
  • これらのパケットを確認する必要がある他のネットワークセグメントインターフェイスにコピーします。
  • 新しいネットワークセグメントのブロードキャストアドレスと一致するように、新しいパケットの宛先IPを変更します(検索プロトコルがそれに依存する可能性があるため、送信元IPを維持しながら)。
  • もう一度繰り返さずに新しい放送を発行します。

3つの追加セグメントのみがデバイスに参加します。すべてのサブネットマスクは/ 24です。

  • セグメントA(eth0、192.168.0.1)は渡さないでください。
  • セグメントB(eth1、192.168.1.1)はセグメントAにのみ渡されなければなりません。
  • セグメントC(eth2、192.168.2.1)はAとBに渡されなければなりません。

これまでの作業ルールに最も近いものは次のとおりです(簡潔にするために、他のDNAT / MASQおよびローカルフィルタリングルールは省略されています)。

table ip mangle {
    chain repeater {
        type filter hook prerouting priority -152; policy accept;
        ip protocol tcp return
        udp dport != 21027 return
        iifname "eth1" ip saddr 192.168.2.0/24 counter ip daddr set 192.168.1.255 return
        iifname "eth0" ip saddr 192.168.2.0/24 counter ip daddr set 192.168.0.255 return
        iifname "eth0" ip saddr 192.168.1.0/24 counter ip daddr set 192.168.0.255 return
        iifname "eth2" ip saddr 192.168.2.0/24 counter dup to 192.168.0.255 device "eth0" nftrace set 1
        iifname "eth2" ip saddr 192.168.2.0/24 counter dup to 192.168.1.255 device "eth1" nftrace set 1
        iifname "eth1" ip saddr 192.168.1.0/24 counter dup to 192.168.0.255 device "eth0" nftrace set 1
    }
}

カウンタはルールが満たされたことを示しますが、ルールがない場合、ブロードキャストdaddr setアドレスは元のセグメントと同じままです。nft monitor trace少なくとも一部のパケットは、正しい宛先IPを使用して意図したインターフェイスに到着しますが、ボックス自体の入力フックに到達し、セグメント内の他のデバイスには見えないことを示します。

ここで私たちが求めている結果は実際に達成可能ですか?では、どのような規則に従いますか?

答え1

nftablesはまだ利用可能です。Web開発者家族(代わりにアイピー家族)この場合のみ入り口必須(nftablesにはまだ出口書くことができる)。dup調和fwdのとれた行動入り口とつながるTCミラー'mirrorredirect

また、小さな詳細についても議論しました。これは、イーサネットソースアドレスを新しいイーサネット送信インターフェイスのMACアドレスに書き換えることです。実際にルーティングされたパケットを使用しているかのように、パケットなしで動作します。したがって、インターフェイスのMACアドレスを事前に知っておく必要があります。必要な2つを入れました(イーサネット0'砂イーサネット1's)の変数/マクロで定義を正しい値に編集する必要があります。

define eth0mac = 02:0a:00:00:00:01
define eth1mac = 02:0b:00:00:00:01

table netdev statelessnat
delete table netdev statelessnat

table netdev statelessnat {
    chain b { type filter hook ingress device eth1 priority 0;
        pkttype broadcast ether type ip ip daddr 192.168.1.255 udp dport 21027 jump b-to-a
        
    }

    chain c { type filter hook ingress device eth2 priority 0;
        pkttype broadcast ether type ip ip daddr 192.168.2.255 udp dport 21027 counter jump c-to-b-a
    }

    chain b-to-a {
        ether saddr set $eth0mac ip daddr set 192.168.0.255 fwd to eth0
    }

    chain c-to-b-a {
        ether saddr set $eth1mac ip daddr set 192.168.1.255 dup to eth1 goto b-to-a
    }
}

答え2

編集:後でこの質問を探している人にABが許可する答えは、純粋なnftソリューションを提供します。

ABの提案のおかげで、これは純粋なnftablesルールの代わりにtcを使用して機能します。

tc qdisc add dev eth2 ingress
tc filter add dev eth2 ingress \
    protocol ip u32 \
    match ip dst 192.168.2.255 \
    match ip protocol 17 0xff \
    match ip dport 21027 0xffff \
    action nat ingress 192.168.2.255/32 192.168.0.255 \
    pipe action mirred egress mirror dev eth0 \
    pipe action nat ingress 192.168.0.255/32 192.168.1.255 \
    pipe action mirred egress redirect dev eth1

tc qdisc add dev eth1 ingress
tc filter add dev eth1 ingress \
    protocol ip u32 \
    match ip dst 192.168.1.255 \
    match ip protocol 17 0xff \
    match ip dport 21027 0xffff \
    action nat ingress 192.168.1.255/32 192.168.0.255 \
    pipe action mirred egress redirect dev eth0

これらのフィルタについて私が理解したのは、UDPポート21027の着信ブロードキャストパケットと一致し、それを予想される他のすべてのサブネットのブロードキャストアドレスにNATしてから(変更される送信元IPではなくingress宛先IPの変更nat egress)、コピー/リダイレクトNATed転送を送信することです。パケットを別のインターフェイスの出力キューに送信します。

tcを初めて使用する場合、これが問題を解決するための最良の方法ではないかもしれませんが、通知ブロードキャストがセグメント全体に伝播する可能性があります(Syncthingは新しいノードを見つけてうれしく思います)。

関連情報