一、前言
SSH是一种建立在应用层基础上的安全协议,利用SSH进行数据传输时也是较为可靠和安全的。当有明文数据传输时,为保障其安全,可以利用SSH隧道对其进行加密安全传输,本文中讲到的SSH隧道用法均可以保障安全传输,文中不详做介绍,本文着重讲解除安全传输之外的其他使用场景,来分别分析三种SSH隧道的用法。
文中会用到以下SSH参数,先看一下man文档中对以下SSH参数的解释:
-Lport:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口.工作原理是这样的,本地机器上分配了一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,同时远程主机和host的hostport端口建立连接.可以在配置文件中指定端口的转发.只有root才能转发特权端口.IPv6地址用另一种格式说明:port/host/hostport
-Rport:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口.工作原理是这样的,远程主机上分配了一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转向出去,同时本地主机和host的hostport端口建立连接.可以在配置文件中指定端口的转发.只有用root登录远程主机才能转发特权端口.IPv6地址用另一种格式说明:port/host/hostport
-Dport
指定一个本地机器“动态的”应用程序端口转发.工作原理是这样的,本地机器上分配了一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,根据应用程序的协议可以判断出远程主机将和哪里连接.目前支持SOCKS4协议,ssh将充当SOCKS4服务器.只有root才能转发特权端口.可以在配置文件中指定动态端口的转发.
-N
不执行远程命令.用于转发端口.(仅限协议第二版)
-f
要求ssh在执行命令前退至后台.它用于当ssh准备询问口令或密语,但是用户希望它在后台进行.该选项隐含了-n选项.在远端机器上启动X11程序的推荐手法就是类似于ssh-fhostxterm的命令.
-g
允许远端主机连接本地转发的端口.
二.本地转发
1.功能解释
本地转发即在A服务器执行ssh命令登录B服务器来启用SSH隧道,以实现通过访问A服务器的转发端口,达到实际访问为B服务器的目标端口的目的。如下图所示:
2.使用场景
当客户端可以访问主机A的任意端口,但由于网络或安全的原因客户端无法访问到主机B的任意端口。如果现在客户端想要访问主机B的某个服务时(如mysql数据库),此时只要主机A可以访问到主机B的SSH端口,这里就可以使用SSH隧道,实现客户端访问主机A的转发端口即可访问到主机B的mysql数据库。
3.命令示例
以下命令均在A主机执行:
SSH登录后启用ssh隧道,但仅监听A主机.0.0.1地址,退出ssh登录后隧道断开
ssh-LA转发port:B主机IP:B目的端口root
B主机SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机.0.0.1地址,关闭A主机终端后隧道断开
ssh-N-LA转发port:B主机IP:B目的端口root
B主机SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机.0.0.1地址,关闭A主机终端后隧道不会断开
ssh-f-N-LA转发port:B主机IP:B目的端口root
B主机指定A主机中ssh隧道转发端口绑定的网卡
ssh-f-N-LA主机IP:A转发port:B主机IP:B目的端口root
B主机将转发端口绑定至A主机所有网卡
ssh-g-f-N-LA转发port:B主机:B目的端口root
B主机三、远程转发
1.功能解释
上面我们知道了本地转发是在A服务器执行ssh命令后将转发端口设置在A服务器本身,远程转发则相反,是将转发端口设置在ssh命令的目标服务器上。
远程转发即在B服务器执行ssh命令登录A服务器来启用SSH隧道,以实现通过访问A服务器的转发端口,达到实际访问为B服务器的目标端口的目的。如下图所示:
2.使用场景
远程转发使用场景较为广泛且实用。
如果我们在家庭电脑上跑了一个tomcat服务并想提供到互联网访问,由于家庭电脑一般是通过路由器来访问互联网的(即在nat网络中),我们需要在家庭路由器中进行端口映射来实现。
如果我们是公共路由器没有权限怎么办?又或者在权限管控严格的公司中我们没有权限怎么办?
巧合的是,我们手上还有一台拥有公网IP的主机(如阿里云主机等),我们的家庭电脑是可以访问到互联网的(即可以SSH访问到拥有公网IP的主机),直接使用SSH隧道就可以解决以上问题。
3.命令示例
以下命令均在B主机执行:
SSH命令后不登录A主机,仅启用ssh隧道,仅监听A主机.0.0.1地址,关闭B主机终端后隧道不会断开
ssh-f-N-RA主机转发端口:B主机IP:B目的端口root
A主机看到这里,你一定会联想到以下两条指令来实现绑定到非lookback