平衡点
2014/12/18
_ NetworkManager で仮想環境用に bridge を作成
始めに
ラップトップでは上流のネットワークが有線だったり無線だったりで、ちょっと面倒ですね.
virt-managerなんかでdnsmasqを用いたNATネットワークを使うと,この辺上手くやってくれるので大分楽なんですけれど,
- そもそも,ホスト環境であるラップトップ側で dnsmasq は既に動いているので,virt-manager から dnsmasq が二重に上がる.別に何か問題がある訳じゃないけれど,気にいらない.
- 仮想環境側のアドレスがコロコロと変わるのがちょっと.dnsmasq の dhcpd 機能で IP を渡しているのだけれども,仮想MACアドレスに対応して固定のIPを振ったとしても,lease time が過ぎると毎回アドレス取得している感じ.
といった点が気になっていました.
そんな訳で,矢吹さんのノートPCで、LXCを運用するときのTIPS - Yukiharu YABUKI の tDiary(2011-10-30)を参考に bridge インターフェースを作成して iptables で NAT する様にしてみたのですが,今度は仮想環境側を落とした後に NetworkManager が
(プロセス番号) libnm-glib-WARNING **: Error in get_property: Method "Get" with signature "ss" on interface "org.freedesktop.DBus.Properties" doesn't exist
と悲鳴を上げる様になりました.
さて,どうするか,…としばし悩みましたが,良く見たら NetworkManager でも bridge を管理できるみたいで.試しに NetworkManager 側で bridge を作成してみたら上記の悲鳴は出なくなりました.というわけで,その手順のメモなど.
環境は
% lsb_release -a LSB Version: (略) Distributor ID: Debian Description: Debian GNU/Linux 8.0 (jessie) Release: 8.0 Codename: jessie
となっています(…が,sid です.良く見たら /etc/debian_version も 8.0 になってるな.freeze 期間だからかしら).Wheezy の NetworkManager でもブリッジって作成できるのかしらん?
NAT の設定
iptables で,bridge から現在接続されている上流(eth0 or wlan0) への NAT を設定します.
先ず /etc/sysctl.d/ 以下に適当なファイル名(vm-forward.conf としました)で以下の内容を記載しておきます.
net.ipv4.ip_forward=1
その後
% sudo sysctl -p
で設定を反映.
次に,iptables で
% sudo iptables -A FORWARD -i [bridge name] -s XXX.XXX.XXX.0/24 -m conntrack --ctstate NEW -j ACCEPT % sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT % sudo iptables -t nat -A POSTROUTING -s XXX.XXX.XXX.0/24 -j MASQUERADE % sudo iptables-save % sudo /etc/init.d/netfilter-persistent
として,iptables の設定を更新します. XXX.XXX.XXX.0/24 はブリッジに振る/仮想マシンに振る IP 空間, [bridge name] は作成する bridge インターフェースの名前です.
以上で,ブリッジインターフェースからの接続を上流に IP Masquerade できるようになります.
NetworkManager でブリッジの作成
nm-connection-editor で作成するのが楽です.自動起動にチェックを入れておくと,常にブリッジインターフェースが存在するので,ホストがネットワークに接続されていない場合でも仮想環境とは通信が可能です.
ちなみに,ログ見てたら /usr/bin/arping を実行しようとしていました. とりあえず /usr/sbin/arping からの symbolic link を貼っておきましたが, これ Bug なのかしら…?
virt-manager, lxc での設定
virt-manager で作成した仮想ネットワークは削除して,仮想マシン側で NIC に作成したブリッジを割り当てておきます.
lxc でコンテナを作成する際には
lxc.network.type=veth lxc.network.link=[bridge name] lxc.network.flags=up
としておけば良いかと.
まとめ
というわけで,気になっていた
- dnsmasq の二重起動
- 仮想環境側の IP を固定
- NetworkManager の悲鳴
が解決された様です.
外界と仮想環境とを接続したい,と思ったら一手間かける必要がありそうですが,とりあえずこれで運用して,どうなるか試してみます.