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。

## 前置条件
- 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, 二进制发布, 国家数据库, 威胁情报, 开发者工具, 开源工具, 日志审计, 网络安全, 访问控制, 防火墙, 隐私保护, 黑名单生成器