Ubuntu 16.04主机配置KVM(libvirt)路由网络及VM可达性问题
我来帮你搞定这个KVM虚拟机接入现有集群子网的问题,结合你的Ubuntu 16.04环境和Debian防火墙的配置,给你两个可行的方案,你可以根据实际情况选择:
你要实现的是:让KVM客户机直接使用防火墙承载的10.4.0.0/16集群子网,同时保证VM的IP能被集群内设备访问,且能利用防火墙已有的NAT能力处理外部流量。
这种方式会让VM和Hypervisor处于同一个二层网络,VM可以直接获取10.4.0.0/16网段的IP,和集群内其他设备完全打通。
步骤1:在Hypervisor上创建桥接接口
Ubuntu 16.04用的是ifupdown管理网络,编辑/etc/network/interfaces:
sudo nano /etc/network/interfaces
把原来的物理网卡配置改成桥接成员,新增桥接接口br0(假设物理网卡是eth0):
auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 10.4.20.250 netmask 255.255.0.0 gateway 10.4.0.1 # 这里填你的防火墙网关IP bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0
保存后重启网络生效:
sudo systemctl restart networking
步骤2:替换Virsh默认网络为桥接模式
先清理原来的default网络:
virsh net-destroy default virsh net-undefine default
创建桥接网络的XML配置文件(比如br0.xml):
<network> <name>br0</name> <forward mode="bridge"/> <bridge name="br0"/> </network>
定义并启动这个桥接网络:
virsh net-define br0.xml virsh net-start br0 virsh net-autostart br0
步骤3:配置VM使用桥接网络
编辑目标VM的配置:
virsh edit <你的VM名称>
找到<interface>部分,替换成桥接模式:
<interface type='bridge'> <source bridge='br0'/> <model type='virtio'/> # 用virtio网卡提升性能 </interface>
启动VM后,给VM配置10.4.0.0/16网段的静态IP(或者如果防火墙有DHCP服务,VM会自动获取)。以Ubuntu VM为例,编辑/etc/network/interfaces:
auto ens3 iface ens3 inet static address 10.4.20.xxx # 选集群内未占用的IP netmask 255.255.0.0 gateway 10.4.0.1 dns-nameservers 8.8.8.8 # 或者集群内部的DNS服务器
如果Hypervisor的物理网卡不能改成桥接(比如有其他服务依赖),可以用路由模式,让Hypervisor作为VM的网关,把VM流量转发到防火墙。
步骤1:启用Hypervisor的IP转发
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
步骤2:创建自定义路由网络
从10.4.0.0/16里划分一个子网段(比如10.4.21.0/24,和Hypervisor的10.4.20.250区分),创建XML配置文件routed-net.xml:
<network> <name>routed-net</name> <forward mode='route'/> <ip address='10.4.21.1' netmask='255.255.255.0'> <dhcp> <range start='10.4.21.10' end='10.4.21.50'/> </dhcp> </ip> </network>
定义并启动网络:
virsh net-define routed-net.xml virsh net-start routed-net virsh net-autostart routed-net
步骤3:在防火墙上添加路由规则
告诉防火墙,10.4.21.0/24网段的流量要转发到Hypervisor:
ip route add 10.4.21.0/24 via 10.4.20.250 dev <防火墙的内网接口>
要永久保存的话,把这条命令加到Debian防火墙的/etc/rc.local或者网络配置文件里。
步骤4:配置VM使用路由网络
编辑VM配置,把网卡改成使用routed-net网络,启动后VM会自动获取10.4.21.x的IP,集群内设备就能通过防火墙的路由规则访问VM了。
- 在VM里ping防火墙网关
10.4.0.1,能通则内部路由正常 - 在集群其他设备上ping VM的IP,能通则可达性正常
- 测试VM对外访问,能正常上网说明NAT生效
内容的提问来源于stack exchange,提问作者Paul O

