2つのイーサネットカード、つまりeth0とeth1が2つのまったく関係のないLANに接続されているLinuxシステム(Aとする)があります。
基本的にeth0は通常のアプリケーショントラフィックに使用され、eth1はデバッグ目的でのみ使用されます。デバッグとは、クロスケーブルを使用して、eth1がWiresharkを実行する別のLinuxボックス(Bとする)にリンクされていることを意味します。 WiresharkがAのeth0を移動するアプリケーションパケットを処理できるようにしたい。
基本的に私はcopy eth0インターフェースからインターフェースeth1にパケットを移動させて、ボックスBのWiresharkがパケットを盗聴できるようにする必要があります(何らかの理由で、LAN eth0に物理的にアクセスできない)。また、(何らかの方法でTCP/IPフィールドのみに基づいて)ルールに従ってeth0からeth1にコピーするパケットを指定する必要があるかもしれません。
また、Aを宛先とするパケットのサブセットのみをコピーしたいので、Aのeth0を無差別モードにする必要がないことにも注意してください。
Iptablesだけを使用してこれを達成する方法はありますか?または、これを機能させるためにアプリケーションを作成する必要がありますか?パケットを「コピー」するにはどうすればよいですか?
カーネルが十分に新しい場合は、 iptables --tee を使用して、eth0からキャプチャマシンにフレームを転送できます。
Tc mirredアクションを使用できます。例:着信トラフィックの場合:
tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: \
protocol all prio 2 u32 \
match u32 0 0 flowid 1:1 \
action mirred egress mirror dev eth1
発信トラフィックの場合:
tc qdisc replace dev eth0 parent root handle 10: prio
tc filter add dev eth0 parent 10: \
protocol all prio 2 u32 \
match u32 0 0 flowid 10:1 \
action mirred egress mirror dev eth1
ネットでtcpbridgeを検索します。tcpbridgeはまさにその仕事です。仮想マシンとの通信にも使用できます。
rinetdmightのようなもの(TCPonly私は信じているので、ARP、レイヤー2などはないと思います)が、正直なところ、ポートミラーリング機能を持つ一部の管理対象スイッチを取得するか、そのボックスがWireshark、別のNIC=を追加し、2つのインターフェースをブリッジし、マシンAのeth0の前に配置し、専用のスニッフィングマシンを用意できます。
イーサネットフレームを1つのインターフェイスから別のインターフェイスにコピーするデバイスはブリッジです。 Linuxシステムをブリッジとして機能するように構成できます。いくつかのドキュメントはここにあります:
ebtables を使用して、ブリッジドトラフィックにフィルタリングルールを適用できます。これは、レイヤー2トラフィックのiptables
に類似しています。
私のセットアップでは、マルチキャストTXトラフィックはiptablesによってマークされましたが、新しいルーティングテーブルを使用したポリシールーティングは機能しませんでした。ユニキャストTXパケットでは機能しましたが(元のパケットをeth0からeth5にリダイレクトします)。 tcを使用すると、eth0 mcastトラフィックをeth5に取得できます。srcmacおよびsrc ipアドレスがeth5のアドレスに変更されるため、スイッチの学習で問題が発生しません。カーネルパケットスケジューリングのすべてのカーネルサポートCONFIG_NET_SCHEDを有効にする必要があります
Eth0からeth5にリダイレクトするユニキャストおよびマルチキャストトラフィックのWORKSの下
Netfilterは、カーネル内のパケットを表す構造と直接対話するために使用できます。この構造であるsk_buffには、変更する「__u32 nfmark」と呼ばれるフィールドが含まれています。次に、TCはその値を読み取って、パケットの宛先クラスを選択します。
IP_ADDR_ETH0 = ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
iptables -t mangle -A OUTPUT -s $ {IP_ADDR_ETH0} -p udp --match multiport --dports 329,330 -o eth0 -j MARK --set-mark 2
スケジューリングポリシーを表すツリーを作成し、PRIO qdisc(パケットスケジューラ)を使用します(他の利用可能なものを試すことができます)。デバイスのルートに接続するqdiscs
tc qdisc add dev eth0ルートハンドル15:prio
これで、片側にトラフィックシェーピングポリシーがあり、反対側にパケットマーキングがあります。 2つを接続するには、フィルターが必要です。
refer man tc-mirred(8):mirredアクションは、受信したパケットのパケットミラーリング(コピー)またはリダイレクト(盗用)を可能にします。ミラーリングはスイッチポートアナライザー(SPAN)と呼ばれることもあり、フローの分析やデバッグに一般的に使用されます。
リファレンスマンtc-fw(8):fw-fwmarkトラフィック制御フィルターfwフィルターは、iptablesによって以前に設定されたfwmarkに基づいてパケットを分類することを許可します。フィルターの「ハンドル」と同一の場合、フィルターは一致します。 iptablesでは、CONNMARKを使用して、MARKターゲットまたは接続全体で単一のパケットをマークできます。
MAC_ADDR_ETH1 = cat /sys/class/net/eth1/address
IP_ADDR_ETH1 = ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
tc filter add dev eth0 parent 15:0 protocol ip prio 1 handle 0x2 fw action pedit ex munge eth src set $ {MAC_ADDR_ETH1} pipe\action pedit ex munge ip src set $ {IP_ADDR_ETH1} pipe\action mirred egress redirect dev eth1
上記の設定ルールを表示:tc qdisc show dev eth0 tc filter show dev eth0
上記の設定ルールの削除/設定解除:tc qdisc del dev eth0 root
私のセットアップでは、マルチキャストTXトラフィックはiptablesによってマークされましたが、新しいルーティングテーブルを使用したポリシールーティングは機能しませんでした。ユニキャストTXパケットでは機能しましたが(元のパケットをeth0からeth5にリダイレクトします)。 tcを使用すると、eth0 mcastトラフィックをeth5に取得できますが、src macおよびsrc ipアドレスはeth0であるため、スイッチの学習で問題が発生します。
参照: インターフェースから別のインターフェースへのパケットのコピー
http://wiki.linuxwall.info/doku.php/en:ressources:dossiers:networking:traffic_control
https://netbeez.net/blog/how-to-use-the-linux-traffic-control/
http://man7.org/linux/man-pages/man8/tc.8.html
man7.org/linux/man-pages/man8/tc-u32.8.html
http://man7.org/linux/man-pages/man8/tc-fw.8.html
man7.org/linux/man-pages/man8/tc-mirred.8.html
https://www.slideshare.net/suselab/linux-linux-traffic-control
IP_ADDR_ETH0 = ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
iptables -t mangle -A OUTPUT -s $ {IP_ADDR_ETH0} -p udp --match multiport --dports 329,330 -o eth0 -j MARK --set-mark 2
add:qdisc、クラス、またはフィルターをノードに追加します。すべてのエンティティについて、IDを渡すか、デバイスの「ルート」に直接アタッチすることにより、親を渡す必要があります。 qdiscまたはフィルターを作成するときは、handleパラメーターを使用して名前を付けることができます。クラスはclassidパラメータで名前が付けられます。
tc qdisc add dev eth0ルートハンドル15:prio
tc filter add dev eth0 parent 15:0 protocol ip prio 1 handle 0x2 fw action mirred egress redirect dev eth5
tc qdisc show dev eth0 tc filter show dev eth0
tc qdisc del dev eth0ルート