协议映射
协议映射 为 SSH、数据库、DNS 等非 HTTP 服务增加 TCP / UDP 监听端口。它不读取域名 Host 或 URL 路径,而是把某个对外端口的字节流转发到 host:port。
该功能只作为公网直连 子域模式 的补充。Web 服务继续使用 子域映射;路径兼容规则见 路径映射。
在 映射管理 → 协议 管理 TCP / UDP 规则;页签是否显示取决于当前模式和协议映射功能开关。
生效条件
协议映射 页面只属于公网直连的子域路由。侧边栏显示入口需要满足:
系统设置 → 模式为子域模式。系统设置 → 功能 → 协议映射已开启,或当前仍有已保存的协议映射需要管理。
关闭功能开关会停止全部协议映射监听,但不会删除规则;只要仍有规则,管理入口就会保留,并显示停用提示,允许继续修正或删除配置。停用期间不能执行“同步网关”,重新开启后才会按剩余规则恢复监听。切离子域模式时功能也会自动关闭并停止监听,规则同样保留。
内网穿透 → 子域映射 虽然同样使用 Host 路由,但不提供协议映射。FRP 或 Cloudflare 若要承载其他协议,需要在对应平台单独配置,不能复用 fn-knock 的 HTTP Host 入口。
路由模型
TCP :2222 -> 192.168.1.20:22
TCP :13306 -> 127.0.0.1:3306
UDP :53 -> 127.0.0.1:53域名只负责解析到入口地址,不参与协议分发。客户端可连接 nas.example.com:2222,最终命中哪条规则只取决于传输协议和端口。
规则字段
| 字段 | 说明 |
|---|---|
传输协议 | TCP、UDP,可同时选择;保存后拆成两条规则 |
对外端口 | 客户端连接的端口,范围 1-65535 |
备注 | 可选说明,用于区分和搜索用途相近的映射 |
目标地址 | 纯 host:port,不能带 http:// 或路径 |
要求鉴权 | 连接前按来源 IP 查询 fn-knock 授权状态 |
同一个端口可各有一条 TCP 和 UDP 规则,例如 53/tcp 与 53/udp;同协议、同端口不能重复。
对外端口不能转发到本机的同一端口。例如 TCP :3306 -> 127.0.0.1:3306 会形成本地转发循环,因此保存和启用时都会被拒绝。校验范围包括 localhost、回环或未指定地址,以及 fn-knock 所在设备当前网卡的本机地址;应修改对外端口或目标端口。
服务启动时如果发现同端口本机自环、对外端口已被其他程序占用,或现有协议映射无法安全应用,系统会自动停用整项协议映射并保存启动错误,避免一条坏规则阻塞管理后台和其他网关功能。原规则不会删除,侧边栏入口也会保留;页面会显示可识别的问题协议、端口、Target 和原始错误。
先在协议映射页面删除或修正问题规则,再回到 系统设置 → 功能 重新开启。端口占用时可从系统进程和监听端口中找到冲突程序;无法定位到具体规则时,逐条核对最近修改的映射。不要在问题未解决时反复执行“同步网关”或重启服务。
目标必须能从 fn-knock 所在环境访问。Docker 中 127.0.0.1 指容器自身,宿主机或局域网目标要使用容器可达地址。
列表搜索会匹配协议、对外端口、备注、目标地址、服务识别结果和鉴权状态。备注可以在列表中直接修改;协议、端口、目标或鉴权状态仍通过编辑映射修改。
服务识别与严格协议校验
新建协议映射保存后保持启用,初始状态为 未启用严格校验。从该规则的更多操作中执行 检测 时,系统会主动连接 Target:得到高置信度且支持严格校验的服务结果后,会保存服务类型并切换为 严格协议校验;只能识别类型但不支持严格校验时,会保留识别结果但继续关闭严格校验;无法识别时也不会自动停用映射。
上游认证可能让 HTTP 探测只能看到 401,无法可靠区分普通 HTTP 与 WebDAV 等具体服务。此时从更多操作选择 指定服务类型,核对 Target 实际运行的服务。支持严格校验的类型会显示 确认并启用校验;标记为 仅识别 的类型只保存服务类型,映射保持启用且严格校验保持关闭。选择错误的严格校验类型会使合法连接因协议不符而被拒绝;清除手工指定类型只会清除识别结果并关闭严格校验,不会停用映射。
修改一条规则的协议、端口或 Target 会让原识别结果失效,并关闭严格校验,但映射保持启用;需要对新 Target 重新检测或指定服务类型。保持传输协议、对外端口和 Target 不变,只修改备注或登录要求时,已验证的服务识别结果会保留。
没有服务识别信息的已有规则会显示为 未启用严格校验,不会自动猜测服务类型。应逐条确认 Target 后执行检测;无法严格识别的服务仍可继续转发,但必须依靠 Target 自身的账号、密钥、TLS 和网络访问控制。
流量详情与活跃 IP
协议映射列表的 流量 列按 TCP/UDP + 对外端口 分别显示实时入站与出站速率。点击后可查看活跃连接数、最近 15 分钟、1 小时、6 小时、1 天或 7 天的累计流量和趋势图;新打开页面需要等待至少两个实时样本,才能计算每秒速率。
流量详情中的 活跃 IP 会列出统计窗口内连接过该映射的客户端地址、最近活跃时间、连接数和属地。可刷新列表,并把确认异常的公网 IP 加入或移出通用黑名单。私网或本机地址会标记为本地来源;加入黑名单前先排除 NAT 共享出口、前置代理和可信运维地址。
这些数据来自网关内存计数和后台采样,只用于运行观察,不是计费记录或完整连接审计。规则刚创建、网关刚重启或当前没有流量时,页面可能显示等待样本或空列表。
鉴权按来源 IP 与凭据范围检查
SSH、MySQL、Redis 等客户端不会打开 fn-knock 登录页。开启 要求鉴权 后,使用顺序是:
- 在浏览器打开 fn-knock 的 Web 入口并完成登录。
- 若
系统设置 → 会话 → 登录后 IP 授权方式未关闭,登录流程会为当前公网出口 IP 建立协议访问授权;否则需要手动添加该 IP / CIDR。 - 再由协议客户端从同一出口 IP 连接对外端口。
凭据使用 全部范围 时,协议授权可用于所有已开启鉴权的协议映射。凭据使用 自定义范围 时,需要在 认证配置 → 权限 中选中精确的 TCP/UDP + 对外端口;系统只为所选映射授权当前来源 IP,未选择的协议或端口仍会拒绝。修改凭据范围后,现有会话的协议授权会同步调整。
出口 IP 变化、授权过期、登录后 IP 授权关闭,或客户端走了另一条网络时,连接会被直接拒绝,需要重新登录或更新手动授权。浏览器 Cookie 本身不会随 TCP / UDP 连接发送;协议入口依赖的是来源 IP、协议与对外端口。手动 IP / CIDR 授权仍是独立放行路径。会话和 IP 变化见 会话管理与 IP 轨迹,认证方式与自定义范围见 认证体系总览。
协议客户端没有浏览器 Cookie,网关会把当前会话确认过的来源 IP 与协议授权关联起来。会话仍有效时,其当前来源 IP 在协议授权整个有效期内都可继续使用;因移动网络产生的其他漂移 IP 只在配置的漂移窗口内有效。会话或协议授权过期后都会拒绝连接,不会因为曾经登录过而永久保留旧 IP。
关闭 要求鉴权 会把该监听端口公开转发。目标服务自己的 SSH 密钥、数据库密码、TLS 和最小权限仍然必须配置。
按来源配置免登录
对已开启 要求登录鉴权 的映射,可从更多操作进入 配置免登录,让指定来源无需先完成网页登录。条件支持精确来源 IP、CIDR 和来源地区;同一规则组内的条件按 AND 同时满足,不同规则组按 OR 匹配。未命中的来源仍按原有登录鉴权流程处理。
地区条件会在保存时编译成固定 CIDR 集,不会随着地址库更新自动改写;地址库变化后需要重新保存策略。覆盖范围过大的 CIDR,或只由否定条件组成的宽泛规则,会要求二次确认。每条映射最多保存 16 个规则组,每组最多 16 个条件。
免登录只跳过 fn-knock 的登录检查,不会跳过服务识别和严格协议校验,也不会替代 Target 自身的账号、密钥或 TLS。关闭映射的 要求登录鉴权 时,本来就允许所有来源直接连接,已启用的免登录策略会停用,规则可保留为草稿;之后重新开启鉴权时应再次核对策略状态。
全局开放时间
在协议映射页的 添加映射 右侧打开更多操作,选择 定时启用或禁用,可为全部 TCP / UDP 规则设置同一个每日开放时间窗。时间使用 HH:mm,按服务器本地时间重复执行;启用与禁用时间不能相同,跨午夜配置会自动延续到次日,例如 22:00-06:00。
定时关闭与关闭协议映射功能不是同一种状态:
- 功能开关关闭时,全部协议监听都会停止;
- 定时关闭时,端口仍保持监听,新的 TCP 连接会被拒绝,UDP 数据包会被丢弃;
- 进入关闭时段前已经建立的 TCP 会话不会被强制中断;
- 到达开放时间后会继续接受新连接,不需要重新同步网关。
这是一条作用于所有协议映射的运行时间规则,不能为单条端口设置不同时间。后台页面会按服务器时间显示当前为 定时开放中 或 定时关闭中;浏览器或服务器时区配置错误时,显示与实际访问窗口都可能不符合预期,应先修正服务器时间与时区。
local_exempt
鉴权服务把网关识别到的回环、私网和链路本地来源归为 local_exempt。这些来源连接启用鉴权的协议映射时也会被视为本地网络访问,不要求先做网页登录。
因此:
- 局域网连接成功不能证明公网鉴权有效。
- 若端口前还有 NAT 或代理,应确认网关看到的不是代理的私网地址。
- 公网测试要使用真实外部网络,并核对会话中的来源 IP。
保存、同步与防火墙
新增、编辑、删除或修改备注都会按顺序保存,避免连续操作互相覆盖。涉及监听的规则变更会刷新网关,并在支持的部署中同步端口放行;备注只用于管理和搜索,不影响转发。同步网关 用于主动重放全部配置,通常不必在每次修改后点击。
平台边界如下:
- 飞牛原生 FPK 可在开启自动防火墙管理时同步协议端口。
- OpenWrt 不再由 fn-knock 管理宿主机防火墙。协议映射规则仍可监听,但必须由管理员在 OpenWrt 防火墙中手动放行对应端口。
- Docker 不会发布新的宿主机端口,也不会修改宿主机防火墙。需要在容器启动配置中显式发布固定端口,并手动处理宿主机与路由器规则;运行中的 Compose 不能只靠后台新增端口完成公网暴露。
- 自行接管网关运行环境时,端口放行仍由系统管理员负责;不要假定 fn-knock 会修改宿主机防火墙。
无论平台是否自动放行,路由器端口转发、云安全组和上游网络策略仍需允许该端口。
验证与排错
- 确认当前为公网直连子域模式,功能开关仍开启。
- 检查协议与对外端口是否和客户端一致。
- 从 fn-knock 运行环境直接连接 Target。
- 检查容器端口发布、宿主机防火墙、路由器转发和云安全组。
- 开启鉴权时,确认浏览器登录与协议客户端使用同一公网出口 IP,登录后 IP 授权未关闭,并且自定义凭据已选中当前协议与对外端口。
- 确认当前服务器时间处于全局开放窗口;定时关闭时端口仍可能被扫描到,但不会转发新流量。
- 若页面提示“启动失败,已自动停用”,先按提示修正规则或释放被占用端口,再重新开启功能;没有启动错误且保存后仍未监听时,才执行
同步网关并查看状态和日志。
相关功能开关见 系统设置。
