隧道是一种把一种网络协议封装进另外一种网络协议进行传输的技术。这里我们研究ssh隧道,所以所有的网络通讯都是加密的。又被称作端口转发,因为ssh隧道通常会绑定一个本地端口,所有发向这个端口的数据包,都会被加密并透明地传输到远端系统。
动态端口转发(Socks 代理)
动态端口允许通过配置一个本地端口,把通过隧道到数据转发到远端的所有地址。本地的应用程序需要使用Socks协议与本地端口通讯。此时SSH充当Socks代理服务器的角色。
命令格式
ssh -D [bind_address:]port
参数说明
bind_address 指定绑定的IP地址,默认情况会绑定在本地的回环地址(即127.0.0.1),如果空值或者为*会绑定本地所有的IP地址,如果希望绑定的端口仅供本机使用,可以指定为localhost。
port 指定本地绑定的端口
使用场景
主机A(192.168.18.100)
主机B(192.168.2.100)
主机C(192.168.2.101)
主机A可以连接主机B,但无法连接主机C(BC互通)。在主机A执行
1 | # 主机A(此时A ip 为主机B ip) |
curl –socks5 127.0.0.1:1080
本地流量走向sshserver(192.168.2.100)
然后主机A上的应用程序就可以通过 SOCKS5 localhost:1080 访问主机C上的服务。这种情况可以用socks5和vps实现科学上网
本地端口转发
通过SSH隧道,将一个远端机器能够访问到的地址和端口,映射为一个本地的端口。
命令格式
1 | ssh -L [bind_address:]port:host:hostport |
有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的”端口转发”。为了区别后文的”远程端口转发”,我们把这种情况称为”本地端口转发”(Local forwarding)。
假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。
1 | host1执行下面的命令 |
命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。
这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。
“本地端口转发”使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为”SSH隧道”。
ssh登录多台服务器
远程端口转发
既然”本地端口转发”是指绑定本地端口的转发,那么”远程端口转发”(remote forwarding)当然是指绑定远程端口的转发。
还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,”本地端口转发”就不能用了,怎么办?
解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。
我们在host3执行下面的命令:
1 | $ ssh -R 2121:host2:21 host1 |
R参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口”。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为”远程端口绑定”。
绑定之后,我们在host1就可以连接host2了:
1 | $ ftp localhost:2121 |
“远程端口转发”的前提条件是,host1和host3两台主机都有sshD和ssh客户端。
SSH的其他参数
N参数,表示只连接远程主机,不打开远程shell;
T参数,表示不为这个连接分配TTY。这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。
1 | $ ssh -NT -D 8080 host |
f参数,表示SSH连接成功后,转入后台运行。这样一来,你就可以在不中断SSH连接的情况下,在本地shell中执行其他操作。
1 | $ ssh -f -D 8080 host |
参考网址:
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html
http://www.zsythink.net/archives/2450
https://blog.csdn.net/king_cpp_py/article/details/79560606