SSH参数解释
-
-L port:host:hostPort
- 解释:将本地机器某个端口转发到远端指定机器的指定端口
- 原理:本地机器分配了一个socket监听port端口,一旦端口上有了连接,该连接就经过安全通道转发出去,同时远程主机和host的hostPort端口建立连接。可以在配置文件中指定端口的转发。只有root才能转发特权端口。
-
-R port:host:hostPort
- 解释:将远程主机的某个端口转发到本地端指定机器的指定端口。即反向隧道代理
- 原理:远程主机上分配了一个socket监听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,同时本地主机和host的hostPort端口建立连接。可以在配置文件中指定端口的转发。只有root才能转发特权端口
-
-D port
- 解释:指定一个本地机器动态的应用程序端口转发。即动态代理
- 原理:本地机器上分配一个socket监听port端口,一旦这个端口上有了连接,该连接就会经过安全通道转发出去。根据应用程序的协议可以判断出远程主机将和哪里连接。可以在配置文件中指定端口的转发。只有root才能转发特权端口
-
-N
- 解释:不执行远程登录命令,用于转发端口。若转发端口的命令未携带-N则会直接登录到远程机器内
-
-f
-
-g
本地转发
功能解释
在A服务器执行ssh命令登录B服务器启用ssh隧道,实现通过访问A服务器的转发端口,达到实际访问B服务器的目标端口的目的。
使用场景
出于各种网络或安全等原因,客户端服务直接访问B服务器的端口,因此只要A服务器可以访问到B服务器的ssh端口,就可以通过建立ssh隧道,实现客户端访问A服务器的转发端口间接访问到B服务器的指定端口
命令示例(以下命令均在A主机执行)
SSH登录后启用ssh隧道,但仅监听A主机127.0.0.1地址,退出ssh登录后隧道断开
ssh -L A转发port:B主机IP:B目的端口 root@B主机
SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道断开
ssh -N -L A转发port:B主机IP:B目的端口 root@B主机
SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道不会断开
ssh -f -N -L A转发port:B主机IP:B目的端口 root@B主机
指定A主机中ssh隧道转发端口绑定的网卡
ssh -f -N -L A主机IP:A转发port:B主机IP:B目的端口 root@B主机
将转发端口绑定至A主机所有网卡
ssh -g -f -N -L A转发port:B主机:B目的端口 root@B主机
远程转发
功能解释
远程转发即在B服务器执行ssh命令登录A服务器来启用SSH隧道,以实现通过访问A服务器的转发端口,达到实际访问为B服务器的目标端口的目的。它和本地转发的区别在于具体是在哪个服务器上使用的ssh命令建立隧道来访问的目标服务器端口。
使用场景
远程转发使用场景较为广泛且实用。
如果我们在家庭电脑上跑了一个tomcat服务并想提供到互联网访问,由于家庭电脑一般是通过路由器来访问互联网的(即在nat网络中),我们需要在家庭路由器中进行端口映射来实现。
如果我们是公共路由器没有权限怎么办?又或者在权限管控严格的公司中我们没有权限怎么办?
巧合的是,我们手上还有一台拥有公网IP的主机(如阿里云主机等),我们的家庭电脑是可以访问到互联网的(即可以SSH访问到拥有公网IP的主机),直接使用SSH隧道就可以解决以上问题。
命令示例(以下命令均在B主机执行)
SSH命令后不登录A主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭B主机终端后隧道不会断开
ssh -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机
看到这里,你一定会联想到以下两条指令来实现绑定到非lookback地址:
ssh -f -N -R A主机IP:A主机转发端口:B主机IP:B目的端口 root@A主机
ssh -g -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机
将远程转发绑定到网卡
上面我们尝试建立远程转发隧道后,仅监听127.0.0.1地址,这是因为在SSH服务的配置文件/etc/ssh/sshd_config中有这样一个配置
注:windows下user/.ssh/文件夹下没有config配置文件,可以手动创建一个config文件来实现对应的配置 GatewayPorts 是否允许远程主机连接本地的转发端口,默认值为 no。
将此项配置为yes并重启SSH服务后,再次执行命令
ssh -f -N -R A主机转发端口:B主机IP:B目的端口 root@A主机
这时远程转发的转发端口会设置在A主机的所有网卡上,即0.0.0.0
当然除了这种方法,我们还可以使用其他技术手段来实现允许其他主机访问A主机127.0.0.1地址的转发端口,例如在A主机用其他程序去反向代理127.0.0.1的转发端口(nginx反向代理)
动态转发
功能解释
动态转发即通过配置一个本地端口,将通过隧道的数据转发到目标端地址网络。
如下图所示,动态转发不像本地转发与远程转发一样转发端口与目标端口是一对一的,动态转发中的转发端口对应的目标是目标主机所在的整个网络。不过使用动态转发访问目标主机所在网络时需要应用程序本身支持代理配置或者使用socket代理工具。
使用场景
同样如上图所示,如果存在一个子网1与子网2之间设有防火墙,主机A只能访问到主机B的ssh端口,这时如果主机A或者外部客户端想要访问子网2中的任意IP的任意端口时,可以使用动态转发隧道实现。
命令示例(以下命令均在A主机执行)
SSH命令后不登录B主机,仅启用ssh隧道,仅监听A主机127.0.0.1地址,关闭A主机终端后隧道不会断开
ssh -f -N -D A主机转发端口 root@A主机
SSH命令后不登录B主机,仅启用ssh隧道,监听A主机指定网卡IP地址,关闭A主机终端后隧道不会断开
ssh -f -N -D A主机IP地址:A主机转发端口 root@A主机
客户端代理配置
当动态代理隧道创建好之后我们还需要通过代理客户端进行设置后才能使用隧道。如果应用程序支持配置,直接配置即可。如果是不支持配置代理的应用程序则需要使用socket代理工具来搭配使用,常用的客户端代理工具有proxifier
建立稳定的代理隧道
通常我们ssh为了保证安全,当我们一段时间没有使用之后就会自动断开连接,这样非常不方便。因此我们需要一些手段来保证我们的ssh隧道更加稳定,不会中途断开
Putty
Putty是对Telnet、SSH、rlogin、纯TCP以及串行接口建立连接的软件。早期仅支持windows平台,最近逐渐开始支持其它平台
我们可以通过使用putty来创建一个ssh代理隧道建立一个稳定的连接
Autossh
Autossh是linux平台下建立稳定ssh代理隧道的工具
本文参考《SSH隧道详解与使用AutoSSH实现稳定的内网穿透》
|