前言
由于自己家里部署的服务越来越多,即便是曾经凭借记忆就可以随意出入各种服务的我,也逐渐感觉到了压力倍增,所以就再次动了搭建一个统一反向代理的心思。至于为什么是再次,因为曾经动手搭建过,失败了。然后在网上闲逛看到了某大佬分享自家的Homelab架构,我又觉得我行了。重要参考文档:我们不搞NAS,我们搞HomeLab!
需求
首先,明确一下改造的目的。最核心也是最原始的需求,我需要的是一个统一的反向代理服务以便我可以通过更利于人类记忆的方式来访问家中的服务。由此延伸出一个用户体验相关的需求,我希望在内外网具有一致性的访问体验。还有一些安全上的需求,比如只开放高位端口且全链路支持Https。
以上的描述角度,更多的是站在用户角度去描述了一下本次的目标。那么现在整理一下需求,用更偏向技术的角度来梳理一下(在我的习惯中,我在思考到这一步时,会粗略的给出一些技术解决方案,以便我快速判断是否具有可行性):
- 统一的反向代理服务:Nginx,使用Nginx Proxy Manager提升运维管理体验
- 内外网一致性的访问体验: 使用域名访问
- 全自动Https证书管理:
acme.sh
自动续签
方案
基本上想清楚怎么做之后,审视一下家里目前的设备与网络构造,用于确定如何改造,改造过程中是否有其他衍生需求。在我目前的家庭网络环境中,家里是有一台iStoreOs作为旁路由(虽然被大佬狠狠抨击,但是我依然用了旁路由),上面部署了一些服务来支持当前的诉求。在iStoreOs这台设备中,我常用的服务包括:
- TailScale: 用于虚拟组网,带有子网,提供外网访问的统一入口
- Lucky: DDNS与端口转发,目前用处不大,已经被TailScale取代
- 🐱: 懂的都懂,不过我现在还是客户端居多,没有实际用起来,所以本次暂时不考虑了
下面就是基于Nginx Proxy Manager作为统一反向代理中心的设计方案。
我设想了一个初步方案。只需要在iStoreOs中部署 Nginx Proxy Manager(包含了自动证书更新)。至于统一的内外网体验,通过域名方案解决,在内网设置一个dns解析记录,将内网服务的域名都解析到iStoreOs的节点IP上,外网则通过DDNS发布动态域名解析。
由于家用带宽的入站问题,nginx直接使用高位端口提供服务,端口转发可以关闭大部分的转发通道。最终的方案如下:
- IPv4的访问链路
- 内网: 在内网中,设置一个内网DNS服务器,将 泛域名 解析到ProxyNode上,内网的IPv4就会直接用内网ip进行访问
- 外网: 我实际使用时外网是不提供IPv4的访问途径的。如果要提供会比较复杂(其实我也还没太搞明白),需要在TailScale的MagicDNS上设置SplitDNS,将某些域名的解析发送到ProxyNode的DNS服务器上,解析出内网IP进行访问(访问链路走的是TailScale,如果是直连模式应该还是v6访问,意义不大;如果是转发模式可能走的是v4,但是很卡,意义也不大)
- IPv6的访问链路:IPv6的链路就很直接,内外网是统一的方式,直接中公网的DNS解析到ProxyNode的公网IPv6地址,然后直连
IPv6的统一,一度让我想把IPv4的服务关掉,毕竟我大部分时间也确实都在用IPv6。
实施
本来是打算把iStoreOS全部铲掉重新装其他系统的,毕竟上面有很多存储类的东西我不用。但是考虑到用docker-compse安装NPM(其实这个我反而更希望裸机部署),我就把他保留了下来,并且DDNS之类的都可以直接复用,就不重新搭建了。
Nginx Proxy Manager
Docker Compose安装
登录iStoreOs的命令行界面,执行以下命令安装Docker Compose
1mkdir -p ~/.docker/cli-plugins
2curl -SL https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
3chmod +x ~/.docker/cli-plugins/docker-compose
4# 版本验证
5docker compose version
6# 输出: Docker Compose version v2.24.5
NPM安装
使用docker-compose安装npm,创建docker-compose文件,输入以下内容。
1version: "3"
2services:
3 npm:
4 image: jc21/nginx-proxy-manager:2.12.3
5 container_name: nginx-proxy-manager
6 restart: unless-stopped
7 ports:
8 - "8080:80" # HTTP 端口,供自动签发证书的验证使用,也可反代 HTTP 服务
9 - "8443:443" # HTTPS 端口,提供安全访问
10 - "81:81" # NPM Web UI 管理端口
11 volumes:
12 - /root/docker/nginx-proxy-manager/data:/data # 配置文件和数据库持久化
13 - /root/docker/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
保存后在目录中执行 docker compose up -d
启动容器,可以在iStoreOs的界面中看到有一个容器在运行,也说明启动成功。
NPM配置
在浏览器中数据iStoreOs的ip+81端口,进入npm的管理界面。首次登录使用默认的邮箱和密码,注册账号修改为自己的信息就可以开始配置了。
添加SSL证书,使用对应的域名服务商的API即可。
然后就是愉快反代服务,按需添加即可。一般我都会勾选上强制Https。
本文为原创内容,版权归作者所有。如需转载,请在文章中声明本文标题及链接。
文章标题:【网络】Proxy节点:反代网关 —— [Za_Nks]
文章链接:https://www.zanks.link/2025/06/20/proxy-node-nginx-proxy-manager/
许可协议:CC BY-NC 4.0