SSH隧道转发HTTP流量及Webhook公网访问内网机器方案咨询
嘿,针对你的场景,我先帮你理清核心问题:托管服务器(192.168.1.2/24)无法主动访问那台FortiClient映射的机器,只能由那台机器主动发起连接——这种单向通信的限制下,反向SSH隧道是完全可行的,同时也有几个更适合长期稳定运行的替代方案,下面具体拆解:
一、SSH隧道的实现方式(适配你的场景)
因为托管服务器无法主动连接目标机器,你需要用反向SSH隧道(由目标机器主动向托管服务器建立连接,把自身端口映射到托管服务器上),具体操作分两种情况:
1. 基础反向隧道(临时测试用)
在那台FortiClient映射的机器上执行命令:
# 如果目标机器的Web服务跑在80端口,把托管服务器的8080端口转发到目标机器的80 ssh -R 8080:localhost:80 user@192.168.1.2
之后,托管服务器上访问localhost:8080就等于访问目标机器的Web服务。如果要让公网域名访问托管服务器的80端口时自动转发,你可以在托管服务器上用Nginx做一层转发:
server { listen 80; server_name 你的公网域名; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
2. 长期稳定的反向隧道(生产场景)
基础SSH隧道可能会因为网络波动断开,推荐用autossh工具保持隧道持久化,同时修改SSH配置让外部能访问映射的端口:
- 在目标机器安装autossh后执行:
autossh -M 20000 -N -R 0.0.0.0:8080:localhost:80 user@192.168.1.2
- 编辑托管服务器的
/etc/ssh/sshd_config,开启GatewayPorts:
GatewayPorts yes
重启SSH服务后,托管服务器的8080端口就可以被公网访问,配合Nginx转发到80即可。
二、替代方案(更适合Webhook场景的工具)
如果觉得SSH隧道配置繁琐,或者需要更灵活的内网穿透能力,这些工具更合适:
1. FRP(开源内网穿透工具)
FRP是专门做内网穿透的工具,分为服务端(部署在托管服务器)和客户端(部署在目标机器),完美适配单向通信场景:
- 托管服务器部署FRP服务端,配置
frps.ini:
[common] bind_port = 7000 # 客户端连接的端口 vhost_http_port = 80 # 直接监听80端口,接收公网HTTP请求
- 目标机器部署FRP客户端,配置
frpc.ini:
[common] server_addr = 192.168.1.2 server_port = 7000 [webhook] type = http local_port = 80 custom_domains = 你的公网域名
启动后,公网访问你的域名就会直接转发到目标机器的80端口,还支持SSL、负载均衡等功能,比SSH隧道更适合Web服务场景。
2. 利用FortiClient的内置端口转发
如果你的FortiClient是VPN客户端,有些版本支持本地端口转发功能——可以在FortiClient里配置把目标机器的80端口映射到托管服务器的某个端口上,这样不需要额外工具,直接利用VPN的隧道能力实现转发。具体操作可以查看FortiClient的端口转发配置项,一般在VPN连接的高级设置里。
3. 中转轮询方案(低实时性场景)
如果目标机器可以主动向托管服务器发送HTTP请求,也可以用反向代理的反向思路:在托管服务器上部署一个简单的中转服务,把收到的Webhook请求暂存,然后由目标机器主动轮询托管服务器获取请求并处理。不过这种方式有延迟,适合对实时性要求不高的Webhook场景。
内容的提问来源于stack exchange,提问作者Mr Hoelee




