NAS 系统
NAS 搭建 Nginx Proxy Manager 反向代理中枢:统一证书、域名分发与内网服务安全暴露
2026年9月29日
NPM 一键反代家庭服务,自动 HTTPS 证书与域名分发
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 解决三件事:
- 域名分发:一个 443 端口,靠 Host 头把
jellyfin.home.cn、photo.home.cn路由到不同内网服务。 - 统一证书:自动申请、续期 Let's Encrypt 通配符证书,全站 HTTPS,告别自签证书红杠。
- 收敛暴露面:对外只开 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 内网 IP192.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 与防爆破
对外暴露遵循最小原则:
- 路由器只做 443→NAS:443 的端口转发,80 和 81 都不对外。80 仅证书首次 DNS 验证时用,DNS 挑战方式下可完全不对外。
- 81 管理口只走 VPN 或内网访问;若必须远程管,套一层 NPM 自身反代 + 强密码 + 限额登录。
- 在 NPM 的
Advanced里给敏感服务(如 Vaultwarden)加allow规则,只允许自家 IP 段;或叠加 Basic Auth:在 Proxy Host 的Details → 勾 Security → 设访问列表。 - 启用 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 服务既好记又安全。