Skip to content

封禁列表 ​

security.blocklist 插件从发布地址列表的地方获取需要拒绝访问的地址:威胁情报源、信誉服务、服务器之间共享的封禁列表。用户配置来源后,Nginx UI 按每个来源的刷新间隔调用插件,把结果写成 nginx deny 规则保存到自己的文件中,并在列表变化时重载 nginx。

方法必需用途
blocklist.fetch是获取一个来源当前的完整列表。

插件必须请求 network 权限。

声明来源类型 ​

json
"capabilities": ["security.blocklist"],
"permissions": ["network"],
"blocklist": {
  "sources": [
    {
      "code": "threatfeed",
      "name": "ThreatFeed",
      "refresh_seconds": 900,
      "configuration": {
        "fields": [
          { "key": "api_key", "display_name": "API key", "required": true, "secret": true },
          { "key": "min_score", "type": "number", "display_name": "Minimum score", "help_text": "Only list addresses scored at least this high" }
        ]
      }
    }
  ]
}

code、name 和 configuration.fields 的用法与通知渠道相同。refresh_seconds 是该类型来源的默认刷新间隔:0 或不填表示一小时,否则至少为 60,因为变化更快的列表无法靠重载 nginx 来提供。

获取 ​

json
{ "jsonrpc": "2.0", "id": 48, "method": "blocklist.fetch", "params": { "source": "threatfeed", "config": { "api_key": "key_live_xxx", "min_score": "80" } } }

回复当前的完整列表,而不是自上次调用以来的变化:

json
{
  "jsonrpc": "2.0", "id": 48,
  "result": {
    "entries": [
      { "cidr": "198.51.100.23", "reason": "SSH brute force" },
      { "cidr": "203.0.113.0/24", "reason": "Botnet command and control" },
      { "cidr": "2001:db8:bad::/48" }
    ],
    "ttl_seconds": 900
  }
}
字段含义
entries[].cidrIPv4 或 IPv6 地址,或 CIDR 网段。不含端口、区域或主机名。
entries[].reason来源列出它的原因,仅供显示。可选。
ttl_seconds列表的有效期。0 表示由刷新间隔决定。

每个地址只发送一次,绝不要发送覆盖所有地址的条目(0.0.0.0/0、::/0)。

警告

无法获取列表时,回复错误,绝不要回复空列表。 空列表会让 Nginx UI 不拒绝任何地址,而错误会保留当前的列表。原因在于配置(包括必填字段为空)时回复带 data.field 的 -32003,其他情况回复 -32000。绝不要把 config 的值写入日志、错误或 reason。

Nginx UI 如何处理结果 ​

  • 它把每个条目解析为地址或网段,丢弃其他条目以及覆盖所有地址的条目,并报告丢弃的数量。结果中的其他文本(包括 reason)都不会进入配置。条目会被规范化、去重、排序,并且最多保留 100000 个。

  • 它把每个来源的列表写入 <nginx 配置目录>/blocklists/<来源 ID>.conf:

    nginx
    # generated by nginx-ui
    deny 198.51.100.23;
    deny 203.0.113.0/24;
    deny 2001:db8:bad::/48;
  • 只有文件变化时才重载 nginx,重载前先测试配置,测试失败时恢复之前的文件。获取失败时保留当前文件。

  • 它从不自行把文件加入某个 server,而是向用户显示需要添加在列表生效位置的那一行:include blocklists/<来源 ID>.conf;。

Nginx UI 在来源的间隔之后再次获取;上次结果的 ttl_seconds 更短时会提前获取,但最多每分钟一次。获取失败时,在 5 分钟和间隔两者中较短的时间后重试。最近一次获取的结果显示在来源旁边。blocklist.fetch 最多等待 60 秒。

Released under the AGPL-3.0 License. (350eea3f)