H

Hyper-V Ubuntu虚拟机静态IP配置与SSH配置

Captain 网络Linux 2024-05-30

本文用以解决 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 配置异常,其次顺带检查网关。

一、快速修复(按顺序执行)

  1. 先测试直连 IP(判断是 DNS 还是全网不通)

    ping -c 3 180.101.49.11

能通:纯 DNS 问题,继续下一步
不通:网关 / 虚拟交换机配置问题,跳至第三节

  1. 临时配置公共 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

  2. 永久修复(防止重启后 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 依旧外网不通)

  1. 查看当前网关

    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 虚拟交换机网关,根据你网段调整)

  1. 同网段互通测试

    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

三、特殊问题处理

  1. resolv.conf 被系统自动覆盖

    # 锁定文件,禁止修改
    chattr +i /etc/resolv.conf

后续如需修改,先解锁:

chattr -i /etc/resolv.conf
  1. 能通网关、DNS 也配了,但还是无法外网
    检查 Hyper-V 虚拟交换机类型:必须是外部交换机(绑定主机物理网卡),内部 / 专用交换机无法访问外网。
    主机防火墙 / 杀毒软件,临时关闭测试。
    主机ping 10.0.0.10 互通,证明二层网络正常,问题仅在网关 / 路由。
  2. 直连公网 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 解析,按下面步骤彻底解决:

  1. 临时修复,立即测试
    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

  1. 检查 systemd-resolved 状态(Ubuntu22 核心服务)
    bash
    运行
    systemctl status systemd-resolved
    若异常 / 未启动,执行重启:
    bash
    运行
    systemctl restart systemd-resolved
    systemctl enable systemd-resolved
  2. 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

  3. 防止 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 远程管理你的虚拟机。

PREV:linux中grep二进制文件搜索技巧
NEXT:如何在 Linux 系统中打开 BIN 文件