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

如何配置SSH隧道与Apache实现本地Web服务通过公网泛域名对外访问

如何配置SSH隧道与Apache实现本地Web服务通过公网泛域名对外访问

看起来你已经搞定了泛域名的SSL证书和Apache的HTTPS跳转,现在卡在SSH隧道的端口权限、端口冲突,以及Apache怎么对接隧道的问题上对吧?我来一步步帮你解决:

一、先搞懂为什么你的SSH隧道命令报错

你运行的ssh -L 80:localhost:8080 -N picaica@the-ip-of-mu-server有两个核心问题:

  1. 权限限制:Linux系统中,1024以下的端口(比如80)属于特权端口,只有root用户才能绑定,普通用户执行会直接提示Permission denied
  2. 端口冲突:你的Apache已经在80端口监听了VirtualHost(用来做HTTPS跳转),就算你用root权限运行SSH,也会因为端口被Apache占用而绑定失败。

所以正确的思路是:用**非特权端口(≥1024)**来做SSH隧道的本地监听端口,再让Apache通过反向代理把公网请求转发到这个端口。

二、配置SSH隧道(远程服务器端)

在你的远程服务器上,运行以下命令建立从远程服务器本地端口到你家服务器8080端口的隧道:

ssh -L 8081:localhost:8080 -N picaica@your-home-server-ip

参数解释:

  • -L 8081:localhost:8080:把远程服务器的本地8081端口,转发到你家服务器的8080端口(这里的localhost是相对于你家服务器的,因为SSH连接到你家服务器后,访问它的localhost就是你家服务器本身)。
  • -N:只建立隧道,不执行远程命令,适合单纯做端口转发。
  • picaica@your-home-server-ip:替换成你家服务器的公网IP或者可访问的地址。

如果想让隧道断开后自动重连,可以用autossh(先安装:sudo apt install autossh):

autossh -M 20000 -L 8081:localhost:8080 -N picaica@your-home-server-ip

-M 20000是指定一个监听端口,用来检测隧道状态,一旦断开会自动重新连接。

三、修改Apache配置实现反向代理

首先确保Apache启用了反向代理所需的模块:

sudo a2enmod proxy proxy_http headers

然后编辑你的SSL VirtualHost配置(因为你已经把80端口的请求跳转到443了,所以要在443的配置里加反向代理):

<VirtualHost *:443>
    ServerName stream.domain.dn
    ServerAlias www.stream.domain.dn

    # 这里放上你的SSL证书路径(比如Let's Encrypt的证书)
    SSLCertificateFile /etc/letsencrypt/live/stream.domain.dn/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/stream.domain.dn/privkey.pem

    # 核心:把所有请求反向代理到SSH隧道的本地端口
    ProxyPass / http://localhost:8081/
    ProxyPassReverse / http://localhost:8081/

    # 可选:添加转发头,让你家的Web服务知道真实的请求来源和协议
    RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
    RequestHeader set X-Forwarded-Proto https
</VirtualHost>

保存配置后,重启Apache生效:

sudo systemctl restart apache2

四、测试访问流程

现在你访问https://stream.domain.dn,请求会走以下路径:

  1. 公网用户访问https://stream.domain.dn,请求到达你的远程服务器的443端口。
  2. Apache把请求反向代理到本地的8081端口。
  3. SSH隧道把8081端口的请求转发到你家服务器的8080端口。
  4. 你家的Web服务处理请求,通过隧道返回响应,最终回到用户浏览器。

额外注意事项

  • 如果你的家服务器没有公网IP,需要确保它能主动连接到远程服务器(也就是远程服务器的SSH端口要对外开放,你家服务器能访问到)。
  • 可以把autossh配置成系统服务,这样远程服务器重启后隧道会自动建立,避免手动操作。
  • 如果你担心SSH隧道的安全性,可以配置密钥登录,禁用密码登录,并且限制SSH用户的权限。

备注:内容来源于stack exchange,提问作者Picarica

火山引擎 最新活动