利用反向隧道访问无法直接连接的URL
利用反向隧道访问无法直接连接的URL
看起来你的网络是典型的单向连通场景——HostB能主动访问HostA和目标公网服务,但HostA完全没法反向连通HostB或公网。要实现HostA访问151.141.12.10:123的需求,反向SSH隧道是最直接且高效的解决方案,下面给你一步步拆解:
先明确你的当前网络状态
网络拓扑
___________ ___________ =========================== | HostA | | HostB | || www.internetservice.com || |-----------| <===== |-----------| =====> ||=========================|| |10.11.12.13| |66.77.88.99| || 151.141.12.10:123 || |___________| |___________| ===========================
连通性现状
- ✅ HostB 可正常访问 HostA(如
ping 10.11.12.13成功) - ✅ HostB 可正常访问目标服务(
telnet www.internetservice.com 123或telnet 151.141.12.10 123均成功) - ❌ HostA 无法访问 HostB(
ping 66.77.88.99失败) - ❌ HostA 无法访问目标服务(两种telnet方式均失败)
反向隧道解决方案
核心思路:利用HostB能主动连接HostA的特性,在HostB上建立一条反向隧道,把目标公网服务的端口“映射”到HostA的本地端口上,让HostA通过本地端口间接访问目标服务。
1. 在HostB上创建反向隧道
执行以下SSH命令(替换user为HostA的实际登录用户名):
ssh -fN -R 100123:151.141.12.10:123 user@10.11.12.13
参数解释:
-f:将SSH进程后台运行,不占用当前终端-N:仅建立隧道,不执行远程命令-R:反向隧道规则,格式为HostA本地端口:目标服务IP:目标服务端口- 这里我们用HostA的
100123作为映射端口,你可以换成任意未被占用的端口
2. 在HostA上验证连通性
隧道建立后,HostA直接访问本地的100123端口即可:
telnet localhost 100123
如果连接成功,说明隧道已经生效,HostA相当于间接访问到了151.141.12.10:123。
3. (可选)优化稳定性与使用体验
- 自动重连隧道:如果担心隧道意外断开,可以用
autossh替代原生SSH,HostB上执行:autossh -M 200123 -fN -R 100123:151.141.12.10:123 user@10.11.12.13-M 200123是autossh用于监控隧道状态的端口,只要不冲突就行。 - 用域名访问:如果需要在HostA上直接用
www.internetservice.com访问,可修改HostA的/etc/hosts文件,添加一行:
然后把反向隧道的HostA端口改成123(确保HostA的123端口未被占用),这样就能直接执行127.0.0.1 www.internetservice.comtelnet www.internetservice.com 123访问了。
前置条件检查
- 确保HostA的SSH服务已开启,且允许HostB的IP通过SSH登录
- HostA的防火墙需允许本地访问映射的端口(如100123)
备注:内容来源于stack exchange,提问作者Philippe MESMEUR
相关产品推荐
相关产品推荐

