什么是SSH隧道
SSH隧道是一种通过加密的SSH连接传输任意网络数据的方法。它可以用来为任何应用程序添加加密通道;也可以用它来实现VPN和跨防火墙访问局域网的服务。
SSH是一个通过不受信任的网络进行安全远程登录和文件传输的标准。通过SSH隧道传输TCP/IP数据,它还提供了一种使用端口转发保护任何给定应用程序数据流量的方法。采用了这种方法后,应用程序的数据流量都会走SSH的加密连接,从而不会被窃听或拦截。对于本身不支持加密的应用程序来说,使用SSH隧道可以很方便地添加网络安全性。

上图简要介绍了SSH隧道。不可信网络的安全连接建立在SSH客户端和SSH服务器之间。这个连接是加密的,可用于保护机密性和完整性,并且可以对通信方进行身份验证。
客户端应用使用SSH来连接到服务端应用。隧道启用后
- 应用程序连接到SSH客户端所在的本地主机上的端口。
- SSH客户端通过加密隧道将数据转发到SSH服务端。
- SSH服务端连接到应用程序服务器,这个服务器和SSH服务端在同一个主机上,或者在相同的数据中心中。
通过上面的转发,无需修改应用程序,就能保证应用程序客户端和服务端通信的安全。
这个方式的缺点是,任何能登陆服务器的用户都可以启用端口转发。内部IT人员经常在他们的家里的机器或云上的服务器上启用转发,从而能在企业内网中,从工作机器上访问家里的机器或云上的服务器。黑客或恶意软件会利用类似的方式在局域网中留一个后门。还可以在多个设备上开启隧道,攻击者通过在这些隧道中跳来跳去来隐藏踪迹。
两种转发方式
本地转发
本地代理用于将端口从客户端计算机转发到服务端计算机。SSH客户端监听来自某个端口的连接,当它收到连接时,将请求通过隧道转发到SSH服务器;然后SSH服务器将请求转到目标端口。
本地转发比较常见的场景有:
- 通过跳板机登陆远程服务器或传输文件
- 从外部连接到内部网络上的服务
- 远程文件共享
在OpenSSH中,使用-L
参数开启本地转发
ssh -L p1(localport):server:p2(remoteport) remote
这个命令工作的过程如下图

默认情况下,其他的机器都能够连接到本地的SSH客户端指定的端口;为了安全起见,一般绑定地址,将连接来源限制在同一主机的程序
ssh -L 127.0.0.1:p1:server:p2 remote
也可以在OpenSSH客户端的配置中配置本地转发,这样就不用单独输入命令行了
比如在~/.ssh/config中这样写
Host serverfw
HostName remote
User username
LocalForward p1 server:p2
这样在开启转发的时候只需要输入ssh serverfw
而不用再输入完整的命令了
远程转发
如果希望通过本地计算机,让远程服务器remote
可以连接到server
上的服务,可以使用SSH远程转发。
使用SSH远程转发一个典型的用途是,在企业内部开一个后门,让公网的计算机可以访问到企业的某个内部服务,这个是有一定风险的,使用的时候需要特别小心。
在OpenSSH中,远程转发通过-R
参数开启,在本地计算机上输入命令
ssh -R p1(remoteport):server:p2(targetport) remote
上面命令的工作过程如下

默认情况下,OpenSSH仅允许从服务器主机(上图的remote
)连接到远程转发端口server:p2
,如果想要其他的主机也能连上server:p2
,需要在sshd_config
文件中设置
GatewayPorts yes
如果需要指定来源IP,可以将配置改为
GatewayPorts clientspecified
比如
ssh -R 52.194.1.73:8080:localhost:80 host147.aws.example.com
将只允许52.192.1.73到端口8080的连接
OpenSSH的远程转发支持多个规则,比如
ssh -R 2222:d76767.nyc.example.com:22 -R 5432:postgres3.nyc.example.com:5432 aws4.mydomain.net
同样的,可以在~/.ssh/config
配置host,比如
Host exportme
HostName remote
RemoteForward remoteport server:targetport
网友评论