libvirt ネットワークの無効化

libvirt ネットワークの無効化

ほとんどの OpenStack デプロイメントでは、ハイパーバイザーとのやり取りに libvirt ツールキットを使用します。特に、 OpenStack Compute が仮想マシンインスタンスの起動、終了などの処理を行うのに libvirt を使用します。 OpenStack Compute が新しいインスタンスを起動する際、 libvirt は インスタンスに関連付けられた仮想インターフェイス (VIF) を OpenStack に渡し、 OpenStack Compute は VIF を OpenStack Networking が提供する仮想デバイスに挿します。 libvirt ツールキット自身は OpenStack 環境ではネットワーク機能は一切提供しません。

しかしながら、 libvirt は、自身が管理する仮想マシンに対してネットワークサービスを提供することはできます。もう少し具体的に言うと、 libvirt は、簡単な 1 台構成の OpenStack に似たネットワーク機能を提供するように設定することができます。 1 台構成に限ると、ユーザーは libvirt を使って OpenStack Networking のネットワークと同様のレイヤー 2 ネットワークを作成できます。

libvirt ネットワーク実装

デフォルトでは、 libvirt のネットワーク機能は有効になっており、 libvirt はシステム起動時にネットワークを作成します。このネットワークを作るため、libvirt は OpenStack Networking が使っているのと同じ技術をいくつか活用しています。特に以下を使います。

  • Linux ブリッジング: レイヤー 2 ネットワークを実現するため

  • dnsmasq: DHCP を使って仮想マシンに IP アドレスを割り当てるため

  • iptables: インスタンスがパブリックインターネットに接続するための SNAT を実現するため、仮想マシンの DHCP を使った dnsmasq との通信を許可するため

デフォルトでは、 libvirt は default という名前のネットワークを作成します。このネットワークの詳細はディストリビューション毎に異なります。 Ubuntu では、このネットワークは以下が含まれます。

  • Linux ブリッジ: virbr0 という名前で、 IP アドレスは 192.168.122.1/24 を持ちます

  • dnsmasq プロセス: virbr0 インターフェースをリッスンしており、 192.168.122.2-192.168.122.254 の範囲の IP アドレスを払い出します

  • iptables のルールセット

libvirt は、仮想マシンを起動する際、明示的に指定されていない場合、その仮想マシンの VIF をブリッジ virbr0 に接続します。

Ubuntu では、 libvirt が作成する iptable ルールセットには以下のルールが含まれます。

*nat
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
*mangle
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
*filter
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT

以下は、出力 libvirt が管理する dnsmasq プロセスの ps の出力です。

2881 ?        S      0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf

libvirt ネットワークを無効にする方法

OpenStack は libvirt のネットワークを使用しませんが、このネットワークは OpenStack の動作には干渉せず、そのまま有効にしておくこともできます。しかし、 OpenStack ネットワークの問題をデバッグする際に、 libvirt のネットワークはじゃまになりえます。 libvirt は追加のブリッジ、 dnsmasq プロセス、 iptables ルールセットを作成するため、ネットワークの問題切り分けを行うオペレーターの注意をそらすこともあります。 libvirt を使って仮想マシンを直接起動する必要がない場合には、 libvirt のネットワークは安全に無効にすることができます。

定義済みの libvirt ネットワークとその状態を表示します。

# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

default という名前の libvirt ネットワークを非活性化します。

# virsh net-destroy default

このネットワークを非活性化すると、 virbr0 ブリッジは削除され、 dnsmasq プロセスは終了され、 iptables ルールセットは削除されます。

このネットワークがホスト起動時に自動的に開始しないようにするには以下のようにします。

# virsh net-autostart --network default --disable

非活性化した後に、このネットワークをアクティブにするには以下のようにします。

# virsh net-start default
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.