Windows 从 Windows 2000 开始就提供了最基本的端口转发功能,是基于 Windows 的 IP Helper 服务的,不仅可以提供端口转发功能,还可以通过将 IPv4 和 IPv6 的不同地址的数据进行转发,但是只可以转发 TCP 协议,暂不支持 UDP 协议,使用 netsh interface portproxy 命令即可开启。
一个一个介绍,先说 show 命令:
show 命令可以查看已经存在的端口转发规则。用法如下:
show all - 显示所有端口代理参数。
show v4tov4 - 显示 IPv4 代理连接到另一个 IPv4 端口的参数。
show v4tov6 - 显示 IPv4 代理连接到 IPv6 的参数。
show v6tov4 - 显示 IPv6 代理连接到 IPv4 的参数。
show v6tov6 - 显示 IPv6 代理连接到另一个 IPv6 端口的参数。
例如我想查看所有的端口转发规则,则可以使用 netsh interface portproxy show all。
PS C:\Windows\system32> netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
127.0.0.1 3389 25.63.54.89 3389
这个就不说了,打印帮助信息...
add 命令可以增加一条端口转发规则,具体用法为:
add v4tov4 - 添加通过 IPv4 的 IPv4 和代理连接到的侦听项目。
add v4tov6 - 添加通过 IPv6 的 IPv4 和代理连接到的侦听项目。
add v6tov4 - 添加通过 IPv4 的 IPv6 和代理连接到的侦听项目。
add v6tov6 - 添加通过 IPv6 的 IPv6 和代理连接到的侦听项目。
用法: add v4tov4 [listenport=]|
[connectaddress=]|
[[connectport=]|]
[[listenaddress=]|]
[[protocol=]tcp]
参数:
标记 值
listenport - IPv4 侦听端口。
connectaddress - IPv4 连接地址。
connectport - IPv4 连接端口。
listenaddress - IPv4 侦听地址。
protocol - 使用的协议。现在只支持 TCP。
例如我想将本地的 3389 端口转发到远程的 3389 端口上,可以使用以下命令实现:
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=3389 connectaddress=25.63.54.89 connectport=3389
其中 v4tov4 的作用在于将 IPv4 地址的 3389 端口转发到 IPv4 地址的 3389端口上,listenaddress 指定本地监听的地址,listenport 指定本地监听的端口,connectaddress 指定要将数据转发到哪个地址去,也就是目的地址,connectport 指定要转发到的端口,也就是目的端口。
delete 命令用来删除一条端口转发规则,删除时只需要指定端口转发的监听地址和端口即可,具体用法为:
delete v4tov4 - 删除通过 IPv4 的 IPv4 和代理连接到的侦听项目。
delete v4tov6 - 删除通过 IPv6 的 IPv4 和代理连接到的侦听项目。
delete v6tov4 - 删除通过 IPv4 的 IPv6 和代理连接到的侦听项目。
delete v6tov6 - 删除通过 IPv6 的 IPv6 和代理连接到的侦听项目。
用法: delete v4tov4 [listenport=]|
[[listenaddress=]|]
[[protocol=]tcp]
参数:
标记 值
listenport - 要侦听的 IPv4 端口。
listenport - 要侦听的 IPv4 地址。
protocol - 要使用的协议。当前仅支持 TCP。
例如我想删除刚才添加的端口转发规则,先查看下目前存在的端口转发规则:
PS C:\Windows\system32> netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
127.0.0.1 3389 25.63.54.89 3389
执行删除命令 PS C:\Windows\system32> netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=3389 即可。
PS C:\Windows\system32> netsh interface portproxy delete v4tov4 listenaddress=127.0.0.1 listenport=3389
PS C:\Windows\system32> netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
dump 命令可以将已存在的端口转发规则进行输出,保存到一个文件中或者输出到控制台的标准输出中,方便发送给其他人或者进行备份,以备下次还原。
执行 netsh interface portproxy dump 将配置信息输出到控制台的标准输出,或者执行 netsh interface portproxy dump > 1.txt 命令将配置信息重定向到文件中。
PS C:\Windows\system32> netsh interface portproxy dump
#========================
# 端口代理配置
#========================
pushd interface portproxy
reset
add v4tov4 listenport=3389 connectaddress=25.63.54.89 connectport=3389
popd
# 端口代理配置结束
PS C:\Windows\system32> netsh interface portproxy dump >1.txt
set 命令可以修改现有的端口转发配置,也可以新加端口转发配置。
例如将刚才的远程地址和端口改为 123.124.125.126:3390,使用以下命令来修改。
PS C:\Windows\system32> netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
127.0.0.1 3389 25.63.54.89 3389
C:\Windows\system32>netsh interface portproxy set v4tov4 listenaddress=127.0.0.1 listenport=3389 connectaddress=123.124.125.126 connectport=3390
C:\Windows\system32>netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
127.0.0.1 3389 123.124.125.126 3390
本来以为可以将刚才 dump 命令导出的配置重新导入的,但是我没成功....可能人家就没设计这个功能吧, 有点尴尬的...如果有知道的小伙伴可以告诉我。
reset 命令可以重置所有的端口转发规则,如果没有备份的小伙伴慎用。
C:\Windows\system32>netsh interface portproxy show all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
127.0.0.1 3389 123.124.125.126 3390
C:\Windows\system32>netsh interface portproxy reset
C:\Windows\system32>netsh interface portproxy show all
C:\Windows\system32>
如果有添加了规则但是规则不生效的小伙伴,可以检查下 Windows 的 IP Helper 服务是否开启,因为端口转发功能是由这个服务支持的,一定要保证它是正常运行的才可以。还有,在监听本地地址上的端口时,最好先确定本地的端口没有被占用,防止端口冲突影响其他程序的正常运行。
以上就是端口转发功能的使用教程,在平时的开发中临时需要和虚拟机通信或者其他场景中还是比较常用的,虽然只支持 TCP 协议,不过 UDP 在平时使用的并不多,TCP 也足够了,所以还是可以满足日常开发需求的。