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
    }
}

おすすめ記事