无反向代理服务器防火墙修改权限下,如何通过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

