内网穿透
设备没有可达公网入口时,FRP 或 Cloudflared 可以从内网主动建立隧道,把外部请求送到 fn-knock 网关。隧道只改变网络拓扑;请求进入网关后,仍由 Host 或兼容路径路由,再执行访问策略。
进入 系统设置 → 模式 选择 内网穿透。新部署选择 子域映射,已有单域名路径入口才选择标记为不再推荐的 路径模式。
macOS 与群晖 DSM 7 SPK 提供 FRP 与 Cloudflared 的应用内资源和进程管理。Windows x86_64 不包含这些资源;本页中的 系统设置 → FRP、系统设置 → Cloudflared 步骤不适用于 Windows。若在同一台 Windows 主机自行运行隧道客户端,可让它回源 127.0.0.1:7999,但该进程的安装、凭据和生命周期由管理员自行负责。
两种隧道
| 方案 | 外部资源 | 适用情况 |
|---|---|---|
| FRP | 一台运行 frps 的公网服务器和远端端口 | 需要自行控制公网地址、端口和传输配置 |
| Cloudflared | Cloudflare Account、Zone 与 API Token | 已使用 Cloudflare,希望自动维护 Tunnel、通配 DNS 和 Ingress |
FRP 和手动 Cloudflared 的本地目标通常是实际网关入口 127.0.0.1:7999;托管 Cloudflared 使用独立的本地入口,由 fn-knock 自动配置,不需要手工填写端口。
路由选择
子域映射
推荐链路为:
nas.example.com -> FRP / Cloudflared -> fn-knock -> Host nas.example.com -> 飞牛隧道必须保留原始 Host,并把鉴权 Host 与业务 Host 都送到同一网关。托管 Cloudflared 会自动维护 *.example.com 的 Ingress 和代理 CNAME;FRP TCP 转发则由 DNS 和远端端口共同指向 frps。
路径模式
兼容链路为:
https://example.com/alist -> 隧道 -> fn-knock -> 路径 /alist -> AList它保留旧 URL,但应用可能需要剥离前缀、HTML 改写或根目录模式。新服务不要因为使用隧道就默认选择路径路由。
FRP
先在 系统设置 → FRP 下载资源,再进入 内网穿透 → FRP。默认生成的代理通常包含:
type = "tcp"
localIP = "127.0.0.1"
localPort = 7999
transport.proxyProtocolVersion = "v2"PROXY Protocol v2 用于把公网客户端地址继续传给网关。frps、转发链路或自定义配置若不支持它,网关可能只看到 FRP 节点地址,白名单和登录 IP 授权也会随之失真。
页面提供两种编辑方式:
表单模式维护服务端地址、端口、Token、本地端口和远端端口。它只覆盖已支持字段,其他合法 TOML 会保留。自定义直接编辑frpc.toml。保存前运行frpc verify;语法错误时不能保存,也不能可靠切回表单。
已有自定义配置时先备份原文,再切换编辑方式。
系统设置 → FRP 会把资源状态区分为未下载、版本过旧和已下载(已就绪)。检测到旧资源时先执行更新;下载包会按当前平台选择,并在解压前校验固定的官方 SHA-256 摘要。资源更新不会自动停止正在运行的旧 frpc,避免立即中断隧道;旧进程可以继续运行,但已经停止的旧实例必须先更新资源才能再次启动。
新资源安装完成后,内网穿透 → FRP 仍会提示正在使用旧可执行文件的实例。逐个停止并重新启动这些实例,直到提示消失,再从外网验证隧道。安装新文件和切换运行中进程是两个步骤,不要把“资源已就绪”当成所有实例都已完成切换。
Cloudflared
先在 系统设置 → Cloudflared 下载资源,再到 内网穿透 → Cloudflared 填写推荐的 Cloudflare 账号 API Token。推荐选择专用 Tunnel,执行预检并应用;fn-knock 会自动创建或接入 Tunnel、维护通配 DNS 与 Ingress、取得 Tunnel Token 并启动进程。也可在高级区域保留手动 Tunnel Token 模式。
资源页检测到内置 Cloudflared 需要更新时,可直接执行安全更新。程序会下载到临时位置并校验固定摘要;若托管进程正在运行,会短暂停止、备份旧可执行文件和安装信息、替换后恢复运行。新文件无法启动时会恢复旧文件并尝试重新拉起原进程。更新期间 Tunnel 可能短暂中断,应避开关键操作并在完成后检查进程与外部访问状态。
托管流程、Token 权限、标准 HTTPS 端口、优选 Beta 和故障回退见 Cloudflared 隧道配置。
访问策略与真实客户端 IP
隧道不会替代 fn-knock 登录、白名单或凭据范围。Host 编辑页通过 要求登录 在公开和登录优先之间切换;历史配置中的严格白名单规则仍按来源 IP 执行。路径模式按每条映射决定是否登录。
认证判断以网关最终识别的客户端 IP 为准。私网、回环和链路本地来源会被标记为 local_exempt 并跳过常规登录与严格白名单,因此来源传递是隧道安全边界的一部分:
- FRP 优先保留默认 PROXY Protocol v2。
- 托管 Cloudflared 只在回环专用入口信任
CF-Connecting-IP,不要套用 EdgeOne / ESA 开关,也不要信任访客自行提供的X-Forwarded-For。 - 启动后从移动网络访问,并在请求日志确认客户端 IP 是访客公网地址,而不是
127.0.0.1、容器地址或隧道节点地址。
进程守护与失败诊断
fn-knock 管理的 FRP 和 Cloudflared 进程会显示 已停止、启动中、运行中 或 等待重启。已要求持续运行的进程意外退出后,系统会自动重启,并按大约 1、2、5、10、30、60、120、300 秒逐步退避(带少量随机抖动);稳定运行约 5 分钟后,连续失败计数会重置。手动停止会取消后续重试。
等待重启时,页面会显示连续失败次数、下次重试时间和最近诊断。日志保留进程 PID、启动与退出时间、运行时长、退出码或信号、失败摘要及最近标准输出/错误输出,可用于区分 Token、TLS、网络、配置和二进制问题。分享日志前仍应遮盖 Token、域名、公网地址和服务端信息。
fn-knock 服务自身重启后,会恢复已保存为持续运行的隧道,并在可验证时接管仍存在的进程。该守护只覆盖 fn-knock 启动的内置 FRP / Cloudflared;Windows 或其他外部独立进程仍由管理员负责。
平台边界
- 隧道是出站连接,不依赖 fn-knock 写入宿主机防火墙;Docker 也可使用。
- 运行环境必须有匹配架构的 FRP / Cloudflared 可执行资源。以
系统设置 → FRP或系统设置 → Cloudflared的就绪状态为准。 - 群晖 DSM 7 SPK 支持这些内置资源;其管理入口仍只在 DSM 桌面 CGI 中提供。托管 Cloudflared 的本地入口由 fn-knock 自动配置,FRP 和自管 Tunnel 才需使用实际网关端口。
- macOS Intel 与 Apple Silicon 原生包均支持这些内置资源;资源下载会匹配当前 Darwin 架构,管理面板仍只监听本机
127.0.0.1:7991。 - Windows 不提供这些内置资源或就绪状态;自行部署的隧道进程不受 fn-knock 启停和日志管理。
- Docker 内的
127.0.0.1指当前容器。fn-knock 网关与隧道进程在同一容器时可使用它;自建独立隧道容器需要改用服务名或容器网络地址。 - 内网穿透模式不提供智能连接和协议映射。额外 TCP / UDP 服务需在 FRP 或 Cloudflare 平台单独设计。
- 切离内网穿透模式时,系统会尝试停止由 fn-knock 管理的隧道进程;外部独立进程不在其控制范围内。
启动与验证
- 保存路由方式、鉴权 Host 和至少一条业务映射。
- 保存并启动 FRP;或为 Cloudflared 连接 API Token、预检并应用托管配置。
- 确认运行状态为已连接;若显示
等待重启,查看连续失败次数、下次重试时间和最近诊断,再检查 Token、TLS、网络或端口错误。 - 从外部网络访问鉴权 Host 和业务 Host。
- 在请求日志核对 Host、客户端 IP、授权类型和上游 Target。
