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ミラー'mirror
砂redirect
。
また、小さな詳細についても議論しました。これは、イーサネットソースアドレスを新しいイーサネット送信インターフェイスの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
}
}