LoginSignup
5
3

More than 5 years have passed since last update.

複数の物理インタフェースに来ているトラフィックを1つの仮想インタフェースで見たい場合

Posted at

普通あまりない状況かもしれませんが、忘れると思うのでメモ。

概要

例えばスイッチでSPANしたい時に、スイッチが複数あってサーバ側も複数のインタフェースに繋がないといけない時があるかと思います。
1つのセッション内で別スイッチ通るとサーバ側の別インタフェースに到達するので、NetFlowとか取ろうとすると困ります。
別インタフェースでもうまく扱ってくれるプログラムなら良いですが、自分が使ったものは別インタフェースに来たら別フローに分かれてしまって困りました。
サーバ側で何とか仮想インタフェース1つで受けられたらなぁと思い試行錯誤した時のメモです。

環境

  • OS
    • CentOS 6.5

設定

まず、bondingでいけるだろうと思って試しました。
bondingは送信時はうまくいくのですが、2つのインタフェースでpromiscuousに受けている場合にbond0とかでうまく受信できませんでした。
モードとか色々変えれば出来るかもしれないので、ご存じの方がいたら教えてください。

最終的に tc コマンドを使ってLinux内でミラーリングしました。
tc は以前から使っていましたが、遅延発生させたりという用途だったのでミラーリング出来るのは知りませんでした。
mirred というactionがあり、それを使うとうまくできました。

今回はeth0とeth1があり、それらをdummy0にミラーリングすることにします。

まずdummy0インタフェースを作ります。

# vim /etc/sysconfig/network-scripts/ifcfg-dummy0
DEVICE=dummy0
BOOTPROTO=none
ONBOOT=yes
PROMISC=yes
# service network restart

次にeth0とeth1を一応promiscuous modeにしておきます。
必要ない気がしますが、一応やってます。

# ifconfig eth0 promisc
# ifconfig eth1 promisc

永続化したい場合は設定に書いておけば良いです。

# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
PROMISC=yes

最後に、ミラーリングの設定をします。

# 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 dummy0
# tc qdisc add dev eth1 ingress
# tc filter add dev eth1 parent ffff: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 1:1 \
   action mirred egress mirror dev dummy0

これで完了です。

dummy0で見ると、eth0とeth1のパケットが流れてきていることがわかります。

# tcpdump -i dummy0

参考URL

5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3