当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 Windows 中配置端口转发

作者:精品下载站 日期:2024-12-14 23:28:19 浏览:15 分类:玩电脑

在 Windows 中配置端口转发


您可以在所有 Windows 版本中配置网络端口转发,而无需使用第三方工具。使用端口转发规则,您可以将传入 TCP 连接(IPv4 或 IPv6)从本地 TCP 端口重定向到任何其他端口号,甚至重定向到远程计算机上的端口。 Windows 端口转发最常用于绕过防火墙或对外部网络 (NAT/PAT) 隐藏内部主机或服务。

在 Linux 世界中,端口转发的配置非常简单,使用iptables 或firewalld规则。在 Windows Server 主机上,路由和远程访问服务 (RRAS) 通常用于配置端口重定向。但是,有一种更简单的方法可以使用以下命令启用端口转发

netsh portproxy

模式,适用于从 Win XP 到当前版本的 Windows 11 和 Windows Server 2022 的所有 Windows 版本。

如何使用 Netsh Portproxy 在 Windows 上启用端口转发?

您可以使用Netsh 命令的Portproxy模式在Windows中配置端口转发。

命令语法如下:

netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport

在哪里

  • listenaddress - 是一个用于侦听传入连接的本地 IP 地址(如果您在不同子网/VLAN 中有多个 NIC 或一个接口上有多个 IP 地址,则非常有用);

  • listenport - 要监听的本地 TCP 端口号(连接正在等待);

  • connectaddress - 是将传入连接重定向到的本地或远程 IP 地址(或 DNS 名称);

  • connectport - 是连接的 TCP 端口

    listenport

    被转发到。

使用

netsh interface portproxy add
v4tov6

/

v6tov4

/

v6tov6

选项,您可以在 IPv4 和 IPv6 地址之间创建端口转发规则。

假设您的任务是使 RDP 服务在非标准端口上响应,例如 3340(当然,可以在 Windows 设置中更改此端口号,但我们使用 RDP 是为了更轻松地演示端口转发技术)。为此,我们需要将传入流量从 TCP 端口 3340 重定向到另一个本地端口 3389(这是默认的 RDP 端口号)。

请注意,您在 listenport 中指定的本地端口号不应被其他服务或进程侦听(使用)。检查端口号是否未被使用:

netstat -na|find "3340"

或者,您可以使用 PowerShell cmdlet Test-NetConnection 检查端口是否未在本地侦听:

Test-NetConnection -ComputerName localhost -Port 3340

[玩转系统] 在 Windows 中配置端口转发

要在 Windows 上创建端口转发规则,请以管理员身份打开命令提示符并运行以下命令:

netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110

[玩转系统] 在 Windows 中配置端口转发

其中 10.10.1.110 - 配置端口转发的计算机的当前 IP 地址。

现在,使用 netstat 工具检查 Windows 是否正在侦听本地端口 3340:

netstat -ano | findstr :3340

[玩转系统] 在 Windows 中配置端口转发

注意。如果此命令不返回任何内容,并且通过 netsh 接口 portproxy 进行端口转发不起作用,请确保您的 Windows 设备上正在运行 iphlpsvc(IP Helper)服务。

检查服务的状态

services.msc

控制台或使用 PowerShell 命令:

Get-Service iphlpsvc

[玩转系统] 在 Windows 中配置端口转发

必须在为其创建端口转发规则的网络接口上启用 IPv6 支持。

[玩转系统] 在 Windows 中配置端口转发

这些是Windows中端口转发正确操作的先决条件。如果没有 IP Helper 服务并且未启用 IPv6 支持,则端口重定向将无法工作。

要使端口转发在 Windows Server 2003/XP 上正常工作,还必须将注册表项 HKEY_LOCAL_MACHINE\ System\CurrentControlSet\services\Tcpip\Parameter 下的 IPEnableRouter 参数设置为 1

Set-ItemProperty -Path HKLM:\system\CurrentControlSet\services\Tcpip\Parameters -Name IpEnableRouter -Value 1

此选项还允许您在 Hyper-V 中的不同子网之间启用路由。

您可以通过 PID 来识别正在侦听指定端口的进程(在我们的示例中,PID 为 636):

tasklist | findstr 636

现在尝试使用任何 RDP 客户端从远程计算机连接到新端口。您需要指定 3340 作为 RDP 端口号。它在 RDP 主机地址后面的冒号后面指定。例如,

10.10.1.110:3340

[玩转系统] 在 Windows 中配置端口转发

在此示例中,必须首先在 Windows Defender 防火墙中打开端口 TCP/3340(请参阅本文的下一部分)。

RDP 连接应该已成功建立。

Portproxy 端口转发规则是永久性的,并且在您重新启动 Windows 时不会被清除。这些规则存储在注册表中。您可以使用 PowerShell 在注册表中列出 netsh 转发规则:

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp

[玩转系统] 在 Windows 中配置端口转发

如果要将传入 TCP 连接转发到远程计算机,请使用以下命令:

netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.100.101

此规则会将所有传入 RDP 流量(来自本地 TCP 端口 3389)从此计算机重定向到 IP 地址为 192.168.1.100 的远程主机。

请注意,Windows 中的 portproxy 模式不支持在转发的网络数据包中保存源 IP。如果您将端口 443 从 Windows 设备转发到内部 Web 服务器,则所有传入连接将在目标服务器上显示为来自同一 IP 地址(来自启用了 netsh portproxy 的 Windows 主机)。如果需要使用源 IP 转发,则需要在外部防火墙或 Hyper-V 上使用 NAT(如下所述)。

此外,您还可以使用 Windows 中的 SSH 隧道将本地端口转发到远程服务器。

在Windows中配置端口转发模式的防火墙规则

确保您的防火墙(Microsoft Windows Defender 或第三方防火墙,通常是防病毒软件的一部分)允许到新端口的传入连接。您可以使用以下命令向 Windows Defender 防火墙添加新的允许规则:

netsh advfirewall firewall add rule name="forwarded_RDPport_3340" protocol=TCP dir=in localip=10.1.1.110  localport=3340 action=allow

或者使用 New-NetFirewallRule PowerShell cmdlet:

New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP -LocalPort 3340 -Action Allow

通过 Windows Defender 防火墙图形界面为 TCP/3340 端口创建入站防火墙规则时,不需要将程序或进程与该规则关联。该端口仅由网络驱动程序侦听。

如果禁用 portproxy 规则,请务必删除剩余的防火墙规则,如下所示:

netsh advfirewall firewall del rule name="RDP_3340"

或使用 PowerShell 删除防火墙规则:

Remove-NetFirewallRule -Name RDP_3340

在 Windows 中管理 Netsh 端口转发规则

您可以在 Windows 中创建任意数量的端口转发规则。所有 netsh 接口端口代理规则都是持久的,并在 Windows 重新启动后保留。

我多次遇到在 Windows Server 2012 R2 中服务器重新启动后端口转发规则被重置的情况。此时,您需要检查网络接口是否存在周期性断开以及操作系统启动时IP地址是否发生变化(最好使用静态IP,而不是动态DHCP)。作为解决方法,我必须将带有 netsh 接口端口代理规则的批处理脚本添加到在系统启动时运行的 Windows 任务计划程序。

要显示 Windows 上所有启用的 TCP 端口转发规则的列表,请运行以下命令:

netsh interface portproxy show all

在我们的例子中,从本地端口 3340 到 3389 只有一条转发规则:

Listen on ipv4:             Connect to ipv4:
Address         Port        Address         Port
--------------- ----------  --------------- ----------
10.1.1.110     3340        10.1.1.110     3389

[玩转系统] 在 Windows 中配置端口转发

提示。您还可以列出portproxy中的所有端口转发规则,如下所示:

netsh interface portproxy dump
#========================
# Port Proxy configuration
#========================
pushd interface portproxy
reset
add v4tov4 listenport=3340 connectaddress=10.1.1.110 connectport=3389
popd
# End of Port Proxy configuration

[玩转系统] 在 Windows 中配置端口转发

如果需要更改现有端口代理规则的设置,请使用以下命令:

netsh interface portproxy set v4tov4 listenport=3340 listenaddress=10.10.1.110 connectport=3300 connectaddress=10.10.1.110

在此示例中,我们将 portproxy 目标端口号更改为 3300。

[玩转系统] 在 Windows 中配置端口转发

要删除特定端口转发规则:

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

要删除所有现有的端口映射规则并完全清除端口转发规则表:

netsh interface portproxy reset

重要。此端口转发方案仅适用于 TCP 端口。您将无法以这种方式转发 UDP 端口。另外,您不能使用环回接口 127.0.0.1 (localhost) 作为

connectaddress

您可以使用安装了 RRAS(路由和远程访问服务和 NAT)角色的 Windows Server 来启用 UDP 流量的端口转发。您可以使用图形管理单元 (

rrasmgmt.msc

)或使用命令:

netsh routing ip nat add portmapping Ethernet1 udp 0.0.0.0 53 192.168.100.100 53

Windows Server中的NAT端口转发规则列表如下:

netsh routing ip nat show interface

如果您的计算机上安装了 WSL(适用于 Linux 的 Windows 子系统),则可以创建一个简单的 PowerShell 脚本来创建到 WSL 2 虚拟机的端口转发规则(WSL2 VM 有自己的虚拟以太网适配器,具有唯一的 IP 地址):

wsl --shutdown;
netsh interface portproxy reset;
$wsl_ipaddr = wsl -d Ubuntu-20.04 hostname -I;
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=$wsl_ipaddr ;
netsh interface portproxy show all;
exit;

portproxy 的另一个隐式功能是能够使任何远程网络服务看起来像在本地运行。例如,您希望将本地端口 9090 的连接转发到远程 HTTPS 服务器(

google.com:443

netsh interface portproxy add v4tov4 listenport=9090 connectport=443 connectaddress=google.com protocol=tcp

现在,如果您在浏览器中访问 http://localhost:9090/,Google 搜索页面将会打开(您需要忽略 SSL_ERROR_BAD_CERT_DOMAIN 错误)。因此,尽管浏览器访问本地计算机地址,但它还是从外部 Web 服务器打开页面。

[玩转系统] 在 Windows 中配置端口转发

Windows 无法转发一定范围的 TCP 端口。如果您需要转发多个端口,则必须手动创建多个端口代理重定向规则。

端口转发规则还可用于将端口从物理 NIC 的外部 IP 地址重定向到同一主机上运行的虚拟机的端口。在 Hyper-V 中,您可以在虚拟交换机级别配置端口转发(见下文)。

Hyper-V 虚拟交换机上使用 NAT 规则进行端口转发

在计算机上使用 Hyper-V 角色(可以安装在 Windows 10/11 和 Windows Server 上,或作为免费的 Hyper-V 服务器)时,可以使用 PowerShell 配置 DNAT 端口转发规则。假设您要将 Hyper-V 主机收到的所有 HTTPS 流量重定向到主机上运行的虚拟机的 IP 地址。为此,请使用 Hyper-V StaticMapping 命令。

创建 Hyper-V 虚拟交换机:

New-VMSwitch -SwitchName NAT_Switch -SwitchType Internal

[玩转系统] 在 Windows 中配置端口转发

设置新虚拟交换机的 IP 地址:

New-NetIPAddress -IPAddress 192.168.100.1 -PrefixLength 24  -InterfaceAlias "vEthernet (NAT_Switch)"

为此网络启用 NAT:

New-NetNat -Name NATNetwork -InternalIPInterfaceAddressPrefix 192.168.100.0/24

将 VM 连接到 NAT_Switch 并为其分配静态 IP 地址(例如 192.168.10.80)。将 Hyper-V 虚拟交换机 IP 地址(本例中为 192.168.100.1)设置为虚拟机网络连接的默认网关。

您现在可以启用从 Hyper-V 主机到虚拟机的端口转发:

Add-NetNatStaticMapping -NatName NATNetwork443 -Protocol TCP  -ExternalIPAddress 0.0.0.0/24  -ExternalPort 443  -InternalIPAddress 192.168.10.80  -InternalPort 443

执行这些 PowerShell 命令后,所有到达 Hyper-V 主机 TCP/443 端口的 HTTPS 流量都将转发到虚拟机的私有 IP 地址。

如果您想为非标准端口创建端口转发规则,请不要忘记在Windows防火墙中打开它:

New-NetFirewallRule -DisplayName "HyperV_Nat_444" -Direction Inbound -LocalPort 444 -Protocol TCP -Action Allow -Enabled True

您可以在 Hyper-V 主机上显示 NAT/PAT 端口转发规则的完整列表,如下所示:

Get-NetNat

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯