Skip to content

入侵防护 ​

类似 fail2ban 的入侵防护:从日志中识别暴力破解,在没有使用的端口上设诱饵,统计端口扫描,把恶意 IP 加入封禁表,并同步到系统防火墙(nftables),在内核层丢弃它的全部流量。

能力 ​

  • 日志规则:读取日志文件、systemd 日志、命令输出(如 OpenWrt 的 logread -f)或 Docker 容器日志,用正则找出失败记录,同一 IP 在统计窗口内达到次数即封禁;内置 SSH、Dropbear、Nginx、Vaultwarden、Home Assistant、Proxmox VE 等模板,规则编辑时可粘贴日志样例直接测试;
  • Gately 事件:管理后台登录失败、WAF 拦截也可以作为规则来源,无需写正则;
  • 诱饵端口:在本机没有使用的端口上设下诱饵(默认 23、135、1433、3389、5900、6379 等),任何来源一连接就封禁;
  • 端口扫描检测:同一来源每分钟连接本机未开放端口的次数超过阈值即封禁;
  • 统一封禁表:手动封禁(支持 CIDR 网段与永久封禁)、Web 服务认证失败的自动封禁都在这里管理;封禁会持久化,重启后恢复;
  • 递增封禁:同一地址 30 天内再次被封禁时时长翻倍,直到上限;
  • 白名单:默认忽略内网、回环、100.64.0.0/10(Tailscale)与本机网卡所在的 IPv6 /64 网段(封禁按 /64 进行,同一局域网的公网 IPv6 设备不会被连带封禁),可追加 IP 或网段;白名单中的单个 IPv6 地址会保护它所在的整个 /64。

生效范围 ​

环境封禁效果诱饵端口端口扫描检测
Linux(root 或 CAP_NET_ADMIN,已安装 nftables)内核层丢弃全部流量,包括 SSH、其他程序与转发给 Docker 容器、内网设备的流量内核处理,能发现只发 SYN 的扫描可用
Docker(host 网络 + cap_add: NET_ADMIN)同上,规则写入宿主机同上可用
飞牛 fnOS 安装包、OpenWrt 22.03 及以上同上(以 root 运行,系统自带 nftables)同上可用
其他情况(Windows、macOS、FreeBSD、没有 nftables 或权限的 Linux)只对 Gately 自身的服务生效:端口转发、Web 服务、STUN、WebDAV、FTP、管理后台由 Gately 监听,只能发现完成握手的连接不可用

页面顶部会显示防火墙同步状态,不可用时给出原因与处理办法。

防火墙规则 ​

开启「同步到系统防火墙」后,Gately 在 nftables 中创建独立的 inet gately 表,不改动系统已有的规则(fw4、Docker、ufw 等):

  • prerouting 链(优先级 -190,在连接跟踪之后、目的地址转换之前)丢弃被封禁地址发来的数据包,发往本机、转发给容器或内网设备的流量都会被丢弃;本机主动发起的连接(例如访问 DNS、软件源)的回包照常放行,即使对方地址被封禁也不受影响;IPv6 按 /64 网段封禁;
  • input 链只统计发往本机的新连接,用于诱饵端口与扫描检测,白名单地址不参与;
  • 关闭同步或停止 Gately 时整张表被删除;表被其他程序清除后 10 秒内自动重写。

页面上的「查看规则」可以看到当前写入的完整规则。

Docker 部署

需要 network_mode: host 并授予 NET_ADMIN,规则才会写入宿主机:

yaml
    network_mode: host
    cap_add:
      - NET_ADMIN

不授予时封禁仍对 Gately 自身的服务生效。读取宿主机日志需要把日志目录挂载进容器,例如 - /var/log:/var/log/host:ro,规则中填写 /var/log/host/auth.log;systemd 日志来源在容器中不可用。

日志规则 ​

来源填写说明
日志文件文件路径,每行一个从文件末尾开始读取新增内容,轮转(改名或截断)后自动切换
systemd 日志服务单元,如 ssh.service通过 journalctl -f 读取
命令输出一条命令,如 logread -f命令退出后自动重启
Docker 容器容器名通过 Docker 管理模块连接的 Docker 读取
Gately 事件管理后台登录失败 / WAF 拦截事件自带来源 IP,无需过滤规则

过滤规则是 Go 正则表达式(RE2 语法),每行一条,用 <HOST> 表示来源地址,例如:

Failed password for (?:invalid user )?\S* ?from <HOST>

「排除规则」中匹配的行不计数。统计窗口、失败次数与封禁时长可按规则设置,封禁时长可选默认、自定义或永久。

端口扫描检测的取舍 ​

扫描检测统计的是连接本机未在监听的端口的新连接:正在监听的 TCP 端口每 10 秒自动刷新,视为开放;由其他防火墙规则转发出去的端口不经过 input 链,不会被统计。阈值默认每分钟 12 次,正常客户端重试一个关闭的端口每分钟约 5 次,不建议设得低于 10。

诱饵端口中正在被监听的端口会被自动排除,避免误封正常访问者。

与 Web 服务的关系 ​

Web 服务「认证失败封禁」产生的封禁写入同一张封禁表,因此开启防火墙同步后会对整台主机生效,不再只限于 Web 站点。开启「忽略内网地址」时,内网地址不会被自动封禁。

Web 服务与 WAF 只通过 PROXY 协议识别真实客户端地址。站点经 CDN 回源、由请求头传递真实 IP 时,认证失败封禁与「WAF 拦截」规则封禁的会是 CDN 节点,这类站点不要启用它们。

通知 ​

封禁产生 入侵防护:IP 已被封禁 事件,可在通知中心订阅;诱饵端口与扫描检测在同一轮检查中封禁的多个地址合并为一条通知。

验证 ​

在飞牛 fnOS(Debian 12,nftables 1.0.6)与 iStoreOS 24.10(nftables 1.1.1)的独立网络命名空间中验证:诱饵端口与扫描检测(IPv4 与 IPv6)在内核层封禁并导入封禁表,日志文件(含轮转)、systemd 日志、Docker 容器日志与管理后台登录失败均能触发封禁;手动网段与永久封禁、解封、递增时长、重启后恢复、规则被外部删除后重写、停止时清理规则均符合预期;Docker 容器在没有 NET_ADMIN 时识别为权限不足并退回用户态诱饵端口。

以 Apache-2.0 许可证开源发布。