普通あまりない状況かもしれませんが、忘れると思うのでメモ。
概要
例えばスイッチで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