MacOS/Linux命令行下绕过防火墙快捷实现SSH Tunnel的方式

2021-12-05 508点热度 0人点赞 0条评论

说明

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 [email protected]

其中:

  • 0.0.0.0:local-port 建立Tunnel后本地的监听IP和端口
  • target-server:target-port 远程服务的IP地址和端口,一般来说可以是127.0.0.1:port 相当于去连远程本机的服务,也可以去连远程服务器同一个网络下的其他服务器的服务(只要这个服务针对我们的远程服务器是防火墙打开的状态)
  • [email protected] 这个就是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免费的,很好用。

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论