平时工作很忙,极少写一些内容,近来飞牛官方更新了基于FN CONNECT的统一网关,使各DOCKER应用不用频繁的配置端口映射便能通过利用不同二级域名的形式从一个端口对外提供服务,此种方法既能通过统一配置SSL证书的方式提升了服务器安全性,又简化了我们新部署DOCKER业务配置的难度。
其实飞牛官方这种统一网关的实现方法就是用反向代理的方式实现的,我们自建DDNS公网 域名的用户也可以利用Nginx-Proxy-Manager实现利用不同二级域名在统一网关端口访问不用业务的功能,以下是具体方法。
一、 准备工作与核心痛点解决思路
在开始之前,我们需要明确家庭宽带的一个限制:大多数家庭宽带虽然拥有公网IPv4或IPv6,但运营商通常封锁了80(HTTP)和443(HTTPS)端口 。这意味着,如果你在服务器上配置了证书,外网用户并不能直接通过标准的 443 端口访问你的域名,你必须在访问时携带一个非标端口(例如 https://fn.yourdomain.com:8443)。
我们的目标是将端口号收敛为一个统一的网关端口,并将原本需要写在端口号上的信息转移到二级域名上。 本文将以 8443 作为统一的HTTPS网关端口为例进行演示(你也可以根据喜好将其改为 8003、8888 或 10443 等未被运营商屏蔽的端口)。
二、 部署 Nginx Proxy Manager (NPM)
NPM 是一款通过 Web 界面管理 Nginx 反向代理的神器,支持一键申请 Let‘s Encrypt 证书,极大降低了配置门槛。
建议使用 Docker 方式部署,方便迁移。
-
创建 docker-compose.yml 文件
在你的服务器(如 NAS 或 VPS)上创建一个目录,例如 /docker/npm,新建文件 docker-compose.yml :
yaml
version: '3'
services:
aimage: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 保留用于 Let‘s Encrypt 验证,但公网可不开放
- '443:443' # 这里改为你希望的网关端口,例如 '8443:443'
- '81:81' # 管理面板端口
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm" # 修改为你自己的强密码
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "npm" # 修改为强密码
MYSQL_DATABASE: "npm"
MYSQL_USER: "npm"
MYSQL_PASSWORD: "npm" # 修改为强密码
volumes:
- ./mysql:/var/lib/mysql
注意:如果你希望公网访问时不带端口号(看起来最完美),这里需要保持 443:443 映射,前提是你的宽带支持端口转发且没有屏蔽 443。若被屏蔽,请将宿主机端口映射到 8443 或其他高位端口。
-
启动容器
在 docker-compose.yml 所在目录下执行:
bash
docker-compose up -d
-
访问面板
打开浏览器访问 http://你的服务器IP:81。
- 默认邮箱:
admin@example.com
- 默认密码:
changeme
三、 配置 DDNS 与泛域名解析
为了以后给每个服务分配一个二级域名(如 fn.abc.xyz, ali.abc.xyz),我们不需要为每一个单独设置解析,使用泛域名解析最为方便。
- 登录域名控制台(如阿里云、腾讯云、Cloudflare)。
- 添加解析记录:
- 记录类型:A 记录 或 AAAA 记录(IPv6)。
- 主机记录:填写
*。
- 记录值:填写你当前的公网 IP。
- 实现 DDNS:由于你的公网 IP 可能会变化,你需要使用 DDNS 工具将泛域名解析到最新的 IP。
- 方案 A:如果你的路由器支持 DDNS 且支持泛域名,直接在路由器设置。
- 方案 B:使用飞牛应用商店中的
Lucky 或者 DDNS-GO 工具。将 * 和你自己的主域名都指向当前IP。
四、 申请 SSL 泛域名证书
这是最关键的一步。因为运营商屏蔽了 80 端口,传统的 HTTP 文件验证方式无法成功。我们必须使用 DNS 验证方式申请通配符证书。
- 进入 NPM 面板,点击
SSL Certificates -> Add SSL Certificate -> Let‘s Encrypt。
- 填写域名:
- Domain Names:填入
*.yourdomain.com 和 yourdomain.com(换行分隔)。
- 开启 DNS 验证:
- Use a DNS Challenge:开启此选项。
- DNS Provider:选择你的域名服务商(如 Cloudflare, Namesilo, 阿里云等)。
- 填入 Credentials (凭据):
- 如果你选 Cloudflare,需要填入你的 Global API Key 或者 区域 API 令牌(需具备 DNS 编辑权限)。
- 务必勾选
I agree to the Let's Encrypt Terms of Service。
- 提交:点击 Save。NPM 会通过 API 自动创建临时 TXT 解析记录,验证成功后自动颁发证书并删除临时记录。
- 验证:几秒钟后,证书状态变为
Valid,即为成功。
五、 配置统一网关代理
现在我们有了泛域名证书,可以开始配置反向代理了。假设你的飞牛 NAS 内网地址是 http://192.168.1.100:5667。
- 点击
Proxy Hosts -> Add Proxy Host。
- Details (域名配置):
- Domain Names:输入你想访问的二级域名,例如
fn.yourdomain.com。
- Scheme:这里选择
http(因为 NPM 在内网访问你的服务时通常是 http 明文,由 NPM 负责加密为 https 转给用户)。
- Forward Hostname / IP:填入 NAS 的内网 IP,如
192.168.1.100。
- Forward Port:填入服务的端口,如飞牛是
5667(注意:5667 是 http 端口)。
- SSL (证书配置):
- SSL Certificate:选择我们刚才申请的泛域名证书
*.yourdomain.com。
- 开启 Force SSL(强制 HTTPS):这样用户即使输入 http,也会自动跳转到 https。
- 开启 HTTP/2 Support 提升速度。
- 开启 HSTS 增强安全(可选,除非你完全确定只用 https)。
- 保存:点击右上角
Save。
六、 路由器端口转发与最终访问
由于无法使用 443 端口,你需要在路由器上做一个映射。
- 登录路由器管理后台。
- 添加端口转发规则:
- 外部端口:
8443 (你希望从外面访问的端口)。
- 内部 IP 地址:运行 NPM 容器的那台 NAS/服务器 的内网 IP。
- 内部端口:
443 (因为容器映射的是 443 到宿主机的 8443,或者如果你映射错了,这里写你容器映射出的端口)。
最终访问效果:
- 飞牛:
https://fn.yourdomain.com:8443
- Alist:
https://ali.yourdomain.com:8443(只需新增一个 Proxy Host,指向 Alist 的 5244 端口)
- qbittorrent:
https://qb.yourdomain.com:8443
七、 写在最后:关于端口的补充说明
通过上述配置,你只需记住 一个端口(8443) 和 不同的二级域名,即可访问家里所有的服务,且全程数据都是通过 SSL 加**输的。
如果你觉得 https://xxx.com:8443 带着端口号很“碍眼”,想要实现真正的“无端口”访问,只有两种途径:
- 使用 IPv6:如果客户端和服务器都有 IPv6,且运营商不封 443,可以直接使用标准端口。
- 购买云服务器进行中转:在云服务器上安装 Nginx 或 Lucky,利用云服务器的 443 端口转发到你家宽带的高位端口。但这会产生流量费用。
这套方案非常适合拥有公网 IP(哪怕是动态的)且喜欢使用 Docker 部署各种有趣服务的玩家们。希望能帮大家省去配置端口映射的烦恼。