月別アーカイブ: 2014年5月

さくらVPSでLXCを使う(dummynet+bridge+proxy arp)

さくらインターネットの提供するVPSサービスではDebianが利用できます。VPSのホストはKVMで提供されているようです。VPSのインスタンス一つで別の仮想的な環境が欲しくなったので、LXCを使ってみました。
ループバックインターフェースを持つだけのホストは簡単に作れるのですが、VPSに割り当てられているNICインターフェースをブリッジにするわけにもゆきません。そこで今回はdummynetを利用してホストオンリーネットワークを構築してみました。

dummynetは物理NICとは結びつかない、完全なダミーのネットワークインターフェースを提供します。インターフェース名はdummy0などとなります。使うには単純にmodprobe dummy等としてdummy.koをロードするだけです。Debianで起動時に有効にするためには、/etc/modulesに一行”dummy”と追加しておけばよいです。

次にdummy0をLXCから使えるよう、ブリッジを作ります。
apt-get install bridge-utilsを実行してネットワークブリッジデバイスを扱うためのツール一式を入れておきます。次に/etc/network/interfacesに以下のような記述を追加します。

auto br0
iface br0 inet static
        bridge_ports dummy0
        address 172.23.186.1
        netmask 255.255.255.0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

IPアドレスやネットワークは、別途自分が普段使う範囲とバッティングしない、適当なプライベートネットワークを設定してください。

この状態でifup br0を実行すれば、dummy0デバイスに紐づいたブリッジデバイスbr0が作られます。auto br0を入れてあるので、再起動時にも自動的にbr0がifupします。

この状態で、lxc-create等を使ってLXCコンテナのインスタンスを作成します。ただ、Debian wheezyのlxcパッケージはかなりbuggyで、あんまり動作が信用なりません。私は個人的にsidのlxcをバックポートしたものを使っています。

以下は私の作ったlxcコンテナのconfigの一部です。

lxc.network.type = veth
lxc.network.flags = down
lxc.network.link = br0
lxc.network.name = eth0

私は、コンテナ側の/etc/network/interfacesにeth0のネットワーク設定を書いて設定しています。

基本的にはこれでホストオンリーな環境ができます。しかし、メンテナンス上コンテナ側でも毎日apt-getはしたいので、私の環境ではNAT(masquerade)をできるようにしています。

この時に問題になるのがarpとfowardingです。何も設定しない状態では、br0から外に出ることができません。

まずbr0でproxy arpを有効化します。設定方法はsysctlを使うか、echo 1 > /proc/sys/net/ipv4/conf/br0/proxy_arpを実行するかして有効化します。これでbr0から他のインターフェース(eth0等)へ届くようになります。起動時に有効にするためには、interfacesにさらなる設定を追加します。

auto br0
iface br0 inet static
        bridge_ports dummy0
        address 172.23.186.1
        netmask 255.255.255.0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
        up echo 1 > /proc/sys/net/ipv4/conf/br0/proxy_arp

次はforwardingです。これもprocでも設定できますが、私は以下の内容を書いたファイルを/etc/sysctl.d/ip_forward.confとしています。

net.ipv4.ip_forward = 1

最期にNATの設定です。/etc/iptables/rules.v4に以下のような行を書いておきます。コマンドであれば、iptables -A POSTROUTING -s 172.23.186.0/24 -o eth0 -j MASQUERADEという具合です。

-A POSTROUTING -s 172.23.186.0/24 -o eth0 -j MASQUERADE

これで、VPS上でも外部ネットワークに到達可能なLXCインスタンスを持つことができます。もちろん、静的NATを組み合わせれば、一部のポートをインターネット側で受けることもできます。