さくらインターネットの提供する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を組み合わせれば、一部のポートをインターネット側で受けることもできます。