SSH Tunnel

爱情隧道

SSH (SSH 全称为 Secure Shell)端口转发也被称作 SSH 隧道(SSH Tunnel),因为它们都是通过SSH登陆之后,在 SSH 客户端与 SSH 服务端之间建立了一个隧道,从而进行通信。SSH 隧道是非常安全的,因为 SSH 是通过加密传输数据的。有了隧道我们自然可以翻山越岭,看看外面的花花世界。

简介

SSH 有三种端口转发模式,本地端口转发(Local Port Forwarding),远程端口转发(Remote Port Forwarding)以及动态端口转发(Dynamic Port Forwarding)。

符号说明

文中使用A、B、C:

  • A,本地
  • B,远端SSH服务器
  • C,目标服务器

Local Port Forwarding

使用场景

A——>B:portB——>C:portC
A——❌——>C:portC

如上图所示,本地主机A 可以访问远端 SSH 服务器 B 端口 portB,B 可以访问目标主机 C 端口 portC,但是 A 访问 C 的端口 portC。当然 C 也可能是 B(有点绕。。。):

A——>B:portB——>B:portB2
A——❌——>B:portB2

上图所示本地主机 A 可以访问远端SSH服务器 B 的 PortB 端口,但不能访问 PortB2 端口。

使用本地端口转发就可以解决上述问题。

使用

命令如下:

1
ssh -L [bind_address:]port:host:hostport [user@]hostname

bind_address 是本地主机地址,可省略,表示绑定本机所有IP。port 是本地主机绑定的端口。

例:

1
ssh -L A:portA:C:portC 用户名@B

这样,发送到本地端口 portA 的数据将会通过 B 转发给 C 的端口 portC,效果如下:

*——>A:portA======B======>C:portC

Remote Port Forwarding

使用场景

C:portC<——A——>B:portB
C:portC<——❌——B

如上图所示,本地主机A 可以访问远端 SSH 服务器 B 端口 portB,A 也可以访问目标主机 C 端口 portC,但是 B 不能访问 C 的端口 portC。当然 C 也可能是 A:

A——–>B:portB
A:portA<—❌—B

很多情况下是因为本地主机 A 处在内网,外网无法直接访问 A,就可以使用该方法进行 NAT 穿透。

使用

命令如下:

1
ssh -R [bind_address:]port:host:hostport [user@]hostname

bind_address 是远端 SSH 服务器绑定地址,同样可省略。port 是远端 SSH 服务器绑定的地址。

例:

1
ssh -R B:portB:C:portC 用户名@B

这样,发送到远端服务器B portB 的数据将会通过本地主机 A 转发给 C 的端口 portC,效果如下:

*——>B:portB======A======>C:portC

Dynamic Port Forwarding

使用场景

上述两个端口转发都限制了目标服务器以及目标服务器对应的端口,而动态端口转发更像是一个代理。

A——>B:portB——>花花世界
A——❌——>花花世界

看到这,是不是发现了什么?

使用

命令如下:

1
ssh -D [bind_address:]port [user@]hostname

bind_address 是本地主机地址,可省略,表示绑定本机所有IP。port 是本地主机绑定的端口。

例:

1
ssh -D A:portA 用户名@B

这样,发送到本地主机 A portA 的数据将会转发给B,远程主机 B 会根据数据包的应用层协议(如HTTP)自动建立对应的连接,并将数据返回给 A。

SSH 部分参数

-p: 指定端口
-C: 压缩发送/接受的数据
-N: 不执行远端命令,端口转发时使用
-f: 后台操作,通常和-N连用
-g: 允许远端主机连接本地转发端口

其他命令可参考手册

1
man ssh
Cotin Yang wechat
欢迎订阅我的微信公众号 CotinDev
小小地鼓励一下吧~😘