Skip to content

协议映射

这页解决什么问题

协议映射 不是给 Web 页面用的,而是给:

  • SSH
  • MySQL
  • Redis
  • DNS
  • 其他直接基于 TCP / UDP 端口通信的服务

它解决的是:

我想继续让这些非 Web 服务暴露到公网,但又不想完全脱离 fknock 的统一认证入口。

这个能力是:

  • 子域模式 下的可选补充能力
  • 默认不会直接显示
  • 需要先在 系统设置 → 功能 里开启 协议映射

先理解:它和路径映射、子域映射不是一回事

不要把它和下面两类功能混在一起:

协议映射 做的是:

  • 直接监听一个公网端口
  • 把进入这个端口的 TCPUDP 流量
  • 原样转发到指定的 host:port

所以它更像:

  • 3306127.0.0.1:3306
  • 22127.0.0.1:22
  • 53/udp127.0.0.1:53

而不是:

  • /db
  • db.example.com

什么时候值得用

适合这些场景:

  1. 你已经在用子域模式承载 Web 服务
  2. 还想补一两个非 Web 协议入口
  3. 希望继续由 fknock 控制这些端口是否允许外部访问

最常见的例子是:

  • 管理端口的 SSH
  • 数据库的 MySQL / PostgreSQL
  • 自己明确知道边界的 Redis
  • 局域网外访问的 DNS

不太适合下面这些场景:

  • 你只是想给浏览器访问的 Web 站点开入口
  • 你需要按路径组织服务
  • 你希望客户端连接时弹出网页登录

这类场景应该优先回到:

协议映射什么时候会出现

侧边栏里的 协议映射 入口只有在同时满足下面两件事时才会显示:

  1. 当前已经切到 子域模式
  2. 系统设置 → 功能 里的 协议映射 开关已经开启

需要特别注意:

  • 关闭这个功能开关,不只是“隐藏导航”
  • 现有的协议映射配置也会被清空

所以如果你已经正式在用,关闭前最好先确认是否需要:

  • 手动备份配置
  • 或先导出一份系统备份

一条协议映射包含哪些信息

传输协议

当前支持:

  • TCP
  • UDP

同一个对外端口可以分别存在:

  • 一条 TCP 规则
  • 一条 UDP 规则

例如:

  • 53/tcp
  • 53/udp

可以同时存在。

对外端口

这是公网客户端真正要连的端口。

例如你把它填成:

  • 3306

那么外部访问通常就是:

  • demo.example.com:3306

这里的域名本身不负责路由分发,只要它最终解析到当前 fknock 所在机器即可。

目标地址

这里填的是最终转发目标,格式必须是:

  • host:port

例如:

  • 127.0.0.1:3306
  • 192.168.1.20:22

不接受:

  • http://127.0.0.1:3306
  • https://...

也就是说,它不是 URL,而是纯粹的网络地址。

要求鉴权

这是协议映射最容易误解的开关。

开启后不会像网页那样:

  • 自动跳转到登录页
  • 再回到原协议客户端

因为 SSHMySQLRedis 这类客户端本身就不会处理网页登录。

它的真实行为是:

  1. 先按来源 IP 检查你是否已经在网页端完成认证
  2. 已通过:允许当前连接继续建立
  3. 未通过:直接拒绝连接

所以如果你打开了 要求鉴权,正确使用顺序通常是:

  1. 先在浏览器访问 fknock 的网页入口并登录
  2. 确认当前公网出口 IP 已被识别为已登录
  3. 再回到协议客户端发起连接

外部访问时要怎么理解“先登录再连接”

可以这样理解:

  • Web 入口负责“签发信任状态”
  • 协议映射负责“检查当前来源 IP 是否已经被信任”

因此它更接近:

  • “当前公网出口 IP 有资格连接这个端口”

而不是:

  • “这个 SSH 客户端会自己弹出 fknock 登录页”

如果你的公网出口经常变化,例如:

  • 手机热点
  • 移动网络
  • 频繁变化的代理出口

那么开启 要求鉴权 后的体验通常会更依赖:

  • 先重新到网页入口刷新登录状态

修改后为什么还会看到“同步网关”

保存协议映射时,系统会立即尝试:

  • 更新配置
  • 同步网关监听
  • 同步对应的端口放行规则

大多数情况下,保存后就已经生效。

页面里的 同步网关 更适合这些场景:

  1. 你连续改了多条规则
  2. 你怀疑端口监听状态还没刷新
  3. 你想主动触发一次完整同步

推荐的第一轮使用方式

如果你是第一次接触这个功能,建议这样做:

  1. 先只加 1 条最刚需的规则
  2. 优先用内网目标地址,例如 127.0.0.1 或局域网地址
  3. 第一次先决定是否真的需要开启 要求鉴权
  4. 保存后立刻从外部网络做一次实际连接验证

推荐的排错顺序

如果某条协议映射连不上,建议按这个顺序看:

  1. 当前是不是已经切到 子域模式
  2. 系统设置 → 功能 里的 协议映射 是否已开启
  3. 目标地址是不是纯 host:port,而不是 URL
  4. 目标服务在本机或内网是否本来就能连通
  5. 是否误把 TCP / UDP 选错了
  6. 如果开启了 要求鉴权,当前公网出口 IP 是否已经先在网页里登录
  7. 改完后是否需要手动点一次 同步网关

相关阅读

QQ群:1081609274