OpenVZ で仮想イーサネットデバイス (2)
OpenVZ で仮想イーサネットデバイス(1) では,ハードウェアノード (HN) 上でルーティングを行って,コンテナ (CT) の外部との通信を行いましたが,一々ルーティングなってやってられるか! ってことで,ブリッジを使った方法の試してみました.
- 以下の例は vzctl が 3.0.23 以上で使えるようです.ただ,コマンドに頼らないで自分で設定をやれば,もっと古いバージョンでもいけます.
- HNにブリッジを作成します.
# yum install bridge-utils
# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.0.131
GATEWAY=192.168.0.2
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Bridge
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
BRIDGE=br0 - CT に eth0 というデバイスを作成します (eth0の部分は作成したいデバイス名,br0 は CT 用のインターフェースが作成されたとき,そのデバイスをアタッチするブリッジ).
# vzctl set 50 --netif_add eth0,,,,br0 --save
ここで MAC アドレスなども指定可能ですが,とりあえず最新の OpenVZ 環境だと,自動的に適当な MAC アドレスを生成して振ってくれるようです. - /etc/vz/vznet.conf というファイルを以下の内容で作成します.
#!/bin/bash
これで vzctl start (CTID) を実行した時に,自動的にこのスクリプトが実行されます.このスクリプトは /etc/sysconfig/vz-scripts/(CTID).conf ファイルの中身の NETIF 行を読んで,ブリッジ名を取得し,CT がスタートしたときに作成される veth(CTID).0 というインターフェースをブリッジにアタッチします.
EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr" - CT 内の設定も行います.これは (Redhat/CentOS 系であれば) 普通に /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成すれば OK です.例えば
DEVICE=eth0
LAN 内に DHCP サーバがあれば,ちゃんとアドレス割当たります (venet 形式だと L3 だから CT で DHCP クライアント動かしてアドレス取得は無理だった).
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet - CTをスタートさせます.
# vzctl start 50
この CT 用の仮想インターフェースが HN 上に作成され,ブリッジにアタッチされています.# ifconfig
vzctl start の時に以下のようなエラーが出るみたいですが,ここではブリッジを設定してアタッチしているので,proxy_arp も forwarding も不要で,問題はないようです.(このエラーを出なくするには ifconfig veth50.0 0 とかを値をセットする前に実行すればよいはず)
: (snip)
veth50.0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet6 addr: fe80::xxx:xxx:xxx:xxx/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:3 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0018518264bc no veth50.0
eth0/usr/sbin/vznetaddbr: line 34: /proc/sys/net/ipv4/conf/veth50.0/proxy_arp: No such file or directory
/usr/sbin/vznetaddbr: line 35: /proc/sys/net/ipv4/conf/veth50.0/forwarding: No such file or directory