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)
- 打开
ncpa.cpl(网络连接面板) - 右键能上外网的物理网卡 → 属性 → 共享 选项卡
- 勾选「允许其他网络用户通过此计算机的 Internet 连接来连接」
- 下拉选择
vEthernet (内部NAT)适配器 - 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-NetIPAddress 报 Invalid 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 创建的规则通常是持久的,但建议验证;如丢失可创建开机自动执行脚本 |

浙公网安备 33010602011771号