利用 ssh 隧道实现端口转发或代理

使用方法

ssh -NL 30080:host_by_remote_host:80 -p 22 sddt@remote_host

上面的命令只能使用 localhost127.0.0.1 访问端口,如果要共享给局域网的用户,应该这样写:

ssh -NL local_ip:30080:host_by_remote_host:80 -p 22 sddt@remote_host

原理

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。

我们在host1执行下面的命令:

ssh -L 2121:host2:21 host3

命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。

这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。

ftp localhost:2121

“本地端口转发”使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为”SSH隧道”。

下面是一个比较有趣的例子。

ssh -NL 30080:localhost:80 -p 6001 sddt@47.102.159.103

它表示将本机的5900端口绑定host3的5900端口(这里的localhost指的是host3,因为目标主机是相对host3而言的)。

另一个例子是通过host3的端口转发,ssh登录host2。

ssh -L 9001:host2:22 host3

这时,只要ssh登录本机的9001端口,就相当于登录host2了。

ssh -p 9001 localhost

上面的-p参数表示指定登录端口。

参考资源:SSH原理与运用(二):远程操作与端口转发