虚拟机双网卡网络问题解决流程
一、问题现象
虚拟机有两块网卡:
ens33:用于上网ens38:用于和开发板通信,要求固定为192.168.66.8
当时遇到的问题是:
-
虚拟机
ping www.baidu.com失败,报错:bashTemporary failure in name resolution
说明存在 DNS / 默认路由 / 网络配置异常。
- 又必须保证:
- 虚拟机能正常上网
ens38保持192.168.66.8- 开发板通信不受影响
二、问题根因分析
通过排查发现,问题不是单一的 DNS 故障,而是 双网卡路由冲突。
1. 路由表里存在两个默认网关
执行:
bash
ip route
当时看到:
bash
default via 192.168.232.2 dev ens33
default via 192.168.66.119 dev ens38 proto dhcp metric 101
说明:
ens33想负责上网ens38也在抢默认路由
这样会导致系统不知道外网流量到底该走哪块网卡。
2. ens38 开着 DHCP
查看 Wired connection 2 后发现:
ens38的ipv4.method是auto- 它虽然拿到了
192.168.66.8/24 - 但同时也从 DHCP 获取了网关
192.168.66.119
这就导致它不仅仅是"开发板通信口",还被当成了"默认出口"。
3. 两块网卡曾同时落在 192.168.66.0/24 网段
之前还出现过这种情况:
ens33 = 192.168.66.90/24ens38 = 192.168.66.8/24
这样会让系统对 192.168.66.x 网段的访问产生歧义:
- 到底走
ens33 - 还是走
ens38
这会引起:
- 通信不稳定
- 路由混乱
- 板子访问异常
- 上网异常
三、排查过程
1. 查看 netplan 是否直接配置了网卡
执行:
bash
ls /etc/netplan
cat /etc/netplan/01-network-manager-all.yaml
结果发现配置文件只有:
yaml
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
说明:
- Netplan 本身没有写死
ens33/ens38 - 真正管理网卡的是 NetworkManager
所以后续不能去改 netplan 里的静态 yaml,而应该改 NetworkManager 连接配置
2. 查看 NetworkManager 管理的连接
执行:
bash
nmcli connection show
结果:
bash
NAME UUID TYPE DEVICE
Wired connection 1 ... ethernet ens33
Wired connection 2 ... ethernet ens38
对应关系为:
Wired connection 1→ens33Wired connection 2→ens38
3. 查看两块网卡详细配置
执行:
bash
nmcli connection show "Wired connection 1"
nmcli connection show "Wired connection 2"
发现:
Wired connection 1(ens33)
bash
ipv4.method: manual
ipv4.addresses: 192.168.66.90/24
GENERAL.DEFAULT: yes
IP4.ADDRESS[1]: 192.168.66.90/24
IP4.ADDRESS[2]: 192.168.232.128/24
IP4.GATEWAY: 192.168.232.2
说明:
ens33被手动配成了192.168.66.90- 同时又实际有
192.168.232.128 - 它既想当 66 网段口,又想当上网口
Wired connection 2(ens38)
bash
ipv4.method: auto
IP4.ADDRESS[1]: 192.168.66.8/24
IP4.GATEWAY: 192.168.66.119
DHCP4.OPTION[22]: routers = 192.168.66.119
说明:
ens38虽然地址是192.168.66.8- 但它是 DHCP 自动拿到的
- 并且拿到了默认网关
四、最终解决思路
目标明确为:
ens33:只负责上网,改成 DHCPens38:固定为192.168.66.8/24ens38不允许有默认网关ens38不允许抢默认路由
也就是:
- ens33 = 上网口
- ens38 = 开发板通信口
五、实际修改命令
1. 把 ens33 改成 DHCP 上网口
bash
sudo nmcli connection modify "Wired connection 1" \
ipv4.method auto \
ipv4.addresses "" \
ipv4.gateway "" \
ipv4.dns "" \
ipv4.never-default no
说明:
ipv4.method auto:启用 DHCP- 清空之前手工写死的地址、网关、DNS
ipv4.never-default no:允许它作为默认出口
2. 把 ens38 改成固定 192.168.66.8
bash
sudo nmcli connection modify "Wired connection 2" \
ipv4.method manual \
ipv4.addresses "192.168.66.8/24" \
ipv4.gateway "" \
ipv4.dns "" \
ipv4.never-default yes
说明:
ipv4.method manual:改为手动静态 IP- 固定地址为
192.168.66.8/24 - 不设置网关
- 不设置 DNS
ipv4.never-default yes:禁止它成为默认路由
3. 重启网卡连接
先重启 ens38:
bash
sudo nmcli connection down "Wired connection 2"
sudo nmcli connection up "Wired connection 2"
再重启 ens33:
bash
sudo nmcli connection down "Wired connection 1"
sudo nmcli connection up "Wired connection 1"
六、修改后验证
1. 查看路由表
bash
ip route
最终结果:
bash
default via 192.168.232.2 dev ens33 proto dhcp metric 104
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.66.0/24 dev ens38 proto kernel scope link src 192.168.66.8 metric 103
192.168.232.0/24 dev ens33 proto kernel scope link src 192.168.232.128 metric 104
说明:
- 默认路由只走
ens33 ens38只负责192.168.66.0/24- 已经没有
ens38的默认网关了 - 也没有
ens33的192.168.66.90/24冲突地址了
2. 测试开发板通信
bash
ping -c 4 192.168.66.117
结果:正常通
说明:
ens38到开发板的通信正常- 固定 IP
192.168.66.8生效
3. 测试外网路由
bash
ping -c 4 223.5.5.5
结果:正常通
说明:
- 外网路由正常
ens33上网功能正常
4. 测试 DNS 解析
bash
ping -c 4 www.baidu.com
结果:正常通
说明:
- DNS 解析正常
- 虚拟机已经具备完整上网能力
七、最终结论
最终网络状态为:
ens33:通过 DHCP 获取地址和默认网关,用于上网ens38:静态地址192.168.66.8/24,用于开发板通信- 两块网卡分工明确,不再冲突
最终达成目标:
- 虚拟机可以永久上网
ens38保持192.168.66.8- 开发板通信正常
- 配置持久生效,重启后仍有效
八、后续查看配置的常用命令
查看连接列表
bash
nmcli connection show
查看某个连接详细配置
bash
nmcli connection show "Wired connection 1"
nmcli connection show "Wired connection 2"
查看 IP 地址
bash
ip addr
查看路由表
bash
ip route
查看 DNS 状态
bash
resolvectl status
九、提醒和注意事项
1. 不要再让 ens33 和 ens38 同时落在 192.168.66.0/24
例如这种情况要避免:
ens33 = 192.168.66.90ens38 = 192.168.66.8
否则会再次导致路由冲突。
2. ens38 不要配置默认网关
ens38 只是开发板通信口,不是上网口。
所以它应该只有:
- 静态 IP
- 子网掩码
不应该有:
- 默认网关
- DNS
- 默认路由
3. 不要再随意执行这些临时命令扰乱配置
例如:
bash
dhclient ens38
ifconfig ens33 192.168.66.90
这些命令可能会把已经稳定的配置重新打乱。
4. 以后优先使用 nmcli 修改网络
因为当前系统的网卡配置是由 NetworkManager 管理的,所以应优先使用:
bash
nmcli connection modify ...
nmcli connection up ...
nmcli connection down ...
而不是直接混用:
ifconfigroutedhclient
5. 判断网络问题时,建议按这三个层次测试
第一层:测试开发板通信
bash
ping 192.168.66.117
第二层:测试外网路由
bash
ping 223.5.5.5
第三层:测试 DNS
bash
ping www.baidu.com
这样可以快速判断问题属于:
- 板子通信问题
- 外网路由问题
- DNS 解析问题
十、一句话总结
这次问题的本质不是"虚拟机不能上网",而是:
双网卡职责混乱,ens33 和 ens38 同时参与了 66 网段和默认路由,导致网络冲突。
正确做法是:
- ens33 只负责上网
- ens38 只负责开发板通信
- 禁止 ens38 抢默认路由