TenForward

技術ブログ。はてなダイアリーから移転しました

OpenVZ で仮想イーサネットデバイス (2)

OpenVZ で仮想イーサネットデバイス(1) では,ハードウェアノード (HN) 上でルーティングを行って,コンテナ (CT) の外部との通信を行いましたが,一々ルーティングなってやってられるか! ってことで,ブリッジを使った方法の試してみました.

  • 以下の例は vzctl が 3.0.23 以上で使えるようです.ただ,コマンドに頼らないで自分で設定をやれば,もっと古いバージョンでもいけます.
    • vznet.conf で指定している vznetaddbr スクリプトが 3.0.22 以下ではないとか,そういう理由.やっていることが分かって,自分でそれなりに設定すれば OK
  1. 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
  2. CT に eth0 というデバイスを作成します (eth0の部分は作成したいデバイス名,br0 は CT 用のインターフェースが作成されたとき,そのデバイスをアタッチするブリッジ).
    # vzctl set 50 --netif_add eth0,,,,br0 --save
    ここで MAC アドレスなども指定可能ですが,とりあえず最新の OpenVZ 環境だと,自動的に適当な MAC アドレスを生成して振ってくれるようです.
  3. /etc/vz/vznet.conf というファイルを以下の内容で作成します.
    #!/bin/bash
    EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr"
    これで vzctl start (CTID) を実行した時に,自動的にこのスクリプトが実行されます.このスクリプトは /etc/sysconfig/vz-scripts/(CTID).conf ファイルの中身の NETIF 行を読んで,ブリッジ名を取得し,CT がスタートしたときに作成される veth(CTID).0 というインターフェースをブリッジにアタッチします.
  4. CT 内の設定も行います.これは (Redhat/CentOS 系であれば) 普通に /etc/sysconfig/network-scripts/ifcfg-eth0 ファイルを作成すれば OK です.例えば
    DEVICE=eth0
    BOOTPROTO=dhcp
    ONBOOT=yes
    TYPE=Ethernet
    LAN 内に DHCP サーバがあれば,ちゃんとアドレス割当たります (venet 形式だと L3 だから CT で DHCP クライアント動かしてアドレス取得は無理だった).
  5. CTをスタートさせます.
    # vzctl start 50
    この CT 用の仮想インターフェースが HN 上に作成され,ブリッジにアタッチされています.
    # ifconfig
    : (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
    vzctl start の時に以下のようなエラーが出るみたいですが,ここではブリッジを設定してアタッチしているので,proxy_arp も forwarding も不要で,問題はないようです.(このエラーを出なくするには ifconfig veth50.0 0 とかを値をセットする前に実行すればよいはず)
    /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