反向代理与 HTTPS 配置指南¶
通过反向代理(Reverse Proxy),你可以用一个端口(443)访问 NAS 上的所有服务,无需在路由器上映射几十个端口,配合 HTTPS 证书,既安全又优雅。
什么是反向代理?¶
- 没有反向代理:访问
http://nas-ip:5000(DSM),http://nas-ip:8096(Jellyfin),http://nas-ip:8123(HA)。 - 有反向代理:访问
https://dsm.yourdomain.com,https://video.yourdomain.com,https://ha.yourdomain.com。所有流量都通过 443 端口进入,NAS 根据域名自动分发给不同的服务。
准备工作¶
- 域名:购买一个域名,或者使用群晖自带的
*.synology.meDDNS。 - 公网 IP:需要公网 IPv4 或 IPv6。
- 端口映射:在路由器上将外网
443端口映射到 NAS 的443端口。
步骤 1:申请泛域名证书 (Wildcard SSL)¶
推荐申请泛域名证书(如 *.yourdomain.com),这样增加子域名时无需重新申请证书。
- 控制面板 > 安全性 > 证书。
- 新增 > 添加新证书 > 获取证书 > Let's Encrypt。
- 域名:输入
yourdomain.com。 - 主题备用名称:输入
*.yourdomain.com(注意:群晖自带的 DDNS 自动支持泛域名,第三方域名可能需要 DNS 验证支持)。- 技巧:如果使用阿里云/腾讯云域名,建议使用
acme.sh脚本通过 Docker 自动申请并部署到群晖,比自带的更稳定。
- 技巧:如果使用阿里云/腾讯云域名,建议使用
步骤 2:配置反向代理规则¶
以 Jellyfin 为例(内部端口 8096):
- 控制面板 > 登录门户 > 高级 > 反向代理服务器。
- 点击 新增。
- 常规:
- 描述:Jellyfin
- 来源:
- 协议:
HTTPS - 主机名:
video.yourdomain.com - 端口:
443 - 启用 HSTS:勾选(强制 HTTPS)
- 协议:
- 目的地:
- 协议:
HTTP - 主机名:
localhost - 端口:
8096
- 协议:
- 自定义标题 (WebSocket 支持):
- 很多应用(Jellyfin, Home Assistant, Bitwarden)需要 WebSocket 支持,否则会报错或无法连接。
- 点击 自定义标题 选项卡。
- 点击 新增 > WebSocket。系统会自动添加
Upgrade和Connection两个头。
- 点击 保存。
步骤 3:证书分配¶
创建完规则后,默认使用的是系统默认证书。你需要将新域名的证书分配给对应的反向代理规则。
- 回到 控制面板 > 安全性 > 证书。
- 点击 设置。
- 在列表中找到刚才创建的
video.yourdomain.com(服务名称通常显示为反向代理的描述)。 - 将对应的证书修改为你申请的
*.yourdomain.com证书。 - 点击 确定。
现在,访问 https://video.yourdomain.com 即可直接进入 Jellyfin,浏览器显示安全锁图标。
进阶技巧:访问控制 (Access Control)¶
有些服务(如 Portainer、路由器后台、下载器 WebUI)涉及核心安全,不应暴露给全网,但又想在公司或咖啡厅通过域名访问。
- 控制面板 > 登录门户 > 高级 > 访问控制配置文件。
- 新增 一个策略,例如“仅限国内和局域网”。
- 规则设计:
- 规则 1:CIDR IP
192.168.1.0/24-> 允许 (局域网直连)。 - 规则 2:地理位置
中国-> 允许 (国内访问)。 - 规则 3:
所有-> 拒绝 (屏蔽海外)。
- 规则 1:CIDR IP
- 应用:回到 反向代理服务器 规则编辑页面,在 访问控制配置文件 中选择该策略。
效果:即使你的域名解析到了公网 IP,俄罗斯黑客访问时只会看到 403 Forbidden,而你在公司(中国 IP)可以正常访问。
进阶技巧:自定义标题 (HSTS & Security Headers)¶
为了通过安全审计(如 Mozilla Observatory 评分 A+),你需要添加安全头。
- 在反向代理规则的 自定义标题 中新增:
Strict-Transport-Security:max-age=31536000; includeSubDomains; preload(强制 HSTS)X-Frame-Options:SAMEORIGIN(防止点击劫持)X-Content-Type-Options:nosniff
- WebSocket 支持:
- 务必添加
Upgrade($http_upgrade) 和Connection($connection_upgrade),否则 Jellyfin/HomeAssistant 无法正常工作。
- 务必添加