gildas-le-drogoff/geoip-blocklist-generator

GitHub: gildas-le-drogoff/geoip-blocklist-generator

基于 ipdeny 数据源生成按国家划分的 IPv4/IPv6 封锁列表,支持 ipset、nftables 和 HAProxy 多种格式输出。

Stars: 0 | Forks: 0

# geoip-blocklist-generator 根据 ipdeny.com 的聚合区域生成按国家划分的 IP 封锁列表(IPv4 和 IPv6)。 默认情况下,法语国家、邻国及合作伙伴被允许(不被封锁)。 生成的文件兼容 ipset/iptables、nftables 和 HAProxy ACL。 ![demo](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/6fa8ec8483093300.gif) ## 前置条件 - Go 1.21+ - [go.etcd.io/bbolt](https://github.com/etcd-io/bbolt) ## 安装 ``` # 安装至 $GOPATH/bin make install # 系统安装 (例如: /usr/local/bin) sudo make install ``` ## 仅编译 ``` make build ``` ## 用法 ``` # 使用默认白名单生成 ./geoip-blocklist-generator # 自定义白名单 (完全替换默认列表) ./geoip-blocklist-generator --autoriser="ru,cn" # 输出目录 ./geoip-blocklist-generator --sortie="/etc/haproxy/blocklists" # 测试 IP 或 CIDR 是否存在于缓存中 ./geoip-blocklist-generator --test-ip="1.180.0.1" ./geoip-blocklist-generator --test-ip="157.90.40.40/8" ./geoip-blocklist-generator --test-ip="2801:18:9800::/48" ``` ## Flags | Flag | 默认值 | 描述 | | ------------- | ------------------------------- | ------------------------------------------------------------------------ | | `--autoriser` | 法语国家 + 邻国 | 不封锁的国家,以逗号分隔的 ISO 3166-1 alpha-2 代码 | | `--sortie` | 当前目录 | 生成文件的输出目录 | | `--test-ip` | — | 用于对照缓存进行测试的 IP 或 CIDR | `--autoriser` 将完全替换默认列表。要封锁所有国家且无例外,请使用:`--autoriser=""`。 ## 生成的文件 | 文件 | 内容 | | ------------------------ | -------------------------- | | `deny_ipv4_networks.txt` | 要封锁的 IPv4 CIDR 段 | | `deny_ipv6_networks.txt` | 要封锁的 IPv6 CIDR 段 | bbolt 缓存(TTL 24小时)存储在 `$XDG_CACHE_HOME/geoip-blocklist-generator/`(如果未定义 `XDG_CACHE_HOME`,则为 `~/.cache/...`)。 ## 默认允许的国家 两个组构成了默认白名单。 **法语国家** ``` be bf bi bj bl ca cd cf cg ch ci cm dj dz fr ga gf gn gq gp ht km lb lu ma mc mg ml mq ne nc pf rw sc sn td tg tn vu wf ``` **邻国及合作伙伴** ``` ad be br ch de es gb it lu mc sr ``` ## --test-ip 行为 `--test-ip` 查询本地缓存而不触发下载。缓存必须事先通过正常运行来填充。 对于找到的每个匹配项,显示的状态为: - `[✓] sera bloquée` — 该国家不在 `--autoriser` 中,且将出现在输出文件中 - `[~] autorisée` — 该国家在 `--autoriser` 中或在永久白名单(`us`)中:存在于缓存中,但不包含在输出文件中 示例: ``` === test-ip === cible : 157.90.40.40/18 [i] 1 correspondance(s) dans le cache : 157.90.0.0/16 de Germany [~] autorisée [~] non bloquée — présente dans le cache mais tous les pays sont autorisés ``` ## HAProxy 集成 ``` acl geo_block_ipv4 src -f /etc/blocklists/deny_ipv4_networks.txt acl geo_block_ipv6 src -f /etc/blocklists/deny_ipv6_networks.txt http-request deny if geo_block_ipv4 http-request deny if geo_block_ipv6 ``` ## ipset / iptables 集成 ``` { echo "create bloc-ipv4 hash:net family inet hashsize 65536 maxelem 500000 -exist" while IFS= read -r cidr; do printf 'add bloc-ipv4 %s -exist\n' "$cidr" done < deny_ipv4_networks.txt } > bloc-ipv4.ipset sudo ipset restore < bloc-ipv4.ipset sudo iptables -I INPUT -m set --match-set bloc-ipv4 src -j DROP ``` ## 数据来源 https://www.ipdeny.com/ipblocks/data/aggregated/ 数据来源于区域互联网注册管理机构(ARIN, RIPE NCC, APNIC, AFRINIC, LACNIC)的官方分配。 这些数据代表按国家划分的 RIR 分配,并不一定反映流量的真实来源(BGP, CDN, cloud, Anycast)。 ## 结构 ``` main.go point d'entrée, parsing des flags src/constantes.go URLs, TTL, couleurs, listes de pays src/countries.go table ISO 3166-1 des pays src/pays_helpers.go résolution code → nom de pays src/reseau.go téléchargement HTTP + retry src/cache.go lecture/écriture bbolt src/traitement.go orchestration parallèle, écriture des fichiers src/testip.go implémentation de --test-ip ```
标签:ACL, certspotter, DDoS防御, EVTX分析, GeoIP, Go, HAProxy, ipset, iptables, IPv4, IPv6, IP 地址批量处理, IP过滤, IP黑名单, Linux安全, Linux系统管理, nftables, PowerShell, Ruby工具, Streamlit, 二进制发布, 国家数据库, 威胁情报, 开发者工具, 开源工具, 日志审计, 网络安全, 访问控制, 防火墙, 隐私保护, 黑名单生成器