libvirtのnwfilterで仮想マシン(のNIC)に割り当てるIPを制限する

参考:

openvswitch installと設定 で挫折したようにopenvswitchは仮想OS再起動ごとにidが変わるから面倒だ〜思ってlibvirtをもう1回調べていたら見つけた。(というか前から/etc/libvirt/nwfilter の存在が気になってたというのもあるけど)

前回同様、目的は仮想マシンをroot権限付きで渡した場合に、任意にIPを変えられてると重複したりするので困るので何とかしたいっていう。確認したのはSL 6.1にyumでinstallしたlibvirt 0.8.7。

libvirt.org にあるように/etc/libvirt/qemu/仮想マシン名前.xml ファイルのinterfaceのところに

<interface type='bridge'>
  <mac address='52:54:00:56:44:32'/>
  <source bridge='br1'/>
  <!-- このip と -->
  <ip address='10.0.0.1'/>
  <target dev='vnet0'/>
  <model type='virtio'/>
  <!-- filterref を追加 -->
  <filterref filter='clean-traffic'/>
</interface>

もしくは

<interface type='bridge'>
  <mac address='52:54:00:56:44:32'/>
  <source bridge='br1'/>
  <target dev='vnet0'/>
  <model type='virtio'/>
  <!-- filterref の中にip を追加 -->
  <filterref filter='clean-traffic'>
    <parameter name='IP' value='10.0.0.1'/>
  </filterref>
</interface>

と追加する。

こんな風に書けばNICにつけれるIPアドレスを制限できるようだ。これで仮想マシン(の52:54:00:56:44:32のNIC)には10.0.0.1以外の任意のIPアドレスを割り当てても外部と通信できなくなる。

ちなみにopenvswitchを入れていると制限できないのは、たぶんbridge moduleが変っているから。

1つのNIC複数IPを許可

since 0.9.8 とあるので2011/12/17時点で最新のlibvirtならいけるっぽい。(未確認)

<devices>
  <interface type='bridge'>
    <mac address='00:16:3e:5d:c7:9e'/>
    <filterref filter='clean-traffic'>
      <parameter name='IP' value='10.0.0.1'/>
      <parameter name='IP' value='10.0.0.2'/>
      <parameter name='IP' value='10.0.0.3'/>
    </filterref>
  </interface>
</devices>

最新のlibvirtじゃない場合で複数のIPを割り当てる場合は、必要なIPごとにNICを作成すれば良い。