在Windows上配置端口转发
我们可以在所有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地址。