web-dev-qa-db-ja.com

インターフェースから別のインターフェースへのパケットのコピー

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だけを使用してこれを達成する方法はありますか?または、これを機能させるためにアプリケーションを作成する必要がありますか?パケットを「コピー」するにはどうすればよいですか?

9
Emiliano

カーネルが十分に新しい場合は、 iptables --tee を使用して、eth0からキャプチャマシンにフレームを転送できます。

7
Gerald Combs

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
4
undefine

ネットでtcpbridgeを検索します。tcpbridgeはまさにその仕事です。仮想マシンとの通信にも使用できます。

3
Walter

rinetdmightのようなもの(TCPonly私は信じているので、ARP、レイヤー2などはないと思います)が、正直なところ、ポートミラーリング機能を持つ一部の管理対象スイッチを取得するか、そのボックスがWireshark、別のNIC=を追加し、2つのインターフェースをブリッジし、マシンAのeth0の前に配置し、専用のスニッフィングマシンを用意できます。

1
gravyface

イーサネットフレームを1つのインターフェイスから別のインターフェイスにコピーするデバイスはブリッジです。 Linuxシステムをブリッジとして機能するように構成できます。いくつかのドキュメントはここにあります:

ebtables を使用して、ブリッジドトラフィックにフィルタリングルールを適用できます。これは、レイヤー2トラフィックのiptablesに類似しています。

1
larsks

私のセットアップでは、マルチキャスト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

0
noel av

私のセットアップでは、マルチキャストTXトラフィックはiptablesによってマークされましたが、新しいルーティングテーブルを使用したポリシールーティングは機能しませんでした。ユニキャストTXパケットでは機能しましたが(元のパケットをeth0からeth5にリダイレクトします)。 tcを使用すると、eth0 mcastトラフィックをeth5に取得できますが、src macおよびsrc ipアドレスはeth0であるため、スイッチの学習で問題が発生します。

Eth0からeth5にリダイレクトするユニキャストおよびマルチキャストトラフィックのWORKSの下

参照: インターフェースから別のインターフェースへのパケットのコピー

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

トラフィック制御(tc)は非常に便利なLinuxユーティリティで、カーネルパケットスケジューラを構成できます。

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

クラスはツリーを形成し、各クラスには単一の親があります。クラスは複数の子を持つことができます。一部のqdiscsは、クラス(CBQ、HTB)のランタイム追加を可能にしますが、他の(PRIO)は静的な数の子で作成されます。クラスの動的な追加を可能にするQdiscsは、トラフィックがキューに入れられるサブクラスを0個以上持つことができます。

Qdiscs、クラス、およびフィルターの場合:

add:qdisc、クラス、またはフィルターをノードに追加します。すべてのエンティティについて、IDを渡すか、デバイスの「ルート」に直接アタッチすることにより、親を渡す必要があります。 qdiscまたはフィルターを作成するときは、handleパラメーターを使用して名前を付けることができます。クラスはclassidパラメータで名前が付けられます。

スケジューリングポリシーを表すツリーを作成し、PRIO qdisc(パケットスケジューラ)を使用します(他の利用可能なものを試すことができます)。

デバイスのルートに接続するqdiscs

man tc(8):

tc qdisc [追加|変更|置き換える|リンク|削除] dev DEV [親qdisc-id | root] [qdisc-idを処理] qdisc [qdisc固有のパラメーター]

tc qdisc add dev eth0ルートハンドル15:prio

これで、一方にトラフィックシェーピングポリシーがあり、もう一方にパケットマーキングがあります。 2つを接続するには、フィルターが必要です。

man tc-mirred(8):

ミラーリングされたアクションにより、パケットのミラーリング(コピー)またはリダイレクトが可能

(盗む)受信するパケット。ミラーリングは時々あるものです

スイッチポートアナライザー(SPAN)と呼ばれ、一般的に

フローを分析またはデバッグします。

tc ...アクションミラーリングDIRECTION ACTION [index INDEX] dev DEVICENAME

man tc-fw(8):

fw-fwmarkトラフィック制御フィルター

fwフィルターを使用すると、iptablesによって以前に設定されたfwmarkに基づいてパケットを分類できます。フィルターの「ハンドル」と同じ場合、

フィルター一致。 iptablesでは、CONNMARKを使用して、MARKターゲットまたは接続全体で単一のパケットをマークできます。

tc filter ... fw [classid CLASSID] [action ACTION_SPEC]

tcフィルター[追加|変更|置き換える|削除] dev DEV [親qdisc-id | root] protocol protocol prio priority filtertype [filtertype specific parameters] flowid flow-id

tc filter add dev eth0 parent 15:0 protocol ip prio 1 handle 0x2 fw action mirred egress mirror dev eth5

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ルート

0
noel av