KVM の 1 台の仮想化ホストの中の複数のゲスト間でネットワーク分断を発生させる

とあるシステムの検証用の環境で 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 スプーフィングなどの面白げなツールが含まれているので、とりあえずいれておくと良い一品かもしれません。