在 virt-manager 中配置 NAT 模式,可以通过以下步骤完成。NAT(Network Address Translation)模式允许虚拟机通过宿主机的网络连接访问外部网络,同时对外隐藏虚拟机的真实 IP 地址。以下是具体操作步骤:
步骤 1:确认默认 NAT 网络是否存在
KVM 默认会创建一个名为 default
的 NAT 网络(使用 virbr0
网桥)。首先检查该网络是否已启用:
virsh net-list --all
如果输出中包含 default
且状态为 active,则已启用。否则,启动默认网络:
virsh net-start default virsh net-autostart default # 设置开机自启
步骤 2:为虚拟机配置 NAT 网络
打开 virt-manager
virt-manager
创建或编辑虚拟机
- 新建虚拟机时,在 网络选择 步骤中,选择 Virtual network 'default': NAT。
- 对已存在的虚拟机,右键选择 Edit -> Virtual Hardware -> NIC,设置如下:
- Network source:
default
(或自定义的 NAT 网络) - Device model: 默认选择
virtio
(高性能驱动)。
- Network source:
1. 检查 libvirt 服务状态
确保 libvirtd
服务已运行:
sudo systemctl status libvirtd
若未启动,执行:
sudo systemctl start libvirtd sudo systemctl enable libvirtd # 设置开机自启
2. 验证默认网络定义
查看 /etc/libvirt/qemu/networks/
目录下是否存在 default.xml
:
sudo ls /etc/libvirt/qemu/networks/default.xml
若文件丢失,需手动创建或从模板恢复。
3. 重新定义默认网络
若网络定义损坏,需删除并重新定义:
# 删除残留配置 sudo virsh net-undefine default # 重新定义默认网络(使用标准 NAT 配置) sudo virsh net-define /usr/share/libvirt/networks/default.xml sudo virsh net-autostart default # 设置自动启动 sudo virsh net-start default
步骤 1:检查宿主机的默认路由
启动虚拟机后,宿主机默认网关可能被错误指向 virbr0
(NAT 网桥)。执行以下命令查看路由表:
ip route show default
正常情况应指向宿主机物理网卡(如 eth0
或 wlan0
)。若显示类似:
default via 192.168.1.1 dev eth0
若默认路由指向 virbr0
(如 192.168.122.1
),需手动修复:
sudo ip route del default via 192.168.122.1 sudo ip route add default via [原网关IP] dev [物理网卡名]
步骤 2:排查防火墙规则(关键)
libvirt 默认会修改 iptables/nftables
规则,可能导致宿主机流量被错误拦截。
检查 NAT 规则
sudo iptables -t nat -L -n -v
重点观察 POSTROUTING
链,应有如下规则:
Chain POSTROUTING (允许物理网卡出口流量伪装) MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
若缺失该规则,手动添加:
sudo iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
恢复宿主机的 FORWARD 策略
若 FORWARD 链默认策略为 DROP
,需允许转发:
sudo iptables -I FORWARD 1 -i virbr0 -j ACCEPT sudo iptables -I FORWARD 1 -o virbr0 -j ACCEP