nftablesを使用してポート範囲内のすべてのUDPトラフィックをコピーする方法

nftablesを使用してポート範囲内のすべてのUDPトラフィックをコピーする方法

複数のソース間の待ち時間を測定するために、ポート8000​​-8900 / udpのすべてのトラフィックを別のポート範囲または別の仮想デバイスにコピーしようとします。

iptablesTEEオプションがあることを知っていますが、私が見つけた例は私には適していません。

答え1

あなたはそれを使用することができますデーモンロガー、Sourcefire創設者Martin Roeschによって開発されたツールです。デフォルトでは、このツールはパケットをコピーできるソフトTAPを生成します。あなたにとって重要なスイッチは、-iスニッフィング入力インターフェイスと-oパケットが吐き出される出力インターフェイスです。

ループバックを使用したくない場合は、ダミーインターフェイスを作成できます。これは、特に分析のためにパケットキャプチャを汚染したくない場合に推奨される方法です。この例では、という仮想インターフェイスを作成し、dummy0IPアドレスを割り当てます192.168.1.150/24

$ sudo modprobe dummy
$ sudo sh -c 'echo "dummy" >> /etc/modules'
$ sudo sh -c 'echo "
auto dummy0
iface dummy0 inet static
address 192.168.1.150
netmask 255.255.255.0" >> /etc/network/interfaces'

daemonloggerその後、物理インターフェイスが次のようになると仮定して実行できます。eth0

$ sudo daemonlogger -i eth0 -o dummy0

引用:https://talosintelligence.com/daemon

答え2

解決策は、パケットをコピーする別の宛先アドレスを作成することです。

sudo ip addr add 10.0.0.1/24 dev lo

この例では、無限パケットループを防ぐために、ループバックではなくインターフェイスのポート8000​​〜8100でUDPパケットを一致させます。パケットはコピーされ、10.0.0.1にルーティングされたインターフェイスに転送されます。この時点では、パケットは変更されておらず、元の送信元アドレスと宛先アドレスを保持します。

その後、ループバックインターフェイス上のすべてのパケットを個別にフィルタリングし、宛先IPアドレスを独自に設定して、デバッグツールが10.0.0.1:8000-8100を受信して​​パケットを受信できるようにします。

#!/usr/sbin/nft -f

table ip mangle {
    chain prerouting {
        type filter hook prerouting priority mangle; policy accept;
        iifname != lo udp dport 8000-8100 dup to 10.0.0.1 device lo notrack
    }

    chain input {
        type filter hook input priority mangle; policy accept;
        iifname lo udp dport 8000-8100 ip daddr set 10.0.0.1 notrack
    }
}

パケットを監視するコマンドの例:nc -v -k -u -l 10.0.0.1 8000

掃除するには実行してください。

sudo ip addr delete 10.0.0.1/24 dev lo
sudo nft flush ruleset

スクリーンショットでは、ホスト192.168.1.50は192.168.1.2:8000にパケットを送信し、パケットが複製されました。 192.168.1.2:8000のアプリケーションが送信者に応答しました。 Wiresharkは更新された宛先アドレスを表示しません。

Wiresharkログ

関連情報