跳到正文

安全边界与基线

安全配置应先回答两个问题:请求是否一定经过 fn-knock,以及网关拿到的是否是真实客户端 IP。两者任一不成立,认证、白名单和地区规则都可能与预期不同。

先确认边界

fn-knock 只能约束经过网关入口的流量。以下情况需要在网关外处理:

  • 路由器、云安全组或 Docker 发布了业务服务的原始端口;
  • CDN、反向代理或隧道直接回源到业务服务;
  • 前置代理把自己的内网地址误传成客户端 IP;
  • 管理面板、数据库或 SSH 被单独暴露。

网关会把回环、私网、链路本地地址和 CGNAT 地址视为本地来源,并在认证预检时直接放行。这一规则优先于会话与 IP 授权。因此,验证受保护服务时请使用移动网络或其他真实公网链路;不要只在家庭 Wi-Fi 中测试。

建议的安全基线

  1. 只对外开放网关所需端口;管理入口仅放在局域网、VPN 或可信反代后。
  2. 为网关准备正式 HTTPS 证书,并为每个公开 Host 配置正确的 DNS。
  3. 创建至少两个可恢复的登录凭据;常用设备再绑定 Passkey。
  4. 新服务默认开启“要求登录”,只有明确需要时才设为公开。
  5. 打开请求日志和事件通知,观察正常流量后再收紧 WAF、网关节流、扫描器或黑名单规则。
  6. 定期更新宿主机、fn-knock 和上游服务,并在更新前导出受保护的备份。

各层控制的作用

层级解决的问题主要入口
网关可见性限制哪些地区或 CIDR 能碰到网关系统设置 → 网关
映射访问策略决定一个 Host 是公开还是要求登录子域映射
子域高级认证按来源或请求特征签发当前 Host 的临时凭据子域映射 → 高级认证配置
认证与会话确认身份、会话时长、Cookie 共享和凭据范围认证配置会话管理
IP 白名单给固定 IP/CIDR 或登录后的 IP 授权IP 白名单
登录退避延迟同一来源持续失败的登录尝试会话管理 → 登录退避
网关节流与爬虫拦截限制高频反代流量并拒绝已识别爬虫系统设置 → 网关
扫描器拦截按非常规路径命中维护独立黑名单系统设置 → 拦截
通用黑名单立即拒绝已确认的单个来源 IP会话管理 → 通用黑名单
WAF检测或拦截经过网关的 HTTP 请求系统设置 → WAF
SSH 防火墙按来源与失败登录保护宿主机 SSHSSH 安全,仅具备宿主机能力的部署
主机或上级防火墙收敛业务原始端口和管理端口宿主机、路由器或云安全组

这些控制互相补充,不能彼此替代。例如 WAF 不会关闭一个已暴露的数据库端口;白名单也不会修复上游应用漏洞。子域高级认证命中后会放行整个当前 Host,不应当作持续的路径级限制。

真实客户端 IP

来自 CDN、反向代理或隧道的请求,是否能被正确识别取决于上游的真实 IP 头。fn-knock 会依次处理常见的 X-Forwarded-ForX-Real-IPEO-Connecting-IPAli-Real-Client-IP 信息。

当前设置页没有入站可信代理 CIDR 列表;前置代理必须删除或重写外部客户端可伪造的真实 IP 头。若它错误传递了 127.0.0.1192.168.x.x 等地址,公网请求可能被误判为本地豁免。接入 EdgeOne、ESA、Cloudflare 或自建反代后,应分别从外网检查请求日志中的“客户端 IP”和“连接来源 IP”。

管理面的隔离

管理面板拥有修改认证、证书、代理、黑名单和终端的权限,应使用比普通业务入口更严格的边界:

  1. 在认证配置中单独设置管理面板可访问范围;
  2. 优先限制到局域网、VPN 或固定可信 CIDR;
  3. 不与公开业务共用弱口令凭据;
  4. 启用本机终端前核对 fn-knock 服务进程的宿主机权限;
  5. 保留第二个管理员凭据和本地控制台恢复方式;
  6. 定期检查活动会话、IP 漂移记录和登录退避。

管理面板隐藏或修改路径不是访问控制。入口仍需认证、网络限制和正式 HTTPS。

Web 终端的高权限边界

完整标准 FPK、Linux 服务、macOS 和 OpenWrt 可启用本机 PTY;它默认关闭。Lite、Docker、群晖、Windows 和开发环境只提供远程 SSH。启用本机 PTY 必须完成风险确认,并核对页面显示的执行身份、Shell 与初始目录。

本机 PTY 直接继承 fn-knock 管理服务的有效 UID/GID,不做自动降权、用户切换或 localhost SSH。服务以 root 运行时,终端也是 root Shell。关闭或刷新浏览器只会断开浏览器连接,Shell 会继续运行;服务重启、Shell 退出、管理员结束会话或禁用本机终端才会终止它。禁用时如有活动会话,系统会要求再次确认并先结束会话。

事件中心会记录本机终端启用、禁用和会话生命周期,并标明执行身份与特权状态,但不会记录逐条命令。远程 SSH 同样不提供命令级审计;有合规要求时,应在宿主机或远程目标另行部署审计机制。完整说明见 Web 终端

收敛上游端口

反向代理只有在客户端无法绕过它时才形成安全边界:

  • 上游服务优先监听 127.0.0.1 或仅 fn-knock 可达的容器网络;
  • 必须监听局域网地址时,使用宿主机防火墙只允许网关来源;
  • 检查 Docker ports、路由器端口转发、云安全组、FRP 和 CDN 回源;
  • 协议映射暴露的是 TCP/UDP 流量,不经过 HTTP 认证和 WAF,应单独限制。

从公网扫描公开地址,确认业务原始端口没有意外暴露。只在同一局域网测试无法证明公网边界正确。

发生异常时

  1. 先在请求日志确认请求是否到达网关。
  2. 检查 Host、路径、上游目标和路由类型是否符合预期。
  3. 确认客户端 IP 是否来自真实公网地址,而不是代理地址。
  4. 查看会话、白名单、登录退避、扫描器黑名单、通用黑名单和 WAF 日志。
  5. 对照事件中心,确认配置变更、登录、封锁或更新发生的时间。
  6. 怀疑原始端口暴露时,回到路由器、云安全组、容器端口和宿主机防火墙逐项检查。

恢复服务时只临时放宽发生问题的单层策略,并记录原值。验证原因后恢复安全设置,避免同时关闭认证、WAF 和黑名单而失去定位依据。

QQ群:1081609274