任何时候你都可以开始做自己想做的事

搜索|
WIN2016 共享公网给内部交换机的虚拟机 并 实现端口映射和使用 NAT和NETSH两种方式
发布时间:2024-08-22 02:50:53

此文目标是给在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