说明
SSH是Linux下的远程加密管理协议,平时管理服务器都是使用SSH来连接远程Linux服务器进行管理。
我们还可以使用SSH来做更多的事情,举个栗子,状态Linux服务器上开启了MySQL服务或者Redis服务,但是因为安全方面的原因,Linux上的MySQL服务(3306)和Redis服务(6379)并不会对外开放端口(只针对远程局域网内的服务器提供服务),但是我们远程运维可能需要连接MySQL或者Redis,要怎么做呢?
有一个办法,就是利用SSH Tunnel来实现,利用SSH Tunnel来生成一个隧道,连接MySQL服务是走的SSH隧道。对防火墙来说,连接MySQL服务或者Redis服务,其实走的是SSH的22端口,这样就绕过了防火墙。
对于客户端是Mac电脑或者Linux电脑来说,建立SSH Tunnel可以直接使用命令行来实现,可以不需要第三方软件。
实现
SSH Tunnel命令的例子:
ssh -N -L 0.0.0.0:local-port:target-server:target-port username@proxy-server
其中:
- 0.0.0.0:local-port 建立Tunnel后本地的监听IP和端口
- target-server:target-port 远程服务的IP地址和端口,一般来说可以是127.0.0.1:port 相当于去连远程本机的服务,也可以去连远程服务器同一个网络下的其他服务器的服务(只要这个服务针对我们的远程服务器是防火墙打开的状态)
- username@proxy-server 这个就是SSH到的远程服务器的账号了
假设远程服务器1.2.3.4提供SSH服务,它的网络内还有一台1.2.3.5上有一个MySQL服务(3306),3306是不对外的,但是可以通过1.2.3.4来访问1.2.3.5的MySQL服务
打开MacOS或者Linux下的Terminal,输入如下命令:
ssh -L 13306:1.2.3.5:3306 [email protected]
这样就在客户端本机建立了一个SSH Tunnel隧道,本机是监听的13306端口,如果你这个时候请求本机的13306端口,就会去请求1.2.3.5上的3306服务
mysql -h127.0.0.1 --port=13306 -uroot -p
其他的例子,例如1.2.3.4上本机就有Redis服务,要怎么建立隧道呢?
# 建立隧道 ssh -L 16379:127.0.0.1:6379 [email protected] # 新开一个Terminal 连接Redis telnet 127.0.0.1 16379
如果ssh是用密钥登录的,不是密码登录的,这样操作:
使用-i 参数
ssh -L 16379:127.0.0.1:6379 -i /path/to/id_rsa [email protected]
SSH不是标准的22端口,这样做:
使用-p 参数 假设ssh端口是2212
ssh -L 16379:127.0.0.1:6379 -p 2212 [email protected]
前面写的窗口是开着执行状态,不能关闭的,如果要运行其他命令,需要新开一个Terminal窗口;如果你想要后台执行,可以这样发做:
ssh -NfL 16379:127.0.0.1:6379 [email protected]
这个时候,想要查看当前SSH Tunnel的情况下,这样操作:
lsof -i -n | egrep '\<ssh\>' ps aux|grep ssh # 或者用你熟悉的方式,查找ssh进程
以上介绍了命令行下建立SSH隧道的方式,当然如果你频繁使用的话,可以建议你使用客户端,可以加快效率,总的实现原理,就是如上所述的那些。
推荐我使用的MacOS下的客户端是:Secure Pipes免费的,很好用。
文章评论