Skip to content

协议映射

协议映射 为 SSH、数据库、DNS 等非 HTTP 服务增加 TCP / UDP 监听端口。它不读取域名 Host 或 URL 路径,而是把某个对外端口的字节流转发到 host:port

该功能只作为公网直连 子域模式 的补充。Web 服务继续使用 子域映射;路径兼容规则见 路径映射

生效条件

侧边栏显示 协议映射 需要同时满足:

  1. 系统设置 → 模式子域模式
  2. 系统设置 → 功能 → 协议映射 已开启。

关闭功能开关会清空现有协议映射,而不只是隐藏菜单。切离子域模式时功能也会关闭,变更前先记录仍需保留的规则。

内网穿透 → 子域映射 虽然同样使用 Host 路由,但不提供协议映射。FRP 或 Cloudflare 若要承载其他协议,需要在对应平台单独配置,不能复用 fn-knock 的 HTTP Host 入口。

路由模型

text
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,最终命中哪条规则只取决于传输协议和端口。

规则字段

字段说明
传输协议TCPUDP,可同时选择;保存后拆成两条规则
对外端口客户端连接的端口,范围 1-65535
目标地址host:port,不能带 http:// 或路径
要求鉴权连接前按来源 IP 查询 fn-knock 授权状态

同一个端口可各有一条 TCP 和 UDP 规则,例如 53/tcp53/udp;同协议、同端口不能重复。

目标必须能从 fn-knock 所在环境访问。Docker 中 127.0.0.1 指容器自身,宿主机或局域网目标要使用容器可达地址。

鉴权是来源 IP 检查

SSH、MySQL、Redis 等客户端不会打开 fn-knock 登录页。开启 要求鉴权 后,使用顺序是:

  1. 在浏览器打开 fn-knock 的 Web 入口并完成登录。
  2. 若会话设置和所用凭据允许,登录流程为当前公网出口 IP 建立授权记录;否则手动添加该 IP / CIDR。
  3. 再由协议客户端从同一出口 IP 连接对外端口。

出口 IP 变化、授权过期或客户端走了另一条网络时,连接会被直接拒绝,需要重新登录或更新手动授权。浏览器 Cookie 本身不会随 TCP / UDP 连接发送;协议入口依赖的是来源 IP 授权。服务范围受限的登录凭据不会创建自动 IP 授权,需改用未限制范围的凭据或手动添加来源。会话和 IP 变化见 会话管理与 IP 轨迹,认证方式见 认证体系总览

关闭 要求鉴权 会把该监听端口公开转发。目标服务自己的 SSH 密钥、数据库密码、TLS 和最小权限仍然必须配置。

local_exempt

鉴权服务把网关识别到的回环、私网和链路本地来源归为 local_exempt。这些来源连接启用鉴权的协议映射时也会被视为本地网络访问,不要求先做网页登录。

因此:

  • 局域网连接成功不能证明公网鉴权有效。
  • 若端口前还有 NAT 或代理,应确认网关看到的不是代理的私网地址。
  • 公网测试要使用真实外部网络,并核对会话中的来源 IP。

保存、同步与防火墙

保存规则会更新配置、刷新网关监听,并在支持的部署中同步端口放行。同步网关 用于连续修改多条规则后主动重放全部配置,通常不必每次点击。

平台边界如下:

  • 飞牛原生 FPK,以及具备 root 宿主机能力的 OpenWrt,可在开启自动防火墙管理时同步协议端口。
  • Docker 不会发布新的宿主机端口,也不会修改宿主机防火墙。需要在容器启动配置中显式发布固定端口,并手动处理宿主机与路由器规则;运行中的 Compose 不能只靠后台新增端口完成公网暴露。
  • 自行接管网关运行环境时,端口放行仍由系统管理员负责;不要假定 fn-knock 会修改宿主机防火墙。

无论平台是否自动放行,路由器端口转发、云安全组和上游网络策略仍需允许该端口。

验证与排错

  1. 确认当前为公网直连子域模式,功能开关仍开启。
  2. 检查协议与对外端口是否和客户端一致。
  3. 从 fn-knock 运行环境直接连接 Target。
  4. 检查容器端口发布、宿主机防火墙、路由器转发和云安全组。
  5. 开启鉴权时,确认浏览器登录与协议客户端使用同一公网出口 IP。
  6. 保存后仍未监听时点击 同步网关,再查看状态和日志。

相关功能开关见 系统设置

QQ群:1081609274