虚拟机网络设置

虚拟机双网卡网络问题解决流程

一、问题现象

虚拟机有两块网卡:

  • ens33:用于上网
  • ens38:用于和开发板通信,要求固定为 192.168.66.8

当时遇到的问题是:

  1. 虚拟机 ping www.baidu.com 失败,报错:

    bash 复制代码
    Temporary failure in name resolution

说明存在 DNS / 默认路由 / 网络配置异常。

  1. 又必须保证:
    • 虚拟机能正常上网
    • 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 后发现:

  • ens38ipv4.methodauto
  • 它虽然拿到了 192.168.66.8/24
  • 但同时也从 DHCP 获取了网关 192.168.66.119

这就导致它不仅仅是"开发板通信口",还被当成了"默认出口"。


3. 两块网卡曾同时落在 192.168.66.0/24 网段

之前还出现过这种情况:

  • ens33 = 192.168.66.90/24
  • ens38 = 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 1ens33
  • Wired connection 2ens38

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:只负责上网,改成 DHCP
  • ens38:固定为 192.168.66.8/24
  • ens38 不允许有默认网关
  • 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 的默认网关了
  • 也没有 ens33192.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.90
  • ens38 = 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 ...

而不是直接混用:

  • ifconfig
  • route
  • dhclient

5. 判断网络问题时,建议按这三个层次测试

第一层:测试开发板通信
bash 复制代码
ping 192.168.66.117
第二层:测试外网路由
bash 复制代码
ping 223.5.5.5
第三层:测试 DNS
bash 复制代码
ping www.baidu.com

这样可以快速判断问题属于:

  • 板子通信问题
  • 外网路由问题
  • DNS 解析问题

十、一句话总结

这次问题的本质不是"虚拟机不能上网",而是:

双网卡职责混乱,ens33ens38 同时参与了 66 网段和默认路由,导致网络冲突。

正确做法是:

  • ens33 只负责上网
  • ens38 只负责开发板通信
  • 禁止 ens38 抢默认路由
相关推荐
记录无知岁月2 小时前
【STM32】HAL库常用外设使用速查
stm32·单片机·cubemx
攻城狮在此2 小时前
华三交换机ACL配置(封禁内网高危端口)
网络·安全
123过去2 小时前
hashid使用教程
linux·网络·测试工具·安全
cdprinter2 小时前
信刻安全加密光盘,保障光盘保密安全
网络·安全·自动化
MC_J2 小时前
Keil之在线调试,不用重启即可在线仿真
stm32·单片机
xiaomo22492 小时前
javaee-网络原理2
网络
云边云科技_云网融合3 小时前
基于深度学习的设备监控技术:从被动报警到主动预警的革新
网络·人工智能·云计算
逐步前行3 小时前
HAL_GPIO
stm32·单片机·嵌入式硬件
VOOHU-沃虎3 小时前
BMS隔离变压器技术解析:以WHS06A01A0为例
网络·工业控制