单机器多域名多网站反代配置 #1555
RealTime724
started this conversation in
Show and tell
单机器多域名多网站反代配置
#1555
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
单机器多域名多网站反代配置
摘要:Hysteria2开启伪装(Masquerade)功能后,80和443端口被占用,无法直接用于其他网站服务。为充分利用VPS剩余性能,减少资源浪费,实现一台服务器的多重用途,本文提出一种基于两级反向代理的多站点部署方案。具体而言,以Hysteria2作为外层反向代理,负责获取多个域名的TLS证书;采用proxy伪装模式且不重写Host头;反向代理目标指向本机内部的Nginx。Nginx作为内层反向代理,根据Hysteria2传递的Host信息,将不同域名的请求路由至相应的后端网站,从而实现多个后端服务通过标准80/443端口对外提供访问。
一、背景与目的
作者所购置的海外VPS性能较强,但若仅用于跨境数据传输,则属于“大材小用”,未能充分发挥其计算资源。从实用性和趣味性角度考虑,在该服务器上部署多个网站,实现“一机多用”,可显著提升VPS的使用价值。然而,由于80和443端口已被Hysteria2的伪装服务占用,直接在这些端口部署网站存在冲突。虽然可将网站部署至其他非常用端口,但域名加端口的访问方式不够优雅,且日常使用不便。因此,如何让多个网站通过标准80和443端口对外暴露,同时与Hysteria2伪装功能共存,成为本文重点解决的问题。
二、实现思路
1. 将Hysteria2作为外层反向代理
Hysteria2提供了三种伪装模式:file(静态文件目录)、proxy(反向代理)和string(字符串响应)。其中,proxy模式最符合多网站部署的需求;file模式虽可提供静态内容,但在动态页面生成及与后端服务交互方面能力有限;string模式则完全无法满足要求。因此,本方案优先采用proxy伪装模式。
proxy模式需要指定一个反向代理目标,该目标必须支持基本的HTTP通信能力。测试中,可使用Python3标准库启动一个简单的HTTP服务器,监听在非80/443端口上,作为功能验证服务器。将Hysteria2的反代目标指向该服务器后,测试结果表明跨境传输功能正常,测试站点工作符合预期,伪装效果良好。在此基础上,考虑使用Nginx作为内层反向代理,实现“一进多出”的站点路由;Hysteria2则作为外层反向代理,负责区分代理流量与普通网页流量,并为普通流量提供正常网站服务。
需要特别注意的是Nginx的监听范围。默认配置下,Nginx会监听所有IPv4和IPv6地址,而非仅限本机环回地址(localhost)。这会导致内层反向代理暴露在公网中,存在安全风险。因此,建议启用防火墙限制传入,或将Nginx配置为仅监听127.0.0.1和::1,以提升安全性。
2. Nginx路由方案选择
Hysteria2作为外层反向代理,Nginx作为内层反向代理。后者的核心作用是根据单一来源的HTTP请求内容,将流量转发至后方的多个后端服务。对于转发路径的判断,主要有以下两种常见方案:
基于子域名进行路由
Nginx支持通过
server_name指令根据请求头中的Host字段进行路由。例如,对于指向a.example.com和b.example.com的请求,其Host头分别为对应子域名。在Nginx的站点配置文件(位于sites-enabled目录)中,可通过server_name字段实现精准匹配。该方案需要为新增的子域名添加DNS解析记录,以确保Hysteria2能够正常接收对应域名的请求并正确传递Host头。基于子路径进行路由
Nginx也支持通过
location块根据请求路径进行匹配。例如,将example.com/a和example.com/b分别路由至不同后端。该方案要求后端服务支持设置统一的路径前缀(如将/index.js调整为/a/index.js)。在实际使用中,Nginx需要在请求转发时重写路径(移除前缀),并在响应返回时重写资源链接(添加前缀)。然而,这种方式存在明显缺点:许多应用不支持自定义路径前缀;同时,对于经过混淆或动态生成的JS/CSS等资源,重写操作容易失败,导致资源加载异常。方案选择与实施步骤
综合比较,基于子域名的路由方案更为优越。它符合常见的命名规范和使用习惯,且无需对后端应用进行路径改造。因此,本文采用基于子域名的转发方案。
实施步骤如下:首先新增子域名DNS解析记录;然后修改Hysteria2配置,增加对应子域名支持,并将
rewriteHost设置为false,以确保原始Host信息不被修改并正确传递给Nginx;最后在Nginx中新增站点配置文件,指定server_name并设置相应的后端代理地址。配置完成后,即可测试各子域名对应的后端服务是否正常访问。3. 安全防护措施
防火墙配置
建议通过防火墙仅开放必要端口,例如22、80、443以及后端服务外部通信端口等,原因可参考第二章第1节。
Host头伪造风险
Hysteria2使用Go语言标准库net/http/httputil中的ReverseProxy实现反向代理。其中存在以下逻辑:
https://github.com/apernet/hysteria/blob/3bbc0e198a83d0acb4a8963b0e9ec9d6fcf6afe5/app/cmd/server.go#L917-L919
若Hysteria2配置中
rewriteHost设置为true,则内层Nginx将无法收到正确的Host信息,导致路由失败;若设置为false,Nginx可正常接收原始Host并完成正确路由。需要注意的是,Hysteria2会原样传递客户端提交的Host头,而Host头伪造是一种常见的安全攻击手段。因此,建议在Nginx中增加严格的Host白名单验证,或通过
server_name严格匹配等方式进行防护。三、附加内容
Cloudflare防护
新增的子域名传输的是普通HTTP/HTTPS流量,而非Hysteria2的加密代理流量,因此可通过Cloudflare CDN进行保护,以有效缓解恶意刷量、DDoS等攻击。只需在Cloudflare面板中将对应子域名设置为Proxied(橙色云朵)状态,并正确指向服务器IP即可。
需要说明的是,由于Hysteria2跨境传输功能需要直接暴露源站IP,此类防护仅能在一定程度上降低普通网页服务的攻击风险,而无法完全隐藏服务器真实IP。
文章由人工撰写,Grok润色,人工审校。方案亲测可用。
All reactions