协议映射
这页解决什么问题
协议映射 不是给 Web 页面用的,而是给:
SSHMySQLRedisDNS- 其他直接基于
TCP/UDP端口通信的服务
它解决的是:
我想继续让这些非 Web 服务暴露到公网,但又不想完全脱离 fknock 的统一认证入口。
这个能力是:
子域模式下的可选补充能力- 默认不会直接显示
- 需要先在
系统设置 → 功能里开启协议映射
先理解:它和路径映射、子域映射不是一回事
不要把它和下面两类功能混在一起:
协议映射 做的是:
- 直接监听一个公网端口
- 把进入这个端口的
TCP或UDP流量 - 原样转发到指定的
host:port
所以它更像:
3306→127.0.0.1:330622→127.0.0.1:2253/udp→127.0.0.1:53
而不是:
/dbdb.example.com
什么时候值得用
适合这些场景:
- 你已经在用子域模式承载 Web 服务
- 还想补一两个非 Web 协议入口
- 希望继续由 fknock 控制这些端口是否允许外部访问
最常见的例子是:
- 管理端口的
SSH - 数据库的
MySQL/PostgreSQL - 自己明确知道边界的
Redis - 局域网外访问的
DNS
不太适合下面这些场景:
- 你只是想给浏览器访问的 Web 站点开入口
- 你需要按路径组织服务
- 你希望客户端连接时弹出网页登录
这类场景应该优先回到:
协议映射什么时候会出现
侧边栏里的 协议映射 入口只有在同时满足下面两件事时才会显示:
- 当前已经切到
子域模式 系统设置 → 功能里的协议映射开关已经开启
需要特别注意:
- 关闭这个功能开关,不只是“隐藏导航”
- 现有的协议映射配置也会被清空
所以如果你已经正式在用,关闭前最好先确认是否需要:
- 手动备份配置
- 或先导出一份系统备份
一条协议映射包含哪些信息
传输协议
当前支持:
TCPUDP
同一个对外端口可以分别存在:
- 一条
TCP规则 - 一条
UDP规则
例如:
53/tcp53/udp
可以同时存在。
对外端口
这是公网客户端真正要连的端口。
例如你把它填成:
3306
那么外部访问通常就是:
demo.example.com:3306
这里的域名本身不负责路由分发,只要它最终解析到当前 fknock 所在机器即可。
目标地址
这里填的是最终转发目标,格式必须是:
host:port
例如:
127.0.0.1:3306192.168.1.20:22
不接受:
http://127.0.0.1:3306https://...
也就是说,它不是 URL,而是纯粹的网络地址。
要求鉴权
这是协议映射最容易误解的开关。
开启后不会像网页那样:
- 自动跳转到登录页
- 再回到原协议客户端
因为 SSH、MySQL、Redis 这类客户端本身就不会处理网页登录。
它的真实行为是:
- 先按来源 IP 检查你是否已经在网页端完成认证
- 已通过:允许当前连接继续建立
- 未通过:直接拒绝连接
所以如果你打开了 要求鉴权,正确使用顺序通常是:
- 先在浏览器访问 fknock 的网页入口并登录
- 确认当前公网出口 IP 已被识别为已登录
- 再回到协议客户端发起连接
外部访问时要怎么理解“先登录再连接”
可以这样理解:
- Web 入口负责“签发信任状态”
- 协议映射负责“检查当前来源 IP 是否已经被信任”
因此它更接近:
- “当前公网出口 IP 有资格连接这个端口”
而不是:
- “这个 SSH 客户端会自己弹出 fknock 登录页”
如果你的公网出口经常变化,例如:
- 手机热点
- 移动网络
- 频繁变化的代理出口
那么开启 要求鉴权 后的体验通常会更依赖:
- 先重新到网页入口刷新登录状态
修改后为什么还会看到“同步网关”
保存协议映射时,系统会立即尝试:
- 更新配置
- 同步网关监听
- 同步对应的端口放行规则
大多数情况下,保存后就已经生效。
页面里的 同步网关 更适合这些场景:
- 你连续改了多条规则
- 你怀疑端口监听状态还没刷新
- 你想主动触发一次完整同步
推荐的第一轮使用方式
如果你是第一次接触这个功能,建议这样做:
- 先只加 1 条最刚需的规则
- 优先用内网目标地址,例如
127.0.0.1或局域网地址 - 第一次先决定是否真的需要开启
要求鉴权 - 保存后立刻从外部网络做一次实际连接验证
推荐的排错顺序
如果某条协议映射连不上,建议按这个顺序看:
- 当前是不是已经切到
子域模式 系统设置 → 功能里的协议映射是否已开启- 目标地址是不是纯
host:port,而不是 URL - 目标服务在本机或内网是否本来就能连通
- 是否误把
TCP/UDP选错了 - 如果开启了
要求鉴权,当前公网出口 IP 是否已经先在网页里登录 - 改完后是否需要手动点一次
同步网关
