Windows
Windows内置了tcp端口转发的功能,通过netsh interface portproxy命令设置,PortProxy 对其做了封装,通过图形界面即可进行管理。
Linux
ssh就可以实现tcp端口转发,而且很强大。
假定client可建立到server的ssh连接。
可以在client上监听端口pl,通过client<–>server的ssh隧道,建立client:listen-port <==> client<-->server <==> target:target-port
的连接,这称为本地端口转发。
可以在server上监听端口pl,通过server<–>client的ssh隧道,建立server:listen-port <==> server<-->client <==> target:target-port
的连接,这称为远程端口转发。
本地端口转发,在client上执行:
ssh -L listen-port:target:target-port server
远程端口转发,在client上执行:
ssh -R listen-port:target:target-port server
其他选项:
-g Allow remote hosts to connect to forwarded ports.
-N Do not execute a shell or command.
-f Fork into background after authentication.
不加-g,会在127.0.0.1上监听,加了-g,会在0.0.0.0上监听
不加-fN,会登陆到server上,登出时隧道也关闭;加了-fN,进程会在server后台运行
本地端口转发中,target和target-port都是指定好的,还有一种本地动态端口转发,选项是-D listen-port,这种转发不提前指定目的地址和目的端口,而是去读取应用发起的请求,从请求中获取目的信息。ssh将作为一个SOCKS server,支持SOCKS4和SOCKS5协议。
例子1
host1是一个公网服务器(有公网ip),但22端口没对公网开放,仅开放了若干其他端口对外提供TCP或基于TCP的应用层服务,这里假定端口为px、py、pz。
如果将host1上px转发到22端口,能访问host1的主机便可建立与host1的ssh连接。
在host1上执行 ssh -gfNL px:localhost:22 localhost
这里client、server均是host1,host1:22是target
其他主机登陆host1的命令是:ssh host1 -p px
例子2
host2是一个内网机器,能访问公网。
在例子1的配置后,host2已能建立与host1的ssh连接。
如果其他机器想要登陆host2,可通过host1的py端口转发到host2的22端口。
在host2上执行 ssh -gfNR py:localhost:22 host1 -p px
这里host2是client,host1是server,host2:22是target
其他主机登陆host2的命令是:ssh host1 -p py
这里也可不指定-g,先登陆到host1上,再执行ssh localhost -p py即可
例子3
host2所在的局域网中有一些http服务器,如何让能访问公网的机器上的浏览器可以通过host2访问这些网址?
在例子2中包括host1自身在内的其他机器已经能建立与host2的ssh连接了。
可通过host1的pz端口,通过host1<–>host2的连接,将http请求转发至目标http服务器。
在host1上执行 ssh -gD pz localhost -p py
,然后在想要访问那些http服务器的机器上设置代理,服务器地址填host1,端口填pz。