关于对SSH隧道SSH Tunnel命令参数的理解

时间:2021-08-31 14:22:16

开发时需要在本地访问管理云服务器CentOS上的mysql和redis服务,但是这些服务默认是没有开启直接从外网访问的权限,只能从本机访问,不过使用SSH隧道技术可以将远程访问转换为本机访问一样,这样就无需开启这些服务的外网访问权限了,提高了安全性,也免去了繁琐的配置。

不过SSH隧道的参数配置还是有点复杂,看了一些中文的文章,讲的不是很清晰,尝试很多次也没成功,最后经过一番折腾终于理解了它的原理,本地L,远程R和动态D三种隧道参数都测试成功。

一。local本地模式-L

例如在本机执行命令 ssh -NfL *:3305:127.0.0.1:3306 root@a.b.c.d

windows下可使用xshell的隧道面板Tunneling Pane创建。命令执行后将会在本机3305端口开始监听,win下用命令netstat -anp tcp|find "3305"可以看到3305为LISTENING状态。

这时在本机用mysql客户端工具连接localhost或127.0.0.1的3305端口,当这个3305端口收到数据后会将数据通过ssh安全协议发送到远程主机a.b.c.d的22端口(ssh默认),这个22端口是由ssh服务端即sshd进程创建,它收到数据后再把数据转发到127.0.0.1(在这里也就是a.b.c.d这台主机)的3306端口,这时远程的mysql服务就会认为这是由本机(a.b.c.d)发起的连接。

上图:

{local (mysql-client) --> (ssh-client *:3305)} ---[ssh tunnel]---> {remote (sshd *:22) --> (mysqld 127.0.0.1:3306)}
                                                        |                                                                                                          |
       V                                                                                                         V
                                   bind_address:port                                                                                            host:hostport

{}代表一台主机,()表示一个进程。

ssh手册上的解释:

-L [bind_address:]port:host:hostport

Specifies that the given port on the local  (client) host is to be forwarded to the given host and port on theremote side.  

This works by allocating a socket to listen to port on the local  side, 

Whenever a connection is made to this port, the connection is forwarded over the secure channel, 

and a connection is made to host port hostport from the local  machine.

关键是理解这里的local就是执行ssh命令在3305端口监听的本机,remote就是运行sshd服务端的远程主机a.b.c.d