単一のIPポートとUDPポートに向かう非常に限られた量のパケットトラフィックは同じIPですが、2番目のポートにミラーリングしたいと思います。閉じ込められていたhttps://superuser.com/questions/1593995/iptables-nftables-forward-udp-data-to-multiple-targetsしかし、nftableのdupステートメントは、他のIPにのみコピーを許可し、同じIPおよび他のポートにはコピーを許可しないようです。
たとえば、127.0.0.1ポート123へのトラフィックは127.0.0.1ポート456にコピーする必要があります。これが唯一の反復であるため、元のポート番号が失われる問題はありません。これで、127.0.0.1が「倍数」/発信インターフェイスではなく、レプリケーションの最終ターゲットであるため、このレプリケーションが可能かどうか疑問に思います。これをDNATと組み合わせる方法はありますか?
着信UDPトラフィックを使用してeBPFプローブをnetdevに接続する以外に、利用可能な他のメカニズムはありますか?
答え1
これは次の方法で行うことができます。nftablesそしてWeb開発者家族と入り口チェーンと繰り返す氏名。無限ループを防ぐには、マーカーを使用する必要があります。特定のユースケースに応じて、レプリケーションを次のように実行することもできます。出口(ここに位置しているのでループバックインターフェース、繰り返し出口パケットは次のように表示されます。入り口)しかし、これをサポートするにはカーネル> = 5.17が必要です。入り口長く使えました。
カーネル> = 4.10が必要です(状態の非保存UDP変更に対する正しいチェックサムサポートのため)。
# nft -f - <<'EOF'
table netdev t_dup # for idempotency
delete table netdev t_dup # for idempotency
table netdev t_dup {
chain c_ingress {
type filter hook ingress device "lo" priority filter; policy accept;
iif lo udp dport 123 meta mark != 1 meta mark set 1 dup to lo udp dport set 456
}
}
EOF
候補パケットがタグ付けされていることを確認し、タグ付けされていない場合にのみ処理します。タグを最初に設定すると、後でループが防止されます。
繰り返しです。マークはレプリカの一部です。sk_buff、また繰り返す
冗長パケットは、実際には変更されていないパケットです。同じ場所(
lo
)とポート123に送信されます。この
dup
声明はどんなものとも反対しています。iptables'ターゲットはTEE
ターゲットを含むターゲットではありません。ルール氏名を終了します。ルールは、パケットの状態非保存変更に続く。 UDPポートが456に変更されました。重複したパケットも到着しました入り口ただし、ラベルが付けられているため、ルールはこれを無視します。ループがブロックされました。
次のコマンドを使用して冗長ポートをテストできます。ソカット:
socat -u udp4-recv:456,bind=127.0.0.1 -
メモ:
コピーされたポートにリッスンしているポートがないと、ICMPポートは接続できませんが、このポート(456)はトランスポートアプリケーションが送信するポート(123)と一致しないため、ネットワークスタックはそれを無視します。
Webフィルタ入り口AF_PACKETの後に発生します。TCPダンプ変更されたポートや重複したパケットはキャプチャされません。
答え2
netflow/IPFix パケットに対してこれを行う必要があります。あなたの解決策を試しましたが、私にはうまくいきませんでした。
しかし、あなたからインスピレーションを受けてもう一つの答え、ついに働くことを得ました。カーネル 5.10 を使用して Debian 11 で実行するようにテストされました。
table ip mangle
delete table ip mangle
table ip mangle {
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
iifname "eth0" udp dport 6660 \
dup to 127.0.0.1 device lo udp dport set 6666 notrack \
dup to 127.0.0.1 device lo udp dport set 6667 notrack \
dup to 127.0.0.1 device lo udp dport set 6668 notrack
}
chain input {
type filter hook input priority mangle; policy accept;
iifname lo udp dport 6666 ip daddr set 127.0.0.1 notrack
iifname lo udp dport 6667 ip daddr set 127.0.0.1 notrack
iifname lo udp dport 6668 ip daddr set 127.0.0.1 notrack
}
}
これにより、eth0のUDP / 6660に到着するすべてのエントリがlocalhost UDPポート6666、6667、および6668にコピーされ、宛先が127.0.0.1に設定されます。一部のソフトウェアはそれが好きではないため、後者が必要です。