SSH做反向代理
说实话,我对反向代理这个概念并不熟悉,只是感觉以下要做的事是一个代理的逆向过程,故借此名词一用。
问题场景是这样的:我有两套Linux集群的访问权限,分别为A和B,它们互相独立。其中A、B集群均能访问外网,但只有A集群有公网IP,所以从外网直接登录B就不行。要解决的问题就是从外网能登录到B集群。
我对代理的理解是:一台不能访问外网的机器,通过局域网内一台可以访问外网的机器代理服务,就能实现访问外网的目的。
而我以为的反向代理就是以上的逆向过程,这个肯定是可以做到的,比如:我们在外网要对某台局域网内的Windows进行远程桌面控制时就面临IP地址非公网的问题,但QQ能远程桌面却能完成这样的需求,区别就在于一个是被动受控,一个是主动请求受控;木马什么的,其实都是主动请求受控。
那么,在Linux集群之间,我该如何解决碰到的问题呢?以下是从http://portable.easylife.tw/entry/Reverse-SSH-Tunnel整理的部分内容,该内容正好能处理对应的需求。
通常用SSH Tunnel是用来完成类似代理的功能,如图:
红色区域可通过SSHTunnel访问原本受限的绿色部分,这一招通常用来FQ。
反向Tunnel可以解决我实际碰到的问题:
通过反向的Tunnel就可以做到了,具体步骤如下(以下内容转载而来,欢迎转载而去):
示例环境:
局域网主机:
ServerA / Linux / user userA / ip192.168.0.123 / ssh port 22
ServerB / Linux / user userB / ip192.168.0.125 / ssh port 22
PC / Windows / ip 192.168.0.128 / 远程桌面 port3389
远程主机:
MyServer / Linux / user me / ip 1.2.3.4 /ssh port 22
ssh参数:
-N:不执行何指令
-f:后台执行
-R:建立reverse tunnel
示例1:从MyServer ssh连回ServerA
[userA@ServerA] $ ssh -NfR2222:localhost:22 me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep 127.0.0.1
tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN
[me@MyServer] $ ssh userA@127.0.0.1 -p 2222
MyServer连到2222 port会转向ServerA的ssh port,成功连接到ServerA
示例2:从MyServer ssh连回ServerB
[userA@ServerA] $ ssh -NfR 2244:192.168.0.125:22me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep127.0.0.1
tcp 0 0 127.0.0.1:2244 0.0.0.0:* LISTEN
[me@MyServer] $ ssh userB@127.0.0.1 -p 2244
MyServer连接到本机的2244 port会转向到ServerB的ssh port,成功连接到ServerB
示例3:从MyServer远程桌面PC
[userA@ServerA] $ ssh -NfR2266:192.168.0.128:3389 me@MyServer
--------------------------------------------------------------
[me@MyServer] $ netstat -tnl | grep127.0.0.1
tcp 0 0 127.0.0.1:2266 0.0.0.0:* LISTEN
[me@MyServer] $ rdesktop 127.0.0.1:2266
若你在Linux的桌面环境则可以直接display远程桌面PC,不然就export DISPLAY到其他主机。
此外,为了防止反向的Tunnel断开,还需要一个autossh工具,它可以帮助断线后自动重连。这个对我相当的重要,事实上我现在很少去B集群所在的地方。
对示例一做autossh可以如此做:
[userA@ServerA] $ autossh -M 12345-NfR2222:localhost:22 me@MyServer
当然,为了防止集群重启或断电等问题,可以将上语句写到开机启动脚本里。
以上的工作也可以通过putty完成,如示例3可以如下设置:
xshell也能干同样的事:
赶紧试试吧~~~~
今天看到个好东西,补充一下。
再上文中做反向隧道后,只能在本机ssh localhost -p 来登录,想要从其他IP来却不行,因为SSH本地端口转发绑定的是 lookback 接口。看网上博文http://blog.csdn.net/xyyangkun/article/details/7025854 说建立隧道时加-g参数可以实现,但我没有成功。不过看完https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 后灵机一动,再建立个本机公网到本机localhost的隧道就OK了:
ssh -g -L 9099:localhost:2222 localhost
这样就可以通过ssh 公网 -p 9099 来登录了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?