最近有需求使用ssh隧道,顺便研究了下,以下记录一下大概说明
ssh隧道顾名思义在可以通过ssh连接的server之间建立加密隧道,常用于突破网络限制
常用三种端口转发模式:本地端口转发,远程端口转发,SOCKS代理
一、本地端口转发
场景1:
本机A:10.10.100.1
跳板机B:111.111.111.111
远程主机C:222.222.222.222
主机A可以ssh连接到B但无法ssh到C
主机B可以ssh到C
现在希望从主机A ssh到主机C
这种情况在一些防火墙环境下非常常见
现在使用如下命令建立隧道
ssh -Nf -L 127.0.0.1:2222:222.222.222.222:22 111.111.111.111
此时查看本地会发现本地监听2222端口,此时ssh连接本地2222端口即是连接主机C
-N 表示不执行任何命令只建立连接
-f 表示后台运行
-L 参数格式:[local_address:]local_port:remote_host:remort_port,本地地址可以省略,默认127.0.0.1(有人说是所有地址,但我测试的默认是环回地址)
此方案还可用于远程mysql等服务端口映射到本地,然后使用图形化工具管理等
二、远程端口转发
场景2:
主机A:10.10.100.1 本身没有公网地址,通过NAT方式上网
主机B:111.111.111.111 公网主机
主机A可以ssh连接到主机B,但由于是NAT公网无法主动连接到主机A
现在需要从公网ssh到主机A
使用如下方式建立隧道
ssh -Nf -R 0.0.0.0:2222:127.0.0.1:22 111.111.111.111
建立成功后会发现主机B 监听2222端口,此时通过任意机器连接主机B的2222端口即连接主机A
这种方式常用于访问防火墙后或通过NAT上网的内外主机
三、SOCKS代理
场景3:
主机A:10.10.100.1 内网机器无法访问公网
主机B:10.10.100.2 内网机器,但有公网地址,可以访问公网
现在需要主机A通过主机B访问公网(当然也有别的解决方案,我们这里只讨论ssh隧道技术)
使用如下命令建立隧道
ssh -Nf -D 1080 10.10.100.2
此时主机A监听1080端口,其他程序需要配置socks代理转发到此端口即可访问公网
若程序本身不支持配置socks代理,可能还需要些其他的代理工具。
(参见上一篇文章ssh代理上网 http://www.cnblogs.com/soyops/p/sshsocket.html)
这种方式如果有一台国外的vps可以建立隧道用来*。
注:若使用隧道*的话最好开启压缩参数(-C)速度会快很多。