前回立ち上げたArchコンテナで、ネットワークを使用できるよう設定。lxc-1.1.0-r3 使用。(20153)

方針

Archコンテナはvethを使用し、Gentooホストのブリッジに接続させる。

ブリッジとコンテナをサブネットに置き、ホストがルーティングを行う。

    インターネット
     |
- [ルータ] - - - - - - - - - - - - - - - -
(192.168.7.1)eth1  :  新設するサブネット
      |            :   192.168.7.128/25
      |            :
(192.168.7.6)[Gentooホスト](192.168.7.129)br0---+----+----+----+-・・・
                   :                            |    |    |    |
既存の自宅LAN       :           eth0(192.168.7.132)
192.168.7.0/24     :                 [Archコンテナ]

コンテナのipアドレスはlxcのconfigで決めうちにする。resolv.confも手動で書く。

自宅LANなのでサブネットを切らずに、ブリッジを単にHUB代わりに使っても良いが、あえてこうした。理由は:

  • ホスト側のネットワーク、ファイアウォールの設定変更が少なくて済む。
  • さくらVPS上でもlxcで遊んでみたいので、その練習。

dhcpは、今後必要になったら導入する。手動にした理由に、少し試した範囲でdhcpcdが使えなかったこともある。 /proc/sysをリードオンリーでマウントしていると駄目らしい。

下準備

ルータに新設サブネットを教える

ブリッジから下流は、ルータから直接見えないので教えてやる。ルールは:

  • サブネット192.167.7.128/25内のあて先IPは、ゲートウェイ192.168.7.6に任せる。

ルータ(Gentoo)のLAN側インターフェースをeth1とすると、

(router)# vi /etc/conf.d/net
config_eth1="192.168.7.1/24"                    # 元から在った行
routes_eth1="192.168.7.128/25 via 192.168.7.6"  # これを加えた。

eth1を立ち上げなおし、ルーティングテーブルを確認する。

(router)# /etc/init.d/net.eth1 restart
   : (略)
(router)# ip route   (関係ないエントリは省略)
192.168.7.0/24 dev eth1  proto kernel  scope link  src 192.168.7.1 # 元からあったエントリ
192.168.7.128/25 via 192.168.7.6 dev eth1 metric 2                 # 追加されたエントリ

Gentooホストのカーネルにルーティングを許可する

Gentooホストのsysctl.confを編集。

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1  # 1で許可

再起動するか# ehco 1 > /proc/sys/net/ipv4/ip_forwardで適用する。

ホストにブリッジ作成

bridge-utilsが必要

# emerge net-misc/bridge-utils

今回は bridge-utils-1.5 だった。

/etc/conf.d/net

# vi /etc/conf.d/net
bridge_br0=""   #構成デバイスなしでスタート
brctl_br0=""    #デフォルト設定で十分
config_br0="192.168.7.129/25" #ブリッジインターフェイスを新設サブネットに置きルーティングに使うため、IPアドレスを与える。

net.br0 のinitスクリプト

net.loへのリンクで良いとのこと。

# ln -s net.lo /etc/init.d/net.br0

ここまでで、デバイスが1つも接続されていないブリッジができる。

# /etc/init.d/net.br0 start
 * Caching service dependencies ...    [ ok ]
 * Bringing up interface br0
 *   Creating bridge br0 ...
 *   192.168.7.129/25 ...              [ ok ]
 *   Waiting for IPv6 addresses ...    [ ok ]

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.000000000000       no

コンテナの設定

lxcコンフィグ

コンテナ名をsakeとすると、/var/lib/lxc/sake/config を編集する。

lxc.network.type = veth
lxc.network.name = eth0     # コンテナ内でのデバイス名
lxc.network.link = br0      # eth0と対を成すホスト側のveth??????を、ブリッジbr0の構成デバイスに追加
lxc.network.flags = up      # 起動時にインターフェイス up の状態に。
lxc.network.ipv4 = 192.168.7.132/25 # 起動時に ipアドレス・サブネットを設定
lxc.network.ipv4.gateway = 192.168.7.129 # 起動時にデフォルトルートを設定
lxc.network.hwaddr = 12:23:34:45:56:67 # eth0 のHWアドレス

コンテナ起動

コンテナ側のeth0と対を成す、veth??????がブリッジに追加される。

# lxc-start -n sake
# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.fe84c1bcda9d       no              vethHCU0II

コンテナ側リゾルバの設定

手書きで行く。

# vi /etc/resolv.conf
nameserver 192.168.7.1   # lxc用サブネットの外にある、自宅LANのDNSサーバー。

動作確認

なんでもよいので通信させてみる。 wget http://www.google.comとか。

# pacman -Sy  # やっと同期できる。

ネットワークの状況

####コンテナ側 ルーティングテーブルは、サブネット外の不明アドレスについて、eth0経由でホストのブリッジインターフェイス(192.168.7.129)に渡すようになっている。(無関係のデバイスは省略)

# ip route
default via 192.168.7.129 dev eth0
192.168.7.128/25 dev eth0  proto kernel  scope link  src 192.168.7.132

eth0にipv4アドレス、サブネットが設定され、upしている。

# ip addr
103: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group
   default qlen 1000 link/ether 12:23:34:45:56:67 brd ff:ff:ff:ff:ff:ff
   inet 192.168.7.132/25 brd 192.168.7.255 scope global eth0
   valid_lft forever preferred_lft forever
   inet6 fe80::1023:34ff:fe45:5667/64 scope link
   valid_lft forever preferred_lft forever

####ホスト側 ルーティングテーブルは、新設したサブネット192.168.7.128/25内のあて先について、br0(192.168.7.129)から送出するようになっている。

# ip route
default via 192.168.7.1 dev enp0s3  metric 2
127.0.0.0/8 dev lo  scope host
192.168.7.0/24 dev enp0s3  proto kernel  scope link  src 192.168.7.6
192.168.7.128/25 dev br0  proto kernel  scope link  src 192.168.7.129

インターフェースとしては、br0とveth??????がある。vethはブリッジの構成デバイスとして使っているだけなので、ipアドレスは必要ない。

# ip addr (関係ないデバイスは省略)
100: br0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
  group default link/ether fe:85:75:ae:38:17 brd ff:ff:ff:ff:ff:ff
  inet 192.168.7.129/25 brd 192.168.7.255 scope global br0
   valid_lft forever preferred_lft forever
  inet6 fe80::604a:8eff:fe78:b1bb/64 scope link
   valid_lft forever preferred_lft forever
106: veth602O5O: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 
  state UP group default qlen 1000
  link/ether fe:85:75:ae:38:17 brd ff:ff:ff:ff:ff:ff
  inet6 fe80::fc85:75ff:feae:3817/64 scope link
    valid_lft forever preferred_lft forever

HWアドレスは 最初の構成デバイスであるvethからブリッジへコピーされたようだ。vethのHWアドレスをどう決めたのかは分からない。