SSH反向代理
先说说什么是代理,源服务器由于各种原因无法访问目标服务器提供的服务,但是存在一个agent服务器,源服务器可以访问它,它可以访问目标服务器,那么源服务器的消息发给他,它在把请求转发给目标服务器,就间接的实现了源服务器访问目标服务器的目的。
这就是代理,也是一般所说的正向代理,正向代理一般是代理客户端(源服务器,信息的请求者)。这时候,在公网上发送的信息的请求者就是代理服务器的身份,而不是真正客户端的身份。好处显而易见,隐藏客户端的身份。
反向代理
百度百科:当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。
这句话不太好理解,应该改一改:“当一个代理服务器能够代理外部网络上的主机,使得内部网络可以访问时(不通过公网IP),这种代理服务的方式称为反向代理服务。”
SSH反向代理使用方法
假设123.139.238.155需要访问123.139.238.154的mysql 3306端口,但是有防火墙限制,如果想绕过防火墙则可以通过ssh隧道将123.139.238.154的3306端口代理到123.139.238.155的6003端口上,这样直接在123.139.238.155机器上访问6003端口就相当于访问123.139.238.154的3306端口。具体操作如下:
1、在123.139.238.154机器上执行如下命令
ssh -NfR 6003:localhost:3306 root@123.139.238.155 -p22
2、在123.139.238.155上通过下面命令访问mysql
mysql -h127.0.0.1 -uroot -pApt_2022! -P6003
但是这样子,6003端口只是监听在127.0.0.1上,如果还需要从其他机器访问,则需要这个端口需要监听在内网IP上,这时候又利用到了SSH端口转发的功能:
ssh -N -f -L 123.139.238.155:6003:127.0.0.1:6003 root@123.139.238.155
上面的命令是将123.139.238.155:6003接收到的请求转发哦到本机的127.0.0.1:6003端口上,6003端口恰好是SSH反向代理监听的端口,随后请求就会被转发到123.139.238.154主机上的3306端口,这样在就实现了访问123.139.238.154主机的mysql服务,同时特避免了在防火墙上打洞。
使用autossh断线自动重连
这样子如果123.139.238.154主机上的SSH进程停止了,那么从123.139.238.155就无法访问了,可以利用autossh的自动重连机制来避免这种情况。
在123.139.238.154主机上安装autossh程序后,通过下面的命令启动:
autossh -M 7281 -fCNR 6003:localhost:3306 root@123.139.238.155
-M参数理解为心跳即可。当心跳不通时,就会重连。当然也需要端口再转发下。否则只能从127.0.0.1访问。
再将上面的命令放入脚本中,开机启动即可。
SSH参数说明:
-N:指定这个SSH连接只进行端口消息转发,不执行任何SSH远程命令;
-L:指定本地监听的地址和端口;
-f: 这个SSH会话放入后台运行,不加这个参数的话,当退出当前SSH -L指定的终端时,端口转发进程就结束了,端口转发送也就结束了。所以务必要加上-f参数。
使用autossh时要用到ssh免密登录,参考设置
https://blog.csdn.net/jeikerxiao/article/details/84105529