禁用 libvirt 网络

大多数 OpenStack 部署使用 libvirt 工具包来与 hypervisor 交互。具体来说,OpenStack Compute 使用 libvirt 执行诸如启动和终止虚拟机实例之类的任务。当 OpenStack Compute 启动新的实例时,libvirt 会向 OpenStack 提供与该实例关联的 VIF,然后 OpenStack Compute 会将 VIF 插入由 OpenStack Network 提供的虚拟设备。libvirt 工具包本身在 OpenStack 部署中不提供任何网络功能。

然而,libvirt 能够为其管理的虚拟机提供网络服务。特别是,libvirt 可以配置为提供类似于简化版、单节点 OpenStack 的网络功能。用户可以使用 libvirt 创建类似于 OpenStack Networking 的网络,但仅限于单个节点。

libvirt 网络实现

默认情况下,libvirt 的网络功能已启用,并且 libvirt 在系统启动时会创建一个网络。为了实现此网络,libvirt 利用了与 OpenStack Network 相同的一些技术。特别是,libvirt 使用

  • Linux 桥接来实现 Layer 2 网络

  • dnsmasq 通过 DHCP 为虚拟机提供 IP 地址

  • iptables 来实现 SNAT,以便实例可以连接到公共互联网,并确保允许虚拟机使用 DHCP 与 dnsmasq 通信

默认情况下,libvirt 会创建一个名为 default 的网络。此网络的详细信息可能因发行版而异;在 Ubuntu 上,此网络涉及

  • 一个名为 virbr0 的 Linux 桥接,其 IP 地址为 192.0.2.1/24

  • 一个 dnsmasq 进程,它侦听 virbr0 接口,并在 192.0.2.2-192.0.2.254 范围内分配 IP 地址

  • 一组 iptables 规则

当 libvirt 启动虚拟机时,它会将机器的 VIF 放置在桥接 virbr0 中,除非明确告知它不要这样做。

在 Ubuntu 上,libvirt 创建的 iptables 规则集包括以下规则

*nat
-A POSTROUTING -s 192.0.2.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.0.2.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.0.2.0/24 ! -d 192.0.2.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.0.2.0/24 ! -d 192.0.2.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.0.2.0/24 ! -d 192.0.2.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.0.2.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.0.2.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 的行为,并且可以安全地启用。但是,libvirt 的网络在调试 OpenStack 网络问题时可能会造成困扰。由于 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