Skip to content

内网穿透

设备没有可达公网入口时,FRP 或 Cloudflared 可以从内网主动建立隧道,把外部请求送到 fn-knock 网关。隧道只改变网络拓扑;请求进入网关后,仍由 Host 或兼容路径路由,再执行访问策略。

进入 系统设置 → 模式 选择 内网穿透。新部署选择 子域映射,已有单域名路径入口才选择标记为不再推荐的 路径模式

Windows x86_64 不包含 FRP 或 Cloudflared 的资源下载、配置和进程管理。本页中的 系统设置 → FRP系统设置 → Cloudflared 步骤不适用于 Windows;若在同一台 Windows 主机自行运行隧道客户端,可让它回源 127.0.0.1:7999,但该进程的安装、凭据和生命周期由管理员自行负责。

两种隧道

方案外部资源适用情况
FRP一台运行 frps 的公网服务器和远端端口需要自行控制公网地址、端口和传输配置
CloudflaredCloudflare Tunnel 与 Public Hostname已使用 Cloudflare,希望以域名接入且不维护 frps

两者的本地目标都是实际网关入口,常见为 127.0.0.1:7999。飞牛 Docker FPK 默认网关是 8999,应以后台显示和部署配置为准。

路由选择

子域映射

推荐链路为:

text
nas.example.com -> FRP / Cloudflared -> fn-knock -> Host nas.example.com -> 飞牛

隧道必须保留原始 Host,并把鉴权 Host 与业务 Host 都送到同一网关。Cloudflared 可使用 *.example.com Public Hostname;FRP TCP 转发则由 DNS 和远端端口共同指向 frps。

路径模式

兼容链路为:

text
https://example.com/alist -> 隧道 -> fn-knock -> 路径 /alist -> AList

它保留旧 URL,但应用可能需要剥离前缀、HTML 改写或根目录模式。新服务不要因为使用隧道就默认选择路径路由。

FRP

先在 系统设置 → FRP 下载资源,再进入 内网穿透 → FRP。默认生成的代理通常包含:

toml
type = "tcp"
localIP = "127.0.0.1"
localPort = 7999
transport.proxyProtocolVersion = "v2"

PROXY Protocol v2 用于把公网客户端地址继续传给网关。frps、转发链路或自定义配置若不支持它,网关可能只看到 FRP 节点地址,白名单和登录 IP 授权也会随之失真。

页面提供两种编辑方式:

  • 表单模式 维护服务端地址、端口、Token、本地端口和远端端口。它只覆盖已支持字段,其他合法 TOML 会保留。
  • 自定义 直接编辑 frpc.toml。保存前运行 frpc verify;语法错误时不能保存,也不能可靠切回表单。

已有自定义配置时先备份原文,再切换编辑方式。

Cloudflared

先在 系统设置 → Cloudflared 下载资源,再到 内网穿透 → Cloudflared 保存 Tunnel Token。公网域名和源站 Service 在 Cloudflare Dashboard 配置,不在 fn-knock 中创建。

Host 路由的推荐配置与 TLS 取舍见 Cloudflared 隧道配置

访问策略与真实客户端 IP

隧道不会替代 fn-knock 登录、白名单或凭据范围。Host 编辑页通过 要求登录 在公开和登录优先之间切换;历史配置中的严格白名单规则仍按来源 IP 执行。路径模式按每条映射决定是否登录。

认证判断以网关最终识别的客户端 IP 为准。私网、回环和链路本地来源会被标记为 local_exempt 并跳过常规登录与严格白名单,因此来源传递是隧道安全边界的一部分:

  • FRP 优先保留默认 PROXY Protocol v2。
  • Cloudflared 使用专用的内网穿透子域链路,不要套用 EdgeOne / ESA 开关。
  • 启动后从移动网络访问,并在请求日志确认客户端 IP 是访客公网地址,而不是 127.0.0.1、容器地址或隧道节点地址。

平台边界

  • 隧道是出站连接,不依赖 fn-knock 写入宿主机防火墙;Docker 也可使用。
  • 运行环境必须有匹配架构的 FRP / Cloudflared 可执行资源。以 系统设置 → FRP系统设置 → Cloudflared 的就绪状态为准。
  • Windows 不提供这些内置资源或就绪状态;自行部署的隧道进程不受 fn-knock 启停和日志管理。
  • Docker 内的 127.0.0.1 指当前容器。fn-knock 网关与隧道进程在同一容器时可使用它;自建独立隧道容器需要改用服务名或容器网络地址。
  • 内网穿透模式不提供智能连接和协议映射。额外 TCP / UDP 服务需在 FRP 或 Cloudflare 平台单独设计。
  • 切离内网穿透模式时,系统会尝试停止由 fn-knock 管理的隧道进程;外部独立进程不在其控制范围内。

启动与验证

  1. 保存路由方式、鉴权 Host 和至少一条业务映射。
  2. 保存 FRP 或 Cloudflared 配置并启动。
  3. 确认运行状态为已连接,再看日志中是否有重连、Token、TLS 或端口错误。
  4. 从外部网络访问鉴权 Host 和业务 Host。
  5. 在请求日志核对 Host、客户端 IP、授权类型和上游 Target。

操作流程见 内网穿透上手反代访问教程

QQ群:1081609274