You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SSH隧道转发HTTP流量及Webhook公网访问内网机器方案咨询

你的内网Webhook转发方案分析:SSH隧道可行性及替代方案

嘿,针对你的场景,我先帮你理清核心问题:托管服务器(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

火山引擎 最新活动