ssh port forwarding

SSH Port forwarding的适用场景有很多,最常用的是两台机器之间无法访问时,需要在中间有一个跳板机。这两台机器利用 SSH Port Forwarding 技术,利用跳板机作为桥梁来互相访问。 这种技术细分又可以划分为 Local 和 Remote 两种。

Local

我们用一个例子来看, 假设我们有机器 client 和 server 两者不能直接互相访问。 中间有一个机器叫middle,middle 可以访问client 和 server。 所以我们利用middle作为桥梁。 Local 模式需要在client 机器上运行以下命令:

ssh -L 8228:server:22 root@middle

这段命令的意思是把 client 上 localhost:8228 收到的数据转发给 server:22。 拆开来理解:

root@middle

这部分会client 登录到 middle,也就是建立了一个client到middle的通道。

-L 8228:server:22

这部分指定,local 8228端口收到的数据转发给 server的22端口。转发时通过 client 到 middle的通道实现。 这部分还可以写成如下形式:

-L client:8228:server:22

根上面的区别就是,前一种方式,ssh 服务监听在localhost:8228, 会把发送到localhost:8228的数据转发,而对于发送到 client:8228 的数据则会拒绝服务。后面的写法会让client的ssh监听在 client:8228,所以后一种写法会转发client:8228的数据。

Remote

remote 的适用场景如下。假设server上的服务不允许外网访问,或者server本身没有一个外网ip,但是server可以访问到一台外网服务器 middle。所以,这时候作为client想要访问server可以做如下事情。 我们可以在server运行

ssh -R 8228:localhost:22 root@middle

运行完这条命令我们就可以访问middle的8228端口。(注意是localhost:8228)这就等于访问server的22

我们拆开来理解这条命令:

root@middle

这部分让server发起一条 ssh 通道连接到 middle。

-R 8228:localhost:22

这部分让middle上监听一个8228端口,并把收到的数据转发给server的22. 要注意的是,这里即使你写成 -R middle:8228:server:22, 在middle上ssh仍然监听localhost:8228. 所以想访问server的22,你要么登录middle去访问localhost:8228,要么再做一个端口映射,把middle的8228映射到外网地址

Local mode on middle

middle上运行如下命令:

ssh -fNL middle:8228:server:22 root@middle

其实可以实现在middle上监听8228并把受到的数据发给server

posted on 2015-12-28 14:52  kramer  阅读(404)  评论(0编辑  收藏  举报

导航