You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无反向代理服务器防火墙修改权限下,如何通过HTTP/HTTPS反向代理访问Ubuntu服务器的SSH、VNC及其他服务?

无反向代理服务器防火墙修改权限下,如何通过HTTP/HTTPS反向代理访问Ubuntu服务器的SSH、VNC及其他服务?

嘿,我完全理解你的处境——手里只有反向代理给的HTTP/HTTPS通道,碰不到反向代理的防火墙配置,却要连SSH、VNC这些非Web服务,确实有点头疼。你之前试的Caddy+OpenVPN思路是对的,但可能卡在了流量封装的环节。下面给你几个经过验证的可行方案,都是只需要在你的Ubuntu服务器上动手,不用动反向代理的设置:

1. SSH over HTTPS:直接用Apache转发SSH流量

这个方案最直接,把SSH流量伪装成HTTPS请求,让反向代理毫无察觉地转发到你的服务器,再由Apache转交给SSH服务。

  • 第一步:启用Apache的代理模块
    先确保Apache的mod_proxy和mod_proxy_connect模块已经启用:

    sudo a2enmod proxy proxy_connect
    sudo systemctl restart apache2
    
  • 第二步:配置专用的虚拟主机
    新建一个虚拟主机配置文件(比如/etc/apache2/sites-available/ssh-proxy.conf),内容如下:

    <VirtualHost *:443>
        ServerName ssh.yourdomain.com  # 替换成你反向代理能解析的域名
        SSLEngine on
        SSLCertificateFile /path/to/your/ssl/cert.pem  # 替换成你的SSL证书路径
        SSLCertificateKeyFile /path/to/your/ssl/key.pem  # 替换成你的SSL密钥路径
    
        ProxyRequests Off
        ProxyPass / ssh://localhost:22/
        ProxyPassReverse / ssh://localhost:22/
    </VirtualHost>
    

    启用这个虚拟主机并重启Apache:

    sudo a2ensite ssh-proxy.conf
    sudo systemctl restart apache2
    
  • 第三步:本地连接SSH
    用带代理命令的SSH指令连接,把流量通过HTTPS隧道发过去:

    ssh -o ProxyCommand="openssl s_client -connect ssh.yourdomain.com:443 -quiet" your-ubuntu-user@localhost
    

    要是觉得每次输这么麻烦,可以把这个配置写到本地~/.ssh/config里:

    Host ubuntu-ssh
        HostName localhost
        User your-ubuntu-user
        ProxyCommand openssl s_client -connect ssh.yourdomain.com:443 -quiet
    

    之后直接输ssh ubuntu-ssh就能连了。

2. VNC over HTTPS:用WebSocket适配HTTP代理

VNC是图形化流量,直接转HTTP容易出问题,用websockify把VNC转为WebSocket协议,就能完美适配反向代理的HTTP通道了。

  • 第一步:安装工具
    先装websockify和NoVNC(网页端VNC客户端):

    sudo apt install websockify novnc
    
  • 第二步:启动WebSocket隧道
    把VNC服务的端口(比如默认的5901,对应VNC桌面:1)转为WebSocket端口(比如8080):

    websockify --web /usr/share/novnc/ 8080 localhost:5901
    

    要是想让它开机自启,可以写个systemd服务文件,这里就不多展开了。

  • 第三步:配置Apache虚拟主机
    新建/etc/apache2/sites-available/vnc-proxy.conf:

    <VirtualHost *:443>
        ServerName vnc.yourdomain.com  # 替换成你的域名
        SSLEngine on
        SSLCertificateFile /path/to/your/ssl/cert.pem
        SSLCertificateKeyFile /path/to/your/ssl/key.pem
    
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
    </VirtualHost>
    

    启用并重启Apache:

    sudo a2ensite vnc-proxy.conf
    sudo systemctl restart apache2
    
  • 第四步:访问VNC
    打开本地浏览器,访问https://vnc.yourdomain.com/vnc.html,输入VNC的密码就能连接到Ubuntu的桌面了。要是想用本地VNC客户端,找支持WebSocket连接的版本,输入wss://vnc.yourdomain.com/websockify作为连接地址就行。

3. 通用TCP隧道:转发任意服务(比如数据库、其他工具)

如果还有其他非Web服务要访问,用httptunnel把任意TCP流量封装成HTTP请求,万能适配反向代理。

  • 第一步:安装httptunnel

    sudo apt install httptunnel
    
  • 第二步:在Ubuntu上启动隧道服务器
    比如要转发VNC的5901端口,先把隧道服务器监听在8000端口:

    hts -F localhost:5901 8000
    

    这里的-F参数是把收到的HTTP流量转发到本地5901端口。

  • 第三步:配置Apache转发
    新建/etc/apache2/sites-available/tunnel-proxy.conf:

    <VirtualHost *:443>
        ServerName tunnel.yourdomain.com
        SSLEngine on
        SSLCertificateFile /path/to/your/ssl/cert.pem
        SSLCertificateKeyFile /path/to/your/ssl/key.pem
    
        ProxyPass / http://localhost:8000/
        ProxyPassReverse / http://localhost:8000/
    </VirtualHost>
    

    启用并重启Apache。

  • 第四步:本地启动隧道客户端
    在你的本地机器上装httptunnel,然后把本地的2222端口(随便选一个未被占用的)和远程隧道绑定:

    htc -F 2222 tunnel.yourdomain.com:443
    

    之后你本地连接localhost:2222,就相当于直接连到Ubuntu的5901端口了。这个方法可以套用到任何TCP服务,比如SSH、MySQL、FTP等等,只需要改一下转发的目标端口就行。

4. 修复你之前的OpenVPN方案

你之前试的Caddy+OpenVPN没成功,大概率是OpenVPN的流量没正确封装成HTTP。可以试试调整OpenVPN的配置:

  • 把OpenVPN服务器的协议改成TCP,端口设为一个Apache能转发的端口(比如8081)
  • 在Apache上配置一个虚拟主机,把vpn.yourdomain.com的HTTPS请求转发到localhost:8081
  • 本地OpenVPN客户端的配置里,把remote改成vpn.yourdomain.com 443,然后加上http-proxy vpn.yourdomain.com 443(或者直接让客户端通过HTTPS隧道连接)

这样OpenVPN的流量就会被反向代理当成普通HTTPS请求转发到你的服务器,就能建立VPN连接了。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 07:48:10