内网穿透:子域路由
适用于没有公网入站、无法配置端口转发,或希望由 FRP、Cloudflared 提供公网入口的环境。公网流量先经过隧道到达 fn-knock 网关,再按访问域名转发到业务服务。
- 网络拓扑:内网穿透
- 路由方式:按
Host区分服务 - 建议策略:登录优先
- 后台位置:
系统设置 → 模式 → 内网穿透 → 子域映射
子域映射是内网穿透的默认方案。路径模式 只用于兼容旧配置或必须部署在路径前缀下的应用。
开始前
需要准备:
- 一个可管理 DNS 的域名,例如
example.com。 - FRP 服务端,或可用的 Cloudflare Tunnel。
- 至少一种可用的登录方式。
- fn-knock 所在设备能够访问业务服务。
飞牛 FPK、Docker、OpenWrt、Linux 和群晖 DSM 7 SPK 都可使用应用内隧道。Windows x86_64 不提供内置 FRP / Cloudflared;若在同一台 Windows 主机自行运行隧道客户端,建议回源本机 127.0.0.1:7999,其安装与运维不由 fn-knock 管理。Docker 中的 127.0.0.1 指容器自身;上游在宿主机或局域网其他设备时,应填写容器可访问的地址。
请求路径
外部请求依次经过:
auth.example.com或nas.example.com的公网入口。- FRP 或 Cloudflared 隧道。
- fn-knock 的实际网关端口。飞牛原生 FPK、Docker Compose、OpenWrt、Linux、群晖 DSM 7 SPK 和 Windows 默认使用
7999。Windows 自管隧道优先回源同机回环地址。 - 鉴权服务或对应的业务上游。
隧道必须把原始 Host 传给 fn-knock。所有域名都指向同一个本地网关,由 fn-knock 完成后续路由。
1. 选择内网穿透和子域映射
进入 系统设置 → 模式:
- 选择
内网穿透。 - 路由方式选择
子域映射。 - 保存配置。
保存后,侧边栏应出现 子域映射 和内网穿透相关入口。
从其他模式切换时,检查已有路由、证书和认证地址。路径模式中的映射不能直接当作子域映射使用。
2. 设置根域名和鉴权服务
进入 子域映射,展开 子域模式配置,在 域名 中填写 example.com 并保存。鉴权服务所使用的端口 应填写访客实际访问的公网端口。然后点击 添加鉴权服务,添加 auth.example.com。
鉴权服务需要:
- 允许公开访问。
- 历史映射若仍带有严格白名单规则,不能直接作为鉴权服务;记录原配置后重新创建鉴权服务。
- 作为唯一的当前认证入口。
- 通过隧道能够到达本地 fn-knock 网关。
先确认认证地址可以从外网打开,再配置业务映射。
3. 添加业务映射
进入 子域映射,添加业务服务。例如:
| 配置项 | 示例 |
|---|---|
| 子域 | nas |
| 目标 | http://192.168.1.20:5666 |
| 要求登录 | 开启 |
保存后,公网入口为 https://nas.example.com。
如果上游需要 HTTP Basic Auth,在映射的高级配置中启用 Basic Auth 跳过 并填写上游凭据。该凭据用于 fn-knock 连接上游,不替代访客登录。
4. 配置访问策略
编辑 Host 映射时,当前界面提供 要求登录 开关:
| 设置 | 行为 |
|---|---|
关闭 要求登录(当前登录优先映射) | 公开访问,不检查 fn-knock 登录和白名单 |
开启 要求登录 | 没有有效来源授权时,按会话与凭据范围继续判断 |
| 历史严格白名单规则 | 即使关闭 要求登录 也不一定公开;只按有效来源授权记录判断(手动或登录后自动创建),会话 Cookie 本身不能替代来源条件 |
多数隧道场景开启 要求登录。当前界面不提供严格白名单选择;历史严格规则需要按当前界面重新创建映射才能退出,单独关闭 要求登录 不足以公开。不要把 Cloudflare、FRP 或其他代理节点的出口 IP 当作访客固定 IP 加入白名单,否则所有请求可能被视为同一个来源。
5. 配置隧道
先在 系统设置 中准备 FRP 或 Cloudflared 资源,再到内网穿透页面创建并启动隧道。
使用 Cloudflared
在 Cloudflare Zero Trust 中为每个入口配置 Public Hostname:
| 公网域名 | 本地服务 |
|---|---|
auth.example.com | http://127.0.0.1:<实际网关端口> |
nas.example.com | http://127.0.0.1:<实际网关端口> |
fn-knock 管理的 Cloudflared 与网关在同一运行环境时,使用 127.0.0.1 和实际网关端口。若单独运行 Cloudflared 容器且它与 fn-knock 位于同一 Docker 网络,才使用 fn-knock 的容器服务名和端口;不同网络时改用其可达地址。
公网 TLS 可以由 Cloudflare 终止。本地回源若使用 HTTPS,证书必须覆盖回源地址并受 Cloudflared 信任;否则使用受控内网中的 HTTP 回源。
使用 FRP
FRP 服务端需要把外部 HTTP 或 HTTPS 流量转发到 fn-knock 的实际网关端口,并保留原始 Host。认证域名和业务域名可以共用同一网关入口。
外部端口、证书和 DNS 由 FRP 服务端的部署方式决定。不要把 fn-knock 管理入口暴露为 FRP 的业务回源。
6. 检查 HTTPS 和公开认证地址
边缘平台终止 TLS 时,浏览器看到的公开地址应使用 HTTPS,fn-knock 的认证跳转地址也必须与它一致。若公开地址和本地回源协议不同,不要把本地 HTTP 地址写进访客可见的认证 URL。
使用 FRP 直接提供 HTTPS 时,应在 FRP 服务端或 fn-knock 网关配置覆盖所有子域的证书。证书说明见 SSL 证书。
7. 从外网验证
使用手机蜂窝网络按顺序测试:
- 打开
auth.example.com,确认登录页可达。 - 打开
nas.example.com,确认进入认证流程。 - 登录后确认返回业务页面。
- 查看隧道状态和 fn-knock
请求日志,确认请求命中了正确 Host 与上游。
路径模式仅用于兼容
内网穿透 → 路径模式 在当前界面中标记为不再推荐。只在以下情况使用:
- 需要保留已有路径映射,暂时不能迁移。
- 只有一个公网域名可用。
- 上游应用明确支持部署在路径前缀下。
例如将 https://example.com/nas/ 转发到 NAS。上游应用必须正确处理路径前缀、重定向、Cookie 和 WebSocket;否则容易出现资源 404、登录循环或跳回根路径。
新配置应优先为服务分配独立子域。旧配置的迁移方法见 内网穿透与路径映射。
常见故障
| 症状 | 优先检查 |
|---|---|
| 隧道在线但域名超时 | Public Hostname、FRP 入口、DNS 和隧道目标端口 |
| 所有子域进入同一服务 | 隧道或前置代理没有保留 Host |
| 返回 502 | 隧道无法访问网关,或网关无法访问业务上游 |
| 登录后循环跳转 | 公开协议、认证域名、根域名、Cookie 作用域及前置代理的 Host / X-Forwarded-* 不一致;从原业务 Host 重新发起访问 |
| Cloudflared 报 TLS 错误 | 回源协议或证书信任配置错误 |
| 路径模式资源 404 | 上游不支持路径前缀,优先迁移到子域映射 |
完整排查入口见 FAQ。
