码蚁

打码改变人生

三种类型的 SSH 隧道

Posted at — Mar 16, 2017

大家都知道SSH是一种安全的传输协议,用在连接服务器上比较多。不过其实除了这个功能,它的隧道转发功能更是吸引人。

何谓 SSH 隧道

隧道是一种把一种网络协议封装进另外一种网络协议进行传输的技术。这里我们研究ssh隧道,所以所有的网络通讯都是加密的。又被称作端口转发,因为ssh隧道通常会绑定一个本地端口,所有发向这个端口端口的数据包,都会被加密并透明地传输到远端系统。

SSH 隧道的类型

ssh隧道有3种类型:

  1. 动态端口转发(SOCKS5 代理)
  2. 本地端口转发
  3. 远端端口转发

动态端口转发

动态端口允许通过配置一个本地端口,把通过隧道到数据转发到远端的所有地址。本地的应用程序需要使用 SOCKS5 协议与本地端口通讯,此时 SSH 充当 SOCKS5 代理服务器的角色。

使用场景

SSH Tunnel D

SSH Client 端无法访问「真正」的互联网,如使用 SSH 隧道动态端口转发,Client 端数据利用隧道传递 Server 端,Server 端再转发至 Internet。Client 端应用程序需支持 SOCKS5 代理。

命令格式

$ ssh -fCN -D 0.0.0.0:1080 [email protected] -p 22

命令说明

优点

配置一个代理服务就可以访问远端机器和与其所在网络的所有服务。

缺点

应用程序需要额外配置 SOCKS5 代理,若应用程序不支持代理配置则无法使用。

本地端口转发

通过SSH隧道,将一个远端机器能够访问到的地址和端口,映射为一个本地的端口。

使用场景

SSH Tunnel D

由于某些原因 Client 端无法连接 MySQL 服务器,但是可以连接其同网络的 SSH Server,Client 可以利用隧道将本地某个端口映射为 MySQL 的端口,这样本地就可以透明访问 MySQL 服务器了,SSH Server 端可以理解为「内应者」。

命令格式

$ ssh -fCN -L 0.0.0.0:3307:1.2.3.56:3306 -p 22 [email protected]

命令说明

Client 会在本地打开一个 SSH 的守护进程,该进程会监听本地的 3307 端口,这个端口为隧道的入口,当访问本地的 3307 端口时,数据包会通过 SSH 进程,经由 SSH Server 1.2.3.4 发送到最终的 MySQL 1.2.3.56 服务器 3306 端口,以此达到 Client 主机访问 MySQL 上的数据库实例的目的。

优点

访问时无需设置代理,相当于透明转发。

缺点

每个服务都需要配置不同的端口转发。

远端端口转发

由远程服务器某个端口转发到本地内网服务器端口。

使用场景

SSH Tunnel D

远程端口转发用于某些单向阻隔的内网环境,比如说NAT,网络防火墙。在NAT设备之后的内网主机 SSH Client 可以直接访问公网主机 SSH Server,但外网主机 SSH Server000却无法访问内网主机 SSH Client 所在网络的服务。如果内网主机 SSH Client 向外网主机 SSH Server 建立一个远程转发端口,就可以让外网主机 SSH Server 通过该端口访问该内网主机 SSH Client 所在网络的服务。可以把这个 SSH Client 理解为「内应者」。

命令格式

$ ssh -fCN -R 3307:192.168.1.35:3306 -p 22 [email protected]

命令说明

优点

可以穿越防火墙和 NAT 设备。

缺点

每个服务都需要配置不同的端口转发。

如何开启端口转发

编辑 SSH 服务配置文件 /etc/ssh/sshd_config

# 是否允许TCP转发,默认值为"yes"
AllowTcpForwarding yes
# 是否允许远程主机连接本地的转发端口。默认值是"no"。默认将远程端口转发绑定到loopback地址。这样将阻止其它远程主机连接到转发端口。
GatewayPorts yes
comments powered by Disqus