Linux主机QEMU虚拟机手动NAT网络搭建后联网问题排查
虚拟机NAT联网问题排查方案
针对你手动搭建QEMU NAT网络时虚拟机无法访问互联网的问题,结合你的网络架构(命名空间+网桥+veth控制),按以下步骤排查:
1. 确认主机IP转发功能已启用
IP转发是NAT生效的前提,检查并启用:
# 查看当前状态 sysctl net.ipv4.ip_forward # 临时启用(永久生效需将net.ipv4.ip_forward=1写入/etc/sysctl.conf) sysctl -w net.ipv4.ip_forward=1
2. 检查命名空间nat-ns内的路由与接口配置
进入命名空间验证核心网络配置:
ip netns exec nat-ns bash # 确认所有相关接口处于UP状态(nat-bridge、nat-wwwa、虚拟机TAP接口) ip link show # 确认nat-bridge的IP为10.8.20.2(虚拟机配置的网关),nat-wwwa有跨网段IP(如与主机侧nat-wwwb组成/30子网) ip addr show # 检查默认路由,必须指向nat-wwwa对应的主机侧IP(如10.8.200.1) ip route show exit
若缺少默认路由,执行以下命令添加:
ip netns exec nat-ns ip route add default via 10.8.200.1 dev nat-wwwa
3. 验证主机侧路由与veth接口状态
确保主机能正确转发虚拟机子网的流量:
# 确认nat-wwwb接口处于UP状态且IP配置正确 ip link show nat-wwwb ip addr show nat-wwwb # 检查主机是否存在到虚拟机子网10.8.20.0/24的路由 ip route show | grep 10.8.20.0/24
若没有对应路由,添加:
ip route add 10.8.20.0/24 via 10.8.200.2 dev nat-wwwb
4. 检查iptables NAT与转发规则
虚拟机上网依赖SNAT/MASQUERADE规则,同时需允许流量通过FORWARD链:
# 查看NAT表POSTROUTING链规则,需存在针对10.8.20.0/24的MASQUERADE/SNAT规则 iptables -t nat -L POSTROUTING -n -v # 若缺失,添加(将虚拟机子网流量转换为主机物理接口enp5s0的公网IP) iptables -t nat -A POSTROUTING -s 10.8.20.0/24 -o enp5s0 -j MASQUERADE # 查看FORWARD链规则,需允许虚拟机子网与互联网的双向流量 iptables -L FORWARD -n -v # 若缺失,添加: iptables -A FORWARD -s 10.8.20.0/24 -j ACCEPT iptables -A FORWARD -d 10.8.20.0/24 -j ACCEPT
5. 确认veth对与网桥的绑定状态
确保nat-wwwa已正确挂载到nat-bridge(联网状态下):
ip netns exec nat-ns brctl show nat-bridge
输出的端口列表中需包含
nat-wwwa和虚拟机的TAP接口,且两者状态均为UP。
6. 抓包定位流量阻塞点
若以上步骤均正常,用tcpdump定位流量丢失环节:
- 在命名空间内抓nat-wwwa的流量,验证虚拟机是否发出互联网请求:
ip netns exec nat-ns tcpdump -i nat-wwwa icmp - 在主机侧抓nat-wwwb的流量,验证请求是否转发到主机:
tcpdump -i nat-wwwb icmp - 在主机物理接口enp5s0抓包,验证NAT后的流量是否发出:
tcpdump -i enp5s0 icmp and src host $(ip addr show enp5s0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
内容的提问来源于stack exchange,提问作者Evian
相关产品推荐
相关产品推荐

