如何在同一Ubuntu 16.04服务器上让SoftEther与Apache共用443端口?
没问题,完全可以实现Apache和SoftEther在同一台Ubuntu 16.04服务器上共用443端口!不过得先明确一个核心点:同一IP的同一个端口只能被一个进程直接绑定监听,所以不能让俩服务同时抢着监听443,得用点转发或者代理的小技巧,下面给你俩靠谱的方案,选哪个看你需求:
方案一:用Apache做反向代理(推荐,更灵活)
这个方案是让Apache作为前端监听443端口,把不同域名的请求分流给对应的服务——普通网页请求自己处理,VPN请求转发给SoftEther。步骤如下:
- 先调整SoftEther的监听端口:打开SoftEther Server Manager连接到你的服务器,进入「VPN Server Settings」→「Listen Ports」,把SSL-VPN的监听端口改成比如4430(随便选个没被占用的端口就行),保存设置。
- 给Apache启用必要的模块:在终端执行以下命令:
a2enmod ssl proxy proxy_http proxy_connect - 编辑Apache的虚拟主机配置文件(比如
/etc/apache2/sites-available/your-domain.conf),添加一个针对VPN域名的虚拟主机配置:<VirtualHost *:443> ServerName vpn.your-domain.com # 替换成你的VPN专属域名 SSLEngine on # 这里用你给VPN准备的HTTPS证书,或者和主站用同一个也可以 SSLCertificateFile /path/to/your-vpn-cert.pem SSLCertificateKeyFile /path/to/your-vpn-key.pem # 把请求转发到SoftEther的4430端口 ProxyPass / https://localhost:4430/ ProxyPassReverse / https://localhost:4430/ </VirtualHost> - 重启Apache让配置生效:
systemctl restart apache2
这样一来,当用户访问主域名(比如your-domain.com)时,Apache直接处理网页请求;访问VPN域名(vpn.your-domain.com)时,请求会被转发到SoftEther的4430端口,完美实现共用443。
方案二:用iptables端口转发(适合不想改太多Apache配置的场景)
如果不想折腾Apache的代理配置,也可以让其中一个服务监听443,用iptables把特定流量转发给另一个服务。比如让SoftEther监听443,把普通HTTPS请求转发到Apache的8443端口:
- 先把Apache的监听端口改成8443(修改
/etc/apache2/ports.conf里的Listen 443为Listen 8443,对应虚拟主机配置里的端口也改成8443),重启Apache。 - 配置iptables规则,把目标端口443的普通HTTPS流量转发到8443,VPN流量留给SoftEther:
# 转发HTTPS流量到Apache的8443端口(这里需要根据SoftEther的VPN流量特征调整,比如特定的SSL握手信息) iptables -t nat -A PREROUTING -p tcp --dport 443 ! -m string --string "SoftEtherVPN" --algo bm -j REDIRECT --to-ports 8443
不过这个方案的缺点是需要准确识别VPN流量的特征,不如域名分流的方案稳定,所以更推荐第一种。
注意事项
- 操作前记得备份原配置文件,避免改崩了没法恢复;
- 测试的时候先在本地模拟请求,确认俩服务都能正常工作再上线;
- Ubuntu 16.04的Apache版本是2.4,完全支持上述代理模块,SoftEther也支持修改监听端口,兼容性没问题。
内容的提问来源于stack exchange,提问作者nikrox
相关产品推荐
相关产品推荐

