此文目标是给在win2016 hyper-v 中创建的使用内网交换机的 虚拟机 提供上网以及外网端口映射(如远程和FTP端口),
如果是简单的应用,可直接使用依赖iphleper服务的WIN默认的netsh的简单端口映射。
在端口应用量大的时候(比如FTP等)或者端口数量大的时候建议使用NAT(网络地址转换)方式创建,
给虚拟机共享公网的建议使用NAT方式,比较稳定
------------------------------------------------------------------------
共享IP虚拟机端口映射_netsh常用命令
#查询某个IP所有的端口映射:
netsh interface portproxy show v4tov4
#添加端口映射虚拟机内网IP
netsh interface portproxy add v4tov4 listenport=公网端口 listenaddress=公网IP connectaddress=内网IP connectport=内网端口
#删除映射的端口,不需要connectaddress 和 connectport 参数
netsh interface portproxy delete v4tov4 listenport=公网端口 listenaddress=公网IP
#利用过滤器查询指定的IP或者端口的信息,findstr + 所希望查询的信息,比如IP或者端口
netsh interface portproxy show all | findstr "内网IP"
--------------------------------------------------------------------------------------------
共享IP虚拟机端口映射_NAT方式常用命令
#为虚拟机添加特定端口映射
Add-NetNatStaticMapping -NatName "MyNATnetwork" -ExternalIPAddress "0.0.0.0" -ExternalPort 公网端口 -InternalIPAddress "内网IP" -InternalPort 内网端口 -Protocol TCP
#获取所有的NetNatStaticMapping规则,重点看StaticMappingID
Get-NetNatStaticMapping
#移除NAT规则,核心参数是-StaticMappingID
Remove-NetNatStaticMapping -StaticMappingID 1 -NatName "MyNATnetwork"
-----------------------------------------------------------------------------
共享IP虚拟机端口映射_netsh方式批量创建:
$listenAddress = "母机公网IP"#母机公网IP
$connectAddress = "192.168.13.182"# 虚拟机内网IP
$win3389=20001
$linux22=20002
$ftp=20004
$startPort = 20005
$endPort = 20010
#定义常规固定端口映射列表
$portMappings = @{
$win3389 = 3389 # Windows RDP
$linux22 = 22 # Linux SSH
$ftp = 21 # FTP
}
#常规固定端口映射执行添加
foreach ($listenPort in $portMappings.Keys) {
$connectPort = $portMappings[$listenPort]
netsh interface portproxy add v4tov4 listenport=$listenPort listenaddress=$listenAddress connectaddress=$connectAddress connectport=$connectPort
}
#循环执行制定的随机端口,根据开始和结束端口进行添加
for ($i = $startPort; $i -le $endPort; $i++) {
netsh interface portproxy add v4tov4 listenport=$i listenaddress=$listenAddress connectaddress=$connectAddress connectport=$i
}
-----------------------------------------------------------------------------
共享IP虚拟机端口映射_NAT方式批量创建
# 定义公共 IP 地址和内部虚拟机的 IP 地址
$listenAddress = "母机公网IP" # 母机公网IP
$connectAddress = "192.168.13.136" # 虚拟机内网IP
# 定义端口映射变量
$win3389 = 20351
$linux22 = 20352
$ftp = 20354
$startPort = 20355
$endPort = 20360
# 定义端口映射列表
$portMappings = @{
$win3389 = 3389 # Windows RDP
$linux22 = 22 # Linux SSH
$ftp = 21 # FTP
}
# 常规固定端口映射执行添加
foreach ($listenPort in $portMappings.Keys) {
$connectPort = $portMappings[$listenPort]
Add-NetNatStaticMapping -NatName "MyNATnetwork" -ExternalIPAddress "0.0.0.0" -ExternalPort $listenPort -InternalIPAddress $connectAddress -InternalPort $connectPort -Protocol TCP
}
# 循环执行指定的随机端口,根据开始和结束端口进行添加
for ($i = $startPort; $i -le $endPort; $i++) {
Add-NetNatStaticMapping -NatName "MyNATnetwork" -ExternalIPAddress "0.0.0.0" -ExternalPort $i -InternalIPAddress $connectAddress -InternalPort $i -Protocol TCP
}
-----------------------------------------------------------------------------
共享IP虚拟机端口映射_netsh端口批量删除后使用NAT批量创建对应端口映射:
# 定义公共 IP 地址和内部虚拟机的 IP 地址
$listenAddress = "母机公网IP" # 母机公网IP
$connectAddress = "192.168.13.108" # 虚拟机内网IP
# 定义端口映射变量
$win3389 = 20221
$linux22 = 20222
$ftp = 20224
$startPort = 20225
$endPort = 20230
# 定义端口映射列表
$portMappings = @{
$win3389 = 3389 # Windows RDP
$linux22 = 22 # Linux SSH
$ftp = 21 # FTP
}
# 常规固定端口映射执行删除
foreach ($listenPort in $portMappings.Keys) {
netsh interface portproxy delete v4tov4 listenport=$listenPort listenaddress=$listenAddress
}
# 循环执行指定的随机端口,根据开始和结束端口进行删除
for ($i = $startPort; $i -le $endPort; $i++) {
netsh interface portproxy delete v4tov4 listenport=$i listenaddress=$listenAddress
}
#执行NAT对应创建
# 常规固定端口映射执行添加
foreach ($listenPort in $portMappings.Keys) {
$connectPort = $portMappings[$listenPort]
Add-NetNatStaticMapping -NatName "MyNATnetwork" -ExternalIPAddress "0.0.0.0" -ExternalPort $listenPort -InternalIPAddress $connectAddress -InternalPort $connectPort -Protocol TCP
}
# 循环执行指定的随机端口,根据开始和结束端口进行添加
for ($i = $startPort; $i -le $endPort; $i++) {
Add-NetNatStaticMapping -NatName "MyNATnetwork" -ExternalIPAddress "0.0.0.0" -ExternalPort $i -InternalIPAddress $connectAddress -InternalPort $i -Protocol TCP
}
-----------------------------------------------------------------------------
共享公网网络给虚拟机_NAT方式:
#查询网络网卡信息,记录好公网网卡名和对应的ifIndex 数值,后面配置网关要用
Get-NetAdapter
# 请先查询现在的服务器是否已经创建了NAT网络,如果有,请先删除,删除命令:Get-NetNat | Remove-NetNat
Get-NetNat
#请确保应用程序或功能(例如 Windows 容器)仅有一个“内部”交换机网卡。 记录 内部交换机 的名称
Get-VMSwitch
#如果上述命令没有显示有信息,就可执行一下命令:
#使用 New-NetIPAddress 配置 NAT 网关
New-NetIPAddress -IPAddress 192.168.13.1 -PrefixLength 24 -InterfaceIndex 17
# 使用 New-NetNat 配置 NAT 网络 (此命令执行后,所有在此网段的使用内部交换机的虚拟机都可上网)
New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.13.0/24
# 使用Add-NetNatStaticMapping 配置外网特定端口 转发到 虚拟机的内部端口
Add-NetNatStaticMapping -NatName "MyNATnetwork" -ExternalIPAddress "0.0.0.0" -ExternalPort 公网端口 -InternalIPAddress "内网IP" -InternalPort 内网端口 -Protocol TCP