首先,我们来了解 KVM 虚拟化环境下的网络配置方式。在 Fedora 14 和 RHEL 6 中,主要支持三种网络方案:网络地址转换(NAT)、直接分配物理设备(PCI passthrough 或 SR-IOV),以及共享物理设备(桥接模式)。默认情况下,系统会启用 NAT 模式。但如果希望虚拟机能够被外部网络直接访问,通常需要采用直接分配物理设备或桥接网络的方式。
NAT(网络地址转换)
几乎所有标准 libvirt 实现都将 NAT 作为默认虚拟网络方案,即“default virtual network”。你可以通过执行 virsh net-list --all 来确认该网络是否已存在并处于活动状态。
# virsh net-list --all
Name State Autostart
-----------------------------------------
default active yes
如果 XML 配置文件不小心丢失,无需担心,仍然可以从系统模板中重新加载并定义:
# virsh net-define /usr/share/libvirt/networks/default.xml
接着,将该虚拟网络设为开机自动启动,并手动启动它:
# virsh net-autostart default
# virsh net-start default
使用 brctl show 可以查看网桥的状态。这里有一个关键点:virbr0 通过 NAT 和 IP 转发与实体网络连通,但默认情况下不会绑定任何其他物理接口:
# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.000000000000 yes
通常情况下,libvirt 会自动向 iptables 添加相应的规则,并尝试启用 ip_forward 功能。不过,其他应用程序可能会意外地将该功能关闭。因此,最稳妥的做法是在 /etc/sysctl.conf 文件中添加如下配置,以永久启用 IP 转发:
net.ipv4.ip_forward = 1
桥接模式(Bridge)
桥接模式通常适用于拥有多块网卡的服务器。需要注意的是,NetworkManager 默认不支持桥接,因此要么直接停用 NetworkManager 服务,要么在网卡配置文件中加入参数 NM_CONTROLLED=no。具体配置步骤如下:
首先,修改 /etc/sysconfig/network-scripts/ifcfg-eth0:
DEVICE=eth0
HWADDR=00:16:76:D6:C9:45
ONBOOT=yes
BRIDGE=br0
然后,创建桥接接口 br0 的配置文件:
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=dhcp
DELAY=0
重启网络服务使配置生效:
service network restart
再次使用 brctl show 查看,此时可以看到桥接已成功建立:
# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.f0def1341ae6 no eth0
virbr0 8000.000000000000 yes
在桥接模式下,还需要配置 iptables 以允许桥接网络的流量转发。核心方法是使用 physdev 模块:
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
另一种常见的做法是配置以下内核参数,也能达到相同的效果:
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0