在Windows上配置端口转发

时间:2020-01-09 10:46:45  来源:igfitidea点击:

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

在Linux世界中,使用iptables或者Firewalld非常简单地配置端口转发。在Windows Server系统上,路由和远程访问服务(RRAS)通常用于配置端口重定向。但是,有一种更简单的方法来配置端口转发,该方法在任何Windows版本中均能很好地工作。

如何使用Netsh Portproxy在Windows 10上配置端口转发?

我们可以在Windows中使用Netsh命令的Portproxy模式配置端口转发。命令语法如下:

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

其中

  • " listenaddress"是用于侦听传入连接的本地IP地址(如果我们在一个接口上具有多个NIC或者多个IP地址,则很有用);
  • listenport本地监听TCP端口号(连接正在等待);
  • connectaddress是我们要将传入连接重定向到的本地或者远程IP地址(或者DNS名称);
  • " connectport"是一个TCP端口,连接来自该端口
listenport

被转发给。

使用

netsh interface portproxy add
v4tov6

/

v6tov4

/

v6tov6

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

假设我们的任务i是使RDP服务在非标准端口(例如3340)上响应(可以在远程桌面服务的设置中更改该端口,但是我们正在使用RDP使其更易于演示端口转发)。为此,我们需要将传入流量从TCP端口3340重定向到另一个本地端口3389(这是默认的RDP端口号)。

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

netstat -na|find "3340"

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

Test-NetConnection -ComputerName localhost -Port 3340

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

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

其中10.10.1.110这台计算机的当前IP地址。

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

netstat -ano | findstr :3340

注意如果此命令未返回任何内容,并且通过netsh接口portproxy进行的端口转发不起作用,请确保计算机上正在运行" iphlpsvc"(IP帮助程序)服务。

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

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

要使端口转发在Windows Server 2003/XP上工作,必须另外在注册表项HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters中将IPEnableRouter参数设置为1.

我们可以使用其PID找出在指定端口上侦听的进程(在我们的示例中,PID为636):

tasklist | findstr 636

让我们尝试使用任何RDP客户端从远程计算机连接到此端口。应将端口3340指定为RDP端口号。在RDP服务器地址后的冒号后面指定。例如,

10.10.1.110:3340

RDP连接应成功建立。

如果要将传入的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 SSH隧道将本地端口转发到远程服务器。

在Windows中管理端口转发规则

重要。确保防火墙(Microsoft Windows Defender防火墙或者防病毒软件中通常包含的第三方防火墙)允许传入到新端口的连接。我们可以使用以下命令向Windows Defender防火墙添加新的允许规则:此外,在某些情况下,在Windows Server 2012 R2中,服务器重新引导后,端口转发规则将被重置。在这种情况下,我们需要检查网络接口上是否存在定期断开连接,以及在操作系统启动时IP地址是否更改(最好使用静态IP而不是动态DHCP)。解决方法是,我必须使用在系统启动时运行的netsh接口portproxy规则,将批处理脚本添加到Windows Task Scheduler。

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防火墙图形界面为端口3340创建传入防火墙规则时,无需与程序关联。该端口仅由网络驱动程序侦听。

我们可以创建任意数量的Windows端口转发规则。 Windows重启后,所有netsh接口portproxy规则都是持久性规则,并存储在系统中。

提示。我们还可以在portproxy中列出端口转发设置,如下所示:

要显示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

重要。此转发方案仅适用于TCP端口。我们将无法以这种方式转发UDP端口。我们也不能使用环回接口127.0.0.1作为

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

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

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

要删除所有现有的映射规则并完全清除端口转发规则表,请执行以下操作:

netsh interface portproxy reset

connectaddress

{分块}

我们可以将Windows Server与RRAS和NAT角色一起安装,以配置UDP流量的端口转发。我们可以使用图形化管理单元(

rrasmgmt.msc

)或者使用以下命令:

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

另一个portproxy功能是使它看起来像任何远程网络服务都在本地运行的机会。

例如,让我们将连接从本地端口5555重定向到IP地址为157.166.226.25的远程HTTP服务器(CNN网站):

netsh interface portproxy add v4tov4 listenport=5555 connectport=80 connectaddress= 157.166.226.25 protocol=tcp

现在,如果我们在浏览器中转到http:// localhost:5555 /,则CNN开始页面将打开。因此,尽管浏览器正在访问本地计算机,但它会从外部Web服务器打开页面。

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

Windows无法转发一系列TCP端口。如果需要转发多个端口,则必须手动创建多个portproxy转发规则。最简单的方法是生成

netsh interface portproxy add

在记事本中使用具有不同端口号的命令,然后将其粘贴到命令提示符中以执行。

Hyper-V服务器中的端口转发

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

首先,我们需要使用NAT创建虚拟交换机:

New-VMSwitch -Name "HTTPS-NAT" -SwitchType NAT -NATSubnetAddress 192.168.100.0/24

然后,我们需要将必要的VM连接到指定的vswitch,并为通过此Hyper-V虚拟交换机连接的所有虚拟机启用地址转换规则:

New-NetNat -Name HTTPS-NAT -InternalIPInterfaceAddressPrefix 192.168.100.0/24 Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/24" -ExternalPort 443 -Protocol TCP -InternalIPAddress "192.168.100.77" -InternalPort 443 -NatName HTTPS-NAT

执行完这些PowerShell命令后,所有到达Hyper-V主机端口443的HTTPS通信都将转发到虚拟机的专用IP地址。