协议映射
协议映射 为 SSH、数据库、DNS 等非 HTTP 服务增加 TCP / UDP 监听端口。它不读取域名 Host 或 URL 路径,而是把某个对外端口的字节流转发到 host:port。
该功能只作为公网直连 子域模式 的补充。Web 服务继续使用 子域映射;路径兼容规则见 路径映射。
生效条件
侧边栏显示 协议映射 需要同时满足:
系统设置 → 模式为子域模式。系统设置 → 功能 → 协议映射已开启。
关闭功能开关会清空现有协议映射,而不只是隐藏菜单。切离子域模式时功能也会关闭,变更前先记录仍需保留的规则。
内网穿透 → 子域映射 虽然同样使用 Host 路由,但不提供协议映射。FRP 或 Cloudflare 若要承载其他协议,需要在对应平台单独配置,不能复用 fn-knock 的 HTTP Host 入口。
路由模型
TCP :2222 -> 192.168.1.20:22
TCP :3306 -> 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;同协议、同端口不能重复。
目标必须能从 fn-knock 所在环境访问。Docker 中 127.0.0.1 指容器自身,宿主机或局域网目标要使用容器可达地址。
鉴权是来源 IP 检查
SSH、MySQL、Redis 等客户端不会打开 fn-knock 登录页。开启 要求鉴权 后,使用顺序是:
- 在浏览器打开 fn-knock 的 Web 入口并完成登录。
- 若会话设置和所用凭据允许,登录流程为当前公网出口 IP 建立授权记录;否则手动添加该 IP / CIDR。
- 再由协议客户端从同一出口 IP 连接对外端口。
出口 IP 变化、授权过期或客户端走了另一条网络时,连接会被直接拒绝,需要重新登录或更新手动授权。浏览器 Cookie 本身不会随 TCP / UDP 连接发送;协议入口依赖的是来源 IP 授权。服务范围受限的登录凭据不会创建自动 IP 授权,需改用未限制范围的凭据或手动添加来源。会话和 IP 变化见 会话管理与 IP 轨迹,认证方式见 认证体系总览。
关闭 要求鉴权 会把该监听端口公开转发。目标服务自己的 SSH 密钥、数据库密码、TLS 和最小权限仍然必须配置。
local_exempt
鉴权服务把网关识别到的回环、私网和链路本地来源归为 local_exempt。这些来源连接启用鉴权的协议映射时也会被视为本地网络访问,不要求先做网页登录。
因此:
- 局域网连接成功不能证明公网鉴权有效。
- 若端口前还有 NAT 或代理,应确认网关看到的不是代理的私网地址。
- 公网测试要使用真实外部网络,并核对会话中的来源 IP。
保存、同步与防火墙
保存规则会更新配置、刷新网关监听,并在支持的部署中同步端口放行。同步网关 用于连续修改多条规则后主动重放全部配置,通常不必每次点击。
平台边界如下:
- 飞牛原生 FPK,以及具备 root 宿主机能力的 OpenWrt,可在开启自动防火墙管理时同步协议端口。
- Docker 不会发布新的宿主机端口,也不会修改宿主机防火墙。需要在容器启动配置中显式发布固定端口,并手动处理宿主机与路由器规则;运行中的 Compose 不能只靠后台新增端口完成公网暴露。
- 自行接管网关运行环境时,端口放行仍由系统管理员负责;不要假定 fn-knock 会修改宿主机防火墙。
无论平台是否自动放行,路由器端口转发、云安全组和上游网络策略仍需允许该端口。
验证与排错
- 确认当前为公网直连子域模式,功能开关仍开启。
- 检查协议与对外端口是否和客户端一致。
- 从 fn-knock 运行环境直接连接 Target。
- 检查容器端口发布、宿主机防火墙、路由器转发和云安全组。
- 开启鉴权时,确认浏览器登录与协议客户端使用同一公网出口 IP。
- 保存后仍未监听时点击
同步网关,再查看状态和日志。
相关功能开关见 系统设置。
