とあるシステムの検証用の環境で 1 台のホストの中で複数のゲストでクラスタリングしており、そのノード間でネットワーク分断を発生させたかったときのメモ。
LANケーブルを抜こうにも抜くべきケーブルがありません。
ebtables
ぱっと思いついたのがこの方法、KVM + libvirt で仮想化しているならホストで ebtables が有効になっていると思うので、
lsmod | grep ebtables # ebtables
まずゲストの I/F を調べて、
virsh domiflist sv01 # vnet1 virsh domiflist sv02 # vnet2
ebtables でこれらの通信を DROP します。
ebtables -A FORWARD -j DROP -i vnet1 -o vnet2
戻すときは↑で追加したもの以外にルールがないことを確認のうえで、
ebtables-save
-F
でルールを削除します。
ebtables -F FORWARD
もし↑で追加したもの以外にルールがあるなら -D
でルール番号を指定して削除する必要があります。
brctl
試していないですけど、brctl でゲストの仮想 I/F をブリッジから引っこ抜いても OK だと思います。
btcrl delif br0 vnet1
次のように戻します。
btcrl addif br0 vnet1
この方法はそのゲストの I/F が完全に死ぬのでそのゲストに ssh とかも繋がらなくなってしまうのが難点です。
(virsh console
とかでならつながる)
tcpkill
試していないですけど、tcpkill があれば tcpdump と同じような記法でパケットを Reject させられるようです。
CentOS 7 なら dsniff
パッケージを入れると一緒に入ります。
yum install -y dsniff
仮想化のホストではなくゲスト上で次のように分断させたい通信内容を tcpdump のパターンと同じように記述します。
tcpkill -i any host 192.0.2.123
dsniff
には他にも ARP スプーフィングなどの面白げなツールが含まれているので、とりあえずいれておくと良い一品かもしれません。