利用netsh命令实现端口映射(端口转发)的功能(netsh命令仅在windows系统下可用,文章后面附linux端口转发)
使用场景:
购买了一台windows云主机,把内网3389远程连接的端口映射到公网23789。
目的:在外网使用公网IP:23789远程连接windows云主机,在内网(有多台云主机且都在同一个局域网)其他主机上使用内网IP:3389访问。
-
打开命令提示符(Command Prompt)或Windows PowerShell。你可以在开始菜单中搜索“cmd”或“PowerShell”来找到它们。
-
使用
netsh
命令来配置端口转发。以下是一些常见的用法:a. 端口转发:
netsh interface portproxy add v4tov4 listenaddress=本地IP listenport=本地端口 connectaddress=目标IP connectport=目标端口 #目标IP可以是本机的当前网卡IP,也可以是本机的其他网卡的IP,也可以是其他可以访问到的主机的IP
- listenaddress可以不写,默认监听本机所有IP的请求,listenaddress指定其中某一个IP地址。那么只有请求这一个IP地址的本地端口才能转发到目的IP。
- netsh interface portproxy add v4tov4 listenaddress=192.168.1.100 listenport=23789 connectaddress=192.168.1.100 connectport=3389 #只有访问192.168.1.100的23789才转发请求。
- netsh interface portproxy add v4tov4 listenport=23789 connectaddress=192.168.1.100 connectport=3389 #访问本机任何IP的23789都能转发。
-
这将在本地IP的本地端口上监听连接,并将它们转发到目标IP的目标端口。
b. 删除端口转发规则:
netsh interface portproxy delete v4tov4 listenaddress=本地IP listenport=本地端口
这将删除之前设置的端口转发规则。
-
确保端口转发规则生效,你可以运行以下命令来查看当前的端口转发规则列表:
netsh interface portproxy show all
在Linux中,你可以使用一些不同的工具和方法来进行端口转发,具体取决于你的需求和环境。以下是两种常见的方法:
-
使用iptables进行端口转发:
iptables
是Linux上用于配置防火墙规则的工具,也可以用于端口转发。你可以使用iptables
来将传入的连接从一个端口转发到另一个端口。下面是一个示例,将本地端口80的传入连接转发到目标IP的端口8080:sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 目标IP:8080
-
iptables
: 这是Linux上的防火墙配置工具。 -
-t nat
: 这个部分指定了防火墙表(table)和链(chain)。在这里,-t nat
表示你要操作的是NAT表,用于进行网络地址转换。 -
-A PREROUTING
: 这个部分指定了规则要添加到哪个链中。在这里,-A PREROUTING
表示要将规则添加到 PREROUTING 链中,这是一个在数据包进入路由之前处理的链,通常用于进行端口转发。 -
-p tcp
: 这个部分指定了数据包的协议类型,这里是TCP。 -
--dport 80
: 这个部分指定了要匹配的目标端口,即传入连接的目标端口为80。 -
-j DNAT
: 这个部分指定了要执行的操作。-j DNAT
表示要进行目标地址转换(Destination NAT),也就是将数据包的目标地址修改为指定的目标IP地址。 -
--to-destination 目标IP:8080
: 这个部分指定了转发到的目标IP地址和端口。数据包将被转发到目标IP的8080端口。
这个命令将传入的HTTP连接重定向到目标IP的8080端口。
请注意,要使这些规则在系统重启后仍然生效,你需要保存
iptables
规则。 -
-
使用SSH进行端口转发:
如果你希望在两个远程主机之间进行端口转发,可以使用SSH的端口转发功能。例如,你可以使用以下命令将本地端口8888的连接通过SSH通道转发到远程主机的80端口:
ssh -L 8888:目标IP:80 用户名@远程主机IP
这将在本地主机上创建一个监听端口8888的代理,所有传入的连接将被转发到目标IP的80端口。
请注意,这种方法需要SSH服务器在目标主机上运行,并且需要有SSH登录的权限。
-