Windows Server 2016 Hyper-V 内部交换机配置外网访问

Windows Server 2016 Hyper-V 内部交换机配置外网访问

背景

在 Windows Server 2016 上使用 Hyper-V 创建"内部网络"模式的虚拟交换机后,接入该交换机的虚拟机默认只能与宿主机及其他同网段虚拟机通信,无法访问外网

"内部网络"交换机不桥接任何物理网卡,因此需要额外配置 NAT 才能实现外网访问。

本文记录完整的配置过程,包含两种方案对比及虚拟机静态 IP 配置。


方案一:PowerShell NAT(推荐)

步骤 1:确认虚拟交换机已创建

在 Hyper-V 管理器中确认已创建"内部"类型的虚拟交换机。创建后,宿主机的"网络连接"面板中会出现一个 vEthernet (交换机名称) 适配器。

步骤 2:查询 vEthernet 适配器名称

Get-NetAdapter | Where-Object { $_.Name -like "vEthernet*" } | Format-Table Name, InterfaceDescription, Status

输出示例:

Name                      InterfaceDescription                    Status
----                      --------------------                    ------
vEthernet (内部NAT)        Hyper-V Virtual Ethernet Adapter #2    Up

步骤 3:给 vEthernet 适配器分配网关 IP

New-NetIPAddress -IPAddress 192.168.137.1 -PrefixLength 24 -InterfaceAlias "vEthernet (内部NAT)"

注意:

  • InterfaceAlias 必须与 Get-NetAdapter 输出的 Name 列完全一致
  • 如果交换机名称是中文,确保引号完整包裹,不要漏字(如 vEthernet 不要写成 vEtherne
  • 如果中文名称导致参数解析异常,可以使用 InterfaceIndex 代替:
    New-NetIPAddress -IPAddress 192.168.137.1 -PrefixLength 24 -InterfaceIndex <ifIndex>
    

步骤 4:创建 NAT 规则

New-NetNat -Name "NAT" -InternalIPInterfaceAddressPrefix 192.168.137.0/24

此命令会将 192.168.137.0/24 网段的流量通过宿主机的物理网卡做 SNAT 转发,同时自动开启 IP 转发。

步骤 5:验证 NAT 配置

# 检查 NAT 规则
Get-NetNat

# 检查 IP 转发是否开启
Get-NetIPInterface | Where-Object { $_.Forwarding -eq "Enabled" }

步骤 6:配置虚拟机网络

进入虚拟机内部,手动设置静态 IP(内部交换机没有 DHCP):

配置项
IP 地址 192.168.137.x(x ≠ 1,不冲突即可)
子网掩码 255.255.255.0
默认网关 192.168.137.1
DNS 114.114.114.114 或 8.8.8.8

虚拟机内执行 ping 8.8.8.8 能通即说明 NAT 生效。


方案二:Internet 连接共享(ICS)

  1. 打开 ncpa.cpl(网络连接面板)
  2. 右键能上外网的物理网卡 → 属性 → 共享 选项卡
  3. 勾选「允许其他网络用户通过此计算机的 Internet 连接来连接」
  4. 下拉选择 vEthernet (内部NAT) 适配器
  5. ICS 会自动把 vEthernet 适配器的 IP 设成 192.168.137.1,并自带简易 DHCP,虚拟机设为自动获取 IP 即可

两种方案对比

对比项 PowerShell NAT ICS 共享
网段 自由指定 固定 192.168.137.0/24
DHCP 无,需手动配 IP 自带简易 DHCP
稳定性 好,重启不丢配置 偶尔需重新勾选
灵活性
适用场景 生产/长期使用 临时测试

建议优先使用方案一(PowerShell NAT)。


附:Ubuntu 虚拟机设置静态 IP

Netplan 方式(Ubuntu 18.04+)

编辑 /etc/netplan/ 下的 YAML 配置文件:

network:
  version: 2
  ethernets:
    eth0:                          # 网卡名用 ip a 查看
      addresses:
        - 192.168.137.100/24       # 静态 IP / 掩码
      routes:
        - to: default
          via: 192.168.137.1        # 网关(宿主机 vEthernet IP)
      nameservers:
        addresses:
          - 114.114.114.114         # DNS
          - 8.8.8.8

YAML 缩进必须用空格,不能用 Tab。

应用配置:

sudo netplan apply

验证:

ip a          # 查看 IP
ip route      # 查看默认路由
ping 8.8.8.8  # 测试外网连通性

旧版 Ubuntu(16.04 及以前)

编辑 /etc/network/interfaces

auto eth0
iface eth0 inet static
    address 192.168.137.100
    netmask 255.255.255.0
    gateway 192.168.137.1
    dns-nameservers 114.114.114.114 8.8.8.8
sudo systemctl restart networking

常见问题排查

问题 原因与解决
New-NetIPAddressInvalid parameter InterfaceAlias 接口名称拼写错误或引号未包裹完整,用 Get-NetAdapter 确认确切名称
IP 生效但 ping 不通网关 网关地址与宿主机 vEthernet 适配器的 IP 不一致
能 ping 通 IP 但解析不了域名 DNS 未配置,检查 nameservers 设置
重启后 IP 配置丢失 cloud-init 覆盖了配置,编辑 /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg 添加 network: {config: disabled}
改完 SSH 断开 静态 IP 与当前 IP 不同导致断连,确认新 IP 在同一网段或从控制台操作
宿主机重启后 NAT 规则丢失 New-NetNat 创建的规则通常是持久的,但建议验证;如丢失可创建开机自动执行脚本
posted @ 2026-08-04 23:09  轻聆月下  阅读(27)  评论(0)    收藏  举报