孙亮亮
返回 NAS 系统

NAS 系统

NAS 搭建 Nginx Proxy Manager 反向代理中枢:统一证书、域名分发与内网服务安全暴露

2026年9月29日

NPM 一键反代家庭服务,自动 HTTPS 证书与域名分发

Nginx Proxy Manager反向代理NASHTTPS证书

NAS 搭建 Nginx Proxy Manager 反向代理中枢:统一证书、域名分发与内网服务安全暴露

摘要:家里 NAS 上跑着 Jellyfin、Immich、Vaultwarden 一堆服务,每个都记 IP+端口太痛苦,外网访问还要逐个做端口映射。本文用 Docker Compose 部署 Nginx Proxy Manager(NPM),统一用子域名(如 jellyfin.home.cn)访问,自动签发 Let's Encrypt 证书,并配合"仅放行 443"的防火墙策略把内网服务安全暴露,顺带讲清 WebSocket、强制 HTTPS 与防爆破的坑。

一、为什么需要反向代理中枢

没有反代时,访问服务是这样的:http://192.168.1.20:8096(Jellyfin)、http://192.168.1.20:8080(Immich)…… 外人访问要记住公网 IP 加非标端口,浏览器还报不安全。NPM 解决三件事:

  1. 域名分发:一个 443 端口,靠 Host 头把 jellyfin.home.cn、photo.home.cn 路由到不同内网服务。
  2. 统一证书:自动申请、续期 Let's Encrypt 通配符证书,全站 HTTPS,告别自签证书红杠。
  3. 收敛暴露面:对外只开 443,NPM 做唯一入口,后端服务全绑内网,降低被扫风险。

前提:你得有一个域名,并能在其 DNS 控制台添加 A 记录(指向家里公网 IP)或 CNAME。动态公网 IP 可配合 DDNS 脚本更新。

二、Docker Compose 部署

在 NAS 的 Docker 目录建 npm/ 与子目录 data、letsencrypt,写入 docker-compose.yml:

version: "3"
services:
  npm:
    image: jc21/nginx-proxy-manager:latest
    container_name: npm
    restart: unless-stopped
    ports:
      - "80:80"      # 仅用于证书验证,可临时开
      - "81:81"      # NPM 管理后台
      - "443:443"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    networks:
      - npm_net
networks:
  npm_net:
    driver: bridge

启动 docker compose up -d。管理后台在 http://NAS内网IP:81,默认账号 admin@example.com / changeme,首次登录必须改密码。注意:81 端口只在内网开,绝不对公网暴露。

三、初始化管理员与域名解析

登录后先做两件事:

  • 到 Settings → SSL Certificates 之前,先在 DNS 把 *.home.cn(通配符)和根域名 A 记录指向家里公网 IP。这样证书验证用 DNS 挑战,不必临时开 80 对外。
  • 申请证书:选 Let's Encrypt → 用 DNS 验证(若域名商支持 API 可自动添加 TXT;否则手动添加 TXT 记录)。填邮箱、勾选"同意条款"、勾"SSL 证书自动续期"。成功后 NPM 会存到 letsencrypt 卷,90 天自动续。

四、添加第一个反代主机(Proxy Host)

以 Jellyfin 为例:Hosts → Proxy Hosts → Add Proxy Host:

  • Domain Names:jellyfin.home.cn
  • Scheme:http(后端是 http)
  • Forward Hostname / IP:容器名 jellyfin 或 NAS 内网 IP 192.168.1.20
  • Forward Port:8096
  • Block Common Exploits:勾选(挡常见扫描)
  • Websockets Support:勾选(Jellyfin 实时进度、Immich 通知都靠 WS)

保存。此时内网访问 https://jellyfin.home.cn 应直达 Jellyfin。若用容器名,需把 NPM 与 Jellyfin 放在同一 Docker 网络;用 IP 则无此限制但 IP 变了要改。

五、自动 HTTPS 与强制跳转

在刚才的 Proxy Host 里切到 SSL 选项卡:

  • SSL Certificate:选刚申请的通配符证书
  • Force SSL:开(HTTP 自动 301 跳 HTTPS)
  • HTTP/2 Support:开

保存后,http://jellyfin.home.cn 会自动跳 https://,且地址栏出现小绿锁。其他服务照此法逐个加,全部共用一张通配符证书,续期一次全站生效。

六、安全加固:只放行 443 与防爆破

对外暴露遵循最小原则:

  1. 路由器只做 443→NAS:443 的端口转发,80 和 81 都不对外。80 仅证书首次 DNS 验证时用,DNS 挑战方式下可完全不对外。
  2. 81 管理口只走 VPN 或内网访问;若必须远程管,套一层 NPM 自身反代 + 强密码 + 限额登录。
  3. 在 NPM 的 Advanced 里给敏感服务(如 Vaultwarden)加 allow 规则,只允许自家 IP 段;或叠加 Basic Auth:在 Proxy Host 的 Details → 勾 Security → 设访问列表。
  4. 启用 fail2ban 思路:NPM 自带 Block Common Exploits,再在路由器/NAS 防火墙对 443 限连频率,挡凭证填充。

七、WebSocket 与特殊头

两类服务容易"页面能开但功能残":

  • Immich / 监控类:必须勾 Websockets Support,否则相册实时刷新、推流中断。
  • 需要真实客户端 IP 的服务:在 Proxy Host 的 Custom locations / Advanced 加转发头:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

否则后端日志全是 NPM 的容器 IP,排障时找不到真实来源。

小结

NPM 把"一堆 IP+端口"收敛成一个带 HTTPS 的域名体系,是家庭 NAS 服务化的关键一步。部署核心是:用 DNS 挑战拿通配符证书、Proxy Host 正确填后端与 WebSocket、对外只留 443 并给敏感服务加访问限制。做好这几点,全家设备访问 NAS 服务既好记又安全。

本模块其他文章

NAS 搭建 Nginx Proxy Manager 反向代理中枢:统一证书、域名分发与内网服务安全暴露 · 孙亮亮