跳到正文

内网穿透:子域路由

适用于没有公网入站、无法配置端口转发,或希望由 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 指容器自身;上游在宿主机或局域网其他设备时,应填写容器可访问的地址。

请求路径

外部请求依次经过:

  1. auth.example.comnas.example.com 的公网入口。
  2. FRP 或 Cloudflared 隧道。
  3. fn-knock 的实际网关端口。飞牛原生 FPK、Docker Compose、OpenWrt、Linux、群晖 DSM 7 SPK 和 Windows 默认使用 7999。Windows 自管隧道优先回源同机回环地址。
  4. 鉴权服务或对应的业务上游。

隧道必须把原始 Host 传给 fn-knock。所有域名都指向同一个本地网关,由 fn-knock 完成后续路由。

1. 选择内网穿透和子域映射

进入 系统设置 → 模式

  1. 选择 内网穿透
  2. 路由方式选择 子域映射
  3. 保存配置。

保存后,侧边栏应出现 子域映射 和内网穿透相关入口。

从其他模式切换时,检查已有路由、证书和认证地址。路径模式中的映射不能直接当作子域映射使用。

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.comhttp://127.0.0.1:<实际网关端口>
nas.example.comhttp://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. 从外网验证

使用手机蜂窝网络按顺序测试:

  1. 打开 auth.example.com,确认登录页可达。
  2. 打开 nas.example.com,确认进入认证流程。
  3. 登录后确认返回业务页面。
  4. 查看隧道状态和 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

相关文档

QQ群:1081609274