Hyper-V虚拟机端口暴露
Overview
前言
Docker Desktop使用hyper-v虚拟机,但Windows下的磁盘挂载比较麻烦,有文件权限问题,端口映射容易报错。于是删了Docker Destop,用hyper-v创建了一个CentOS 7.6虚拟机。
在虚拟机内部署服务时,需要把端口暴露出来,搜索后有两种办法,NAT映射与端口转发,可参考文章末尾的两个链接。
测试下来还是使用NAT映射比较方便,假定已经创建号虚拟机,创建的交换机名称为VMSwitch,NAT名称为VMNAT,下面是步骤。
创建交换机
创建一个Internal类型的交换机,设置名称为VMSwitch
1New-VMSwitch -SwitchName "VMSwitch" -SwitchType Internal
配置交换机地址
为交换机创建IP地址池,注意网卡名称对应,这里使用172.21.21.1/24地址池
1New-NetIPAddress -IPAddress 172.21.21.1 -PrefixLength 24 -InterfaceAlias "vEthernet (VMSwitch)"
创建NAT
1New-NetNat -Name VMNAt -InternalIPInterfaceAddressPrefix 172.21.21.0/24
配置虚拟机静态IP
首先将虚拟机关机,然后更改它的交换机为上面创建的交换机,然后启动虚拟机。
编辑文件 /etc/sysconfig/network-scripts/ifcfg-eth0,这里使用172.21.21.2 作为虚拟机固定IP
1TYPE=Ethernet
2PROXY_METHOD=none
3BROWSER_ONLY=no
4BOOTPROTO=static
5DEFROUTE=yes
6IPV4_FAILURE_FATAL=no
7IPV6INIT=yes
8IPV6_AUTOCONF=yes
9IPV6_DEFROUTE=yes
10IPV6_FAILURE_FATAL=no
11IPV6_ADDR_GEN_MODE=stable-privacy
12NAME=eth0
13UUID=896b2aaa-0s52-4679-8b00-561e24c524f1
14//下面是需要编辑配置静态IP的内容
15DEVICE=eth0
16ONBOOT=yes
17GATEWAY=172.21.21.1
18IPADDR=172.21.21.2
19NETMASK=255.255.255.0
20DNS1=8.8.8.8
21DHS2=114.114.114.114
保存后退出,执行下面的命令重启网络服务
1systemctl restart network
添加NAT映射
假设将宿主机的7777(TCP)、8888(UDP)、9999(UDP)三个TCP端口分别映射到虚拟机
1// 添加NAT映射,注意名称对应
2Add-NetNatStaticMapping -NatName "VMNat" -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.21.21.2 -InternalPort 7777 -ExternalPort 7777
3Add-NetNatStaticMapping -NatName "VMNAt" -Protocol UDP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.21.21.2 -InternalPort 8888 -ExternalPort 8888
4Add-NetNatStaticMapping -NatName "VMNAt" -Protocol UDP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 172.21.21.2 -InternalPort 9999 -ExternalPort 9999
访问与测试端口
可以使用telnel与nc来测试端口访问,实测在PC的有线网卡与无线网卡各自的子网内,都可以访问到虚拟机的服务
Tips
hyper-v创建虚拟机时可选第二代虚拟机,类似带UEFI启动的Windows 10笔记本,但CentOS及Ubuntu可能无法正常启动,可通过禁用安全启动或配置安全启动模板为Microsoft UEFI证书颁发机构解决这个问题