公网直达:用子域发布服务
本方案适合有可直达公网 IPv4 或 IPv6、拥有域名,并希望每个 Web 服务使用独立子域的环境。最终访问形式例如:
text
auth.example.com 登录入口
nas.example.com 飞牛或 NAS 服务
files.example.com 文件服务它使用 子域模式(公网直达 + Host 路由),不是“内网穿透 / 子域映射”。没有公网入口时,请改看 无公网 IP:通过隧道发布子域。
前置条件
- fn-knock 网关端口可从公网到达;飞牛 FPK、Docker 和 OpenWrt 都可使用本方案。Docker 需要发布网关端口,并由路由器或前置代理把公网流量转到它;
- 路由器、云安全组和宿主机没有单独暴露业务服务的原始公网端口;
- 已准备
example.com,可修改 DNS; - 至少有一台可用的 TOTP 或账号密码恢复设备;
- 有移动网络等真实外网用于验证。
配置步骤
- 在
系统设置 → 模式选择子域模式并保存。 - 打开
子域映射,填写根域、认证 Host 和 Cookie 域。例如根域为example.com,认证 Host 为auth。 - 新建认证服务映射,目标填 fn-knock 页面要求的认证上游;认证服务映射必须保持公开可达,不能对自身启用“要求登录”或上游 Basic Auth 注入。
- 新建第一个业务 Host,例如
files.example.com,目标填业务服务的内网 HTTP 地址,开启“要求登录”。 - 在 DNS 中让认证 Host 和业务 Host 指向同一公网入口。服务较多时可使用泛解析;同时确认路由器把网关端口转发到 fn-knock。
- 在
SSL 证书配置覆盖认证 Host 与业务 Host 的证书。 - 公网地址会变化时,配置 DDNS;静态公网地址可跳过。
验证
断开家庭 Wi-Fi,使用移动网络按以下顺序测试:
- 打开认证 Host,完成登录;
- 打开业务 Host,确认进入正确上游;
- 在请求日志中确认 Host、客户端 IP、认证状态和上游目标;
- 尝试访问业务服务的原始公网端口,确认它没有绕过网关。
局域网中出现免登录并不说明公网规则正常。fn-knock 会将私网和本地来源视为本地豁免。
常见问题
| 现象 | 检查项 |
|---|---|
| 认证 Host 打不开 | DNS、网关端口、路由器转发、证书和认证服务映射 |
| 登录后业务 Host 仍拒绝 | 映射访问策略、凭据服务范围、Cookie 域和真实客户端 IP |
| 打开错误应用 | Host 名称、DNS 记录和上游目标 |
| 页面提示证书错误 | 证书未覆盖该 Host,或 CDN / 回源使用了错误 TLS 名称 |
