本文用以解决 Hyper-V 虚拟机在设置静态 IP 后无法连接网络的问题,以及如何正确配置网络以及使用 SSH 进行连接。
故障状态
root@ubuntu22:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ba:b8:b7:5a:4f:64 brd ff:ff:ff:ff:ff:ff permaddr 00:15:5d:00:09:04
inet 10.0.0.10/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::e58c:f4a5:4734:c660/64 scope link noprefixroute
valid_lft forever preferred_lft forever
root@ubuntu22:~# ping -c 3 www.baidu.com
ping: www.baidu.com: 域名解析出现暂时性错误
从输出看:eth0 有 10.0.0.10/24 地址、网卡状态正常,ping 报域名解析失败,核心是 DNS 配置异常,其次顺带检查网关。
一、快速修复(按顺序执行)
先测试直连 IP(判断是 DNS 还是全网不通)
ping -c 3 180.101.49.11
能通:纯 DNS 问题,继续下一步
不通:网关 / 虚拟交换机配置问题,跳至第三节
临时配置公共 DNS(立即恢复上网)
# 写入阿里云 DNS + 谷歌 DNS
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 223.6.6.6" >> /etc/resolv.conf# 测试解析
ping -c 3 www.baidu.com永久修复(防止重启后 DNS 失效,Ubuntu22 使用 netplan)
3.1 查看当前 netplan 配置文件ls /etc/netplan/
一般文件名类似 00-installer-config.yaml、01-network-manager-all.yaml
3.2 编辑配置文件(替换为你的文件名)
nano /etc/netplan/00-installer-config.yaml
注意 yaml 严格缩进,不能用 Tab,只用空格
参考配置(DHCP 自动获取 + 固定 DNS):
yaml
network:
ethernets:
eth0:
dhcp4: true
nameservers:
addresses: [223.5.5.5, 223.6.6.6, 114.114.114.114]
version: 2
3.3 应用配置
netplan apply
二、检查网关(如果改完 DNS 依旧外网不通)
查看当前网关
ip route
正常会有一行类似:
default via 10.0.0.x dev eth0
无 default via:缺少默认网关,手动添加:
route add default gw 10.0.0.1 eth0
(10.0.0.1 是 Hyper-V 虚拟交换机网关,根据你网段调整)
同网段互通测试
ping 10.0.0.1
不通 → 问题出在 Hyper-V 虚拟交换机。
三、Hyper-V 侧网络排查(虚拟机层面)
关闭虚拟机,打开 Hyper-V 管理器
选中虚拟机 → 设置 → 网络适配器
若当前是 内部 / 专用虚拟交换机:改成 外部虚拟交换机(绑定本机物理网卡)
外部交换机确保勾选:允许管理操作系统共享此网络适配器
保存设置,重启虚拟机。
四、补充:systemd-resolved 异常修复(Ubuntu22 常见坑)
如果 resolv.conf 被自动覆盖、解析依旧报错:
# 重启解析服务
systemctl restart systemd-resolved
# 锁定 resolv.conf 防止被篡改
chattr +i /etc/resolv.conf
总结优先步骤
临时写入 DNS → 验证上网
netplan 永久固化 DNS
无网关则手动加网关
最后排查 Hyper-V 虚拟交换机类型
ip 10.0.0.10是我手动设定的内网地址
结合你 手动静态 IP(10.0.0.10/24) 的场景,重新给出适配方案,分步解决解析 + 外网连通问题。
一、先确认网关(关键)
执行查看路由:
ip route
正常静态网络必须有默认网关,格式示例:
default via 10.0.0.1 dev eth0
没有默认网关(最常见)
手动添加网关(Hyper-V 10.0.0.0/24 网段,网关一般为10.0.0.1):
ip route add default via 10.0.0.1 dev eth0
测试连通网关:
ping -c 3 10.0.0.1
网关能通,还是域名解析失败
直接配置静态 DNS:
# 覆盖DNS配置
cat > /etc/resolv.conf << EOF
nameserver 223.5.5.5
nameserver 114.114.114.114
EOF
# 测试解析
ping -c 3 www.baidu.com
二、Netplan 永久配置(静态 IP + 网关 + DNS,重启不失效)
Ubuntu22 静态 IP 必须在netplan里统一配置,否则重启配置丢失。
找到配置文件
ls /etc/netplan/
编辑文件(替换为你实际文件名)
nano /etc/netplan/00-installer-config.yaml
写入完整静态网络配置(严格空格缩进,禁止 Tab):
yaml
network:
ethernets:
eth0:
addresses: [10.0.0.10/24]
gateway4: 10.0.0.1
nameservers:
addresses: [223.5.5.5, 114.114.114.114]
version: 2
生效配置
netplan apply
三、特殊问题处理
resolv.conf 被系统自动覆盖
# 锁定文件,禁止修改
chattr +i /etc/resolv.conf
后续如需修改,先解锁:
chattr -i /etc/resolv.conf
- 能通网关、DNS 也配了,但还是无法外网
检查 Hyper-V 虚拟交换机类型:必须是外部交换机(绑定主机物理网卡),内部 / 专用交换机无法访问外网。
主机防火墙 / 杀毒软件,临时关闭测试。
主机ping 10.0.0.10 互通,证明二层网络正常,问题仅在网关 / 路由。 - 直连公网 IP 测试
排除解析问题:
运行
ping -c 3 180.101.49.11
能通:纯 DNS 问题,检查nameservers配置
不通:网关 / 虚拟交换机路由问题
root@ubuntu22:~# ip route
default via 10.0.0.1 dev eth0 proto static metric 20100
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.10 metric 100
169.254.0.0/16 dev eth0 scope link metric 1000
路由正常,网关 10.0.0.1 已配置,问题锁定DNS 解析,按下面步骤彻底解决:
临时修复,立即测试
bash
运行写入公共DNS
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
测试解析
ping -c 3 www.baidu.com
- 检查 systemd-resolved 状态(Ubuntu22 核心服务)
bash
运行
systemctl status systemd-resolved
若异常 / 未启动,执行重启:
bash
运行
systemctl restart systemd-resolved
systemctl enable systemd-resolved Netplan 永久固化静态 IP + 网关 + DNS(防止重启失效)
编辑 netplan 文件
bash
运行
nano /etc/netplan/00-installer-config.yaml
粘贴完整配置(只用空格缩进,禁止 Tab):
yaml
network:
ethernets:
eth0:
addresses: [10.0.0.10/24]
gateway4: 10.0.0.1
nameservers:addresses: [223.5.5.5, 114.114.114.114]version: 2
应用配置
bash
运行
netplan apply- 防止 resolv.conf 被自动覆盖(可选)
bash
运行
chattr +i /etc/resolv.conf
后续要修改时先解锁:chattr -i /etc/resolv.conf
补充排查
如果依旧解析失败:
测试直接 ping 公网 IP:ping -c 3 180.101.49.11
IP 能通、域名不通:纯 DNS 问题,换一组 DNS(如 119.29.29.29)
检查 Hyper-V 主机防火墙、第三方安全软件,是否拦截虚拟机 DNS 请求
确认虚拟交换机为外部交换机,且勾选「允许管理操作系统共享此网络适配器」
如何检查systemd-resolved服务的配置文件?
如何配置Netplan永久固化静态IP+网关+DNS?
如何查看Netplan配置文件?
解决方案:使用 Netplan 正确配置静态 IP
Ubuntu 使用 Netplan 管理网络配置。核心步骤是获取动态 IP 虚拟机的正确网络参数,并将其应用于静态 IP 配置中。
步骤一:获取正确的网络参数(在动态 IP 虚拟机中操作)
登录到能正常联网的动态 IP Ubuntu 虚拟机,运行以下命令获取关键网络信息:
1、查看 IP 地址、子网掩码 (CIDR) 和接口名称:
ip addr show
关注点: 找到类似 inet 172.2.23.189/20的行。记录接口名 (eth0)、IP (172.2.23.189) 和 CIDR (/20)。
2、查看网关地址:
ip route show
关注点: 找到 default via 172.22.208.1 的行。记录网关 IP (172.22.208.1)。
查看 DNS 服务器地址:
systemd-resolve –status
#或 cat /etc/resolv.conf
关注点: 记录 DNS Servers 下的 IP 地址(例如 172.22.208.1 或公共 DNS 8.8.8.8)。
步骤二:配置静态 IP(在静态 IP 虚拟机中操作)
回到无法联网的静态 IP 虚拟机,登录控制台,并使用获取到的正确参数修改 Netplan 配置文件。
找到并打开配置文件:
sudo nano /etc/netplan/50-cloud-init.yaml
文件名可能不同,例如 00-installer-config.yaml
3、替换为以下正确配置内容(注意 YAML 缩进,使用空格):
(假设我们使用未占用的新静态 IP 172.22.223.250)
network:
version: 2
renderer: networkd
ethernets:
eth0: # 确保这个接口名称与步骤一查到的一致
dhcp4: false
addresses: [172.22.223.250/20] # 使用新 IP 和正确的 CIDR
routes:
- to: default
via: 172.22.208.1 # 使用查到的准确网关
nameservers:
addresses: # 使用查到的 DNS 地址
4、保存并应用配置:
在 nano 中:按 Ctrl + O,回车确认,然后按 Ctrl + X 退出。
应用新配置:
sudo netplan apply
验证网络连接:
ping 172.22.208.1 # Ping 网关
ping 8.8.8.8 # Ping 外部 IP
ping www.baidu.com # Ping 域名
步骤三:启用 SSH 服务并连接
网络恢复正常后,安装并启用 SSH 服务以便远程管理。
安装 OpenSSH Server:
sudo apt update
sudo apt install openssh-server
检查 SSH 服务状态:
sudo systemctl status ssh
确保状态为 active (running)
检查防火墙(如果需要):
如果使用了 UFW 防火墙,请允许 SSH 端口:
sudo ufw allow ssh
sudo ufw enable # 如果防火墙未启用
从宿主机连接:
打开宿主机的终端、PowerShell 或 PuTTY,使用以下命令连接:
ssh your_username@xxx.xxx.xxx.xxx
输入密码后,即可通过 SSH 远程管理你的虚拟机。
