tagged VLAN を仮想マシンの NIC まで引き込む方法

tagged VLAN を仮想マシンNIC まで引き込む設定方法。

要は外から入ってきた tagged パケットを、そのまま仮想マシンNIC まで渡したいということ。
(tagged packet) -> Host:eth -> VM:eth -> (tagged packet)

結論から書くと、普通に bridge すると、すんなり VM まで tagged パケットが上がった。

環境

  • CentOS 6.2(64bit) + KVM + 標準Linux bridge。
  • ホストも仮想マシンCentOS 6.2(64bit)
  • ホストマシンの eth0 は管理アクセス用。eth1 は tagged VLAN なネットワークにぶら下がる用。
  • 仮想マシンNICの対応も同
  • eth0 系は設定済が前提

パケットの流れはこんな感じ。
(tagged packet) -> Host:eth1 -> Host:br1 -> VM:eth1 -> (tagged packet)

ホストマシン側の設定

tcpdump で tagged packet が eth1 に上がってきてるか確認

# tcpdump -i eth1 -e
09:49:29.733814 XX:XX:XX:XX:XX:XX (oui Unknown) > XX:XX:XX:XX:XX:XX (oui Unknown), ethertype 802.1Q (0x8100), length 91: vlan 10, p 0, ethertype IPv4, foo.bar.jp.60597 > 224.0.0.252.hostmon: UDP, length 25
09:49:29.734303 XX:XX:XX:XX:XX:XX (oui Unknown) > XX:XX:XX:XX:XX:XX (oui Unknown), ethertype 802.1Q (0x8100), length 71: vlan 20, p 0, ethertype IPv4, foo.bar.jp.60032 > 224.0.0.252.hostmon: UDP, length 25

eth1 側(VLAN側)の設定

# vi /etc/sysconfig/network-script/ifcfg-eth1
DEVICE="eth1"
HWADDR="A4:11:2B:A9:C7:15"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br1"

tagged のまま素通しする br1 の設定

# vi /etc/sysconfig/network-script/ifcfg-br1
DEVICE="br1"
BOOTPROTO="none"
HWADDR="A4:11:2B:A9:C7:15"
ONBOOT="yes"
TYPE="Bridge"

設定を有効にするため、 network restart

# /etc/init.d/network restart
インターフェース br0 を終了中:                             [  OK  ]
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                          [  OK  ]
インターフェース eth1 を活性化中:                          [  OK  ]
インターフェース br0 を活性化中:
br0 のIP情報を検出中... 完了。
                                                           [  OK  ]
インターフェース br1 を活性化中:                           [  OK  ]

仮想マシン側の設定

仮想マシンのconfigでNICを追加。追加したNICの接続先は、先に設定したbr1。
仮想マシンを起動して、ホストマシン側でbridgeの状態を確認すると、次のようになっているはず。

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.e4115ba9c514       no              eth0
                                                        vnet0
br1             8000.e4115ba9c515       no              eth1
                                                        vnet1

仮想マシンLinux にログインして、追加した eth1 の設定を入れる。

# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
HWADDR="52:54:00:8F:32:AB"
ONBOOT="yes"
TYPE="Ethernet"

eth1 を有効にする。

# ifconfig eth1 up

tcpdump で tagged packet が上がってきてるか確認

# tcpdump -i eth1 -e
09:50:10.361190 XX:XX:XX:XX:XX:XX (oui Unknown) > XX:XX:XX:XX:XX:XX (oui Unknown), ethertype 802.1Q (0x8100), length 64: vlan 10, p 0, ethertype ARP, Request who-has 192.168.1.1 tell 192.168.1.1, length 46
10:53:15.293586 XX:XX:XX:XX:XX:XX (oui Unknown) > Broadcast, ethertype 802.1Q (0x8100), length 64: vlan 20, p 0, ethertype ARP, Request who-has 192.168.1.1 tell 192.168.1.1, length 46

ここまでできたら、LinuxでタグVLAN | なんとかなりたい にあるように
仮想マシン内で untag してやればVLAN扱い放題に。

後書きのようなもの

Vyatta を仮想マシンで動かして〜という話はよく聞くものの、tagged VLAN を扱った情報がほとんど見あたらない。
Vyatta 自体で tagged VLAN を扱えるので、ホスト側では VLAN はスルーにしてゲストの Vyatta 側で好きなVLANを操って、
という形にした方が(少なくともサーバ内では)設定を一箇所に集めることができて管理が楽になるはず。
しかしながら、ホスト側で br0.xxx br0.yyy の様なデバイスを作り、untag したものをゲスト側に渡して…という情報しか見つけられなかったわけで、tagged packet をホスト内素通しでゲストまで届けられるのか?が疑問だった。


試してみて…すんなりゲストまでスルーされちゃった。と。
bridge の機能上、当たり前すぎるから誰も書いてなかったのかなーと思う次第。


tagged packet ---> eth0 -> br0 -> tap0 ---> VM nic こんな環境で、ホストに eth0.xxx ってデバイス
作ると、ホスト側で untag packet が入ってくるようになったり、結構柔軟だなーとか思ったり。


ホストの NIC を全部 bonding して、ホスト外とのやりとりは tagged packet だけ、って形もできそう。