安全边界与基线
安全配置应先回答两个问题:请求是否一定经过 fn-knock,以及网关拿到的是否是真实客户端 IP。两者任一不成立,认证、白名单和地区规则都可能与预期不同。
先确认边界
fn-knock 只能约束经过网关入口的流量。以下情况需要在网关外处理:
- 路由器、云安全组或 Docker 发布了业务服务的原始端口;
- CDN、反向代理或隧道直接回源到业务服务;
- 前置代理把自己的内网地址误传成客户端 IP;
- 管理面板、数据库或 SSH 被单独暴露。
网关会把回环、私网、链路本地地址和 CGNAT 地址视为本地来源,并在认证预检时直接放行。这一规则优先于会话与 IP 授权。因此,验证受保护服务时请使用移动网络或其他真实公网链路;不要只在家庭 Wi-Fi 中测试。
建议的安全基线
- 只对外开放网关所需端口;管理入口仅放在局域网、VPN 或可信反代后。
- 为网关准备正式 HTTPS 证书,并为每个公开 Host 配置正确的 DNS。
- 创建至少两个可恢复的登录凭据;常用设备再绑定 Passkey。
- 新服务默认开启“要求登录”,只有明确需要时才设为公开。
- 打开请求日志和事件通知,先观察一段时间再收紧 WAF、限流或黑名单规则。
- 定期更新宿主机、fn-knock 和上游服务,并在更新前导出受保护的备份。
各层控制的作用
| 层级 | 解决的问题 | 主要入口 |
|---|---|---|
| 网关可见性 | 限制哪些地区或 CIDR 能碰到网关 | 系统设置 → 网关 |
| 映射访问策略 | 决定一个 Host 是公开还是要求登录 | 子域映射 |
| 认证与会话 | 确认身份、会话时长和凭据范围 | 认证配置、系统设置 → 会话 |
| IP 白名单 | 给固定 IP/CIDR 或登录后的 IP 授权 | IP 白名单 |
| 登录退避与爬虫拦截 | 降低重复尝试和明显扫描的影响 | 系统设置 → 会话 / 拦截 |
| WAF | 检测或拦截经过网关的 HTTP 请求 | 系统设置 → WAF |
| 主机防火墙 | 收敛原始端口的入站访问 | 仅具备主机能力的部署 |
这些控制互相补充,不能彼此替代。例如 WAF 不会关闭一个已暴露的数据库端口;白名单也不会修复上游应用漏洞。
真实客户端 IP
来自 CDN、反向代理或隧道的请求,是否能被正确识别取决于上游的真实 IP 头。fn-knock 会依次处理常见的 X-Forwarded-For、X-Real-IP、EO-Connecting-IP 和 Ali-Real-Client-IP 信息。
当前设置页没有入站可信代理 CIDR 列表;前置代理必须删除或重写外部客户端可伪造的真实 IP 头。若它错误传递了 127.0.0.1、192.168.x.x 等地址,公网请求可能被误判为本地豁免。接入 EdgeOne、ESA、Cloudflare 或自建反代后,应分别从外网检查请求日志中的“客户端 IP”和“连接来源 IP”。
发生异常时
- 先在请求日志确认请求是否到达网关。
- 检查 Host、路径、上游目标和路由类型是否符合预期。
- 确认客户端 IP 是否来自真实公网地址,而不是代理地址。
- 再查看会话、白名单、WAF 日志和登录退避记录。
- 怀疑原始端口暴露时,回到路由器、云安全组和宿主机防火墙逐项检查。
