iptables不支持直接按国家匹配,需通过xtables-addons的xt_geoip模块实现:先下载GeoIPCountryWhois.csv并构建BE/LE二进制库,再加载模块后用--src-cc CN等规则封禁或放行指定国家IP。

iptables 本身不支持直接按国家写规则,比如 -m geoip --src-cc CN 这类功能需要额外加载 xt_geoip 模块,它来自 xtables-addons 工具集。实现的关键是:先获取权威地理IP数据并构建成内核可识别的二进制格式,再通过 iptables 调用该模块匹配来源国家代码。
准备前提与依赖安装
确保系统满足最低要求:iptables ≥ 1.4.5、内核版本 ≥ 3.7(CentOS 7+/Ubuntu 16.04+ 基本都满足)。需安装以下组件:
- 编译工具链:
gcc、make、automake、perl-Text-CSV_XS - 内核头文件:
kernel-devel-$(uname -r) - iptables 开发包:
iptables-devel -
xtables-addons主程序及其内核模块(kmod-xtables-addons)
下载并构建 GeoIP 数据库
不能直接用 MaxMind 的 GeoLite2 或旧版 GeoIP.dat;xt_geoip 只认其专用格式。标准流程如下:
- 执行
/usr/libexec/xtables-addons/xt_geoip_dl自动下载官方 GeoIPCountryWhois.csv(来源为 MaxMind 免费版) - 运行
/usr/libexec/xtables-addons/xt_geoip_build GeoIPCountryWhois.csv生成BE/和LE/两个目录 - 将生成的目录复制到标准路径:
cp -r BE LE /usr/share/xt_geoip/
注意:APNIC 等权威分配数据虽更准确,但 xt_geoip 不支持直接解析 delegations 文件,必须走 CSV 构建流程。
加载模块并配置拦截规则
模块需手动载入一次(重启后失效,建议写入 /etc/rc.local 或 systemd service):
insmod /lib/modules/$(uname -r)/extra/xtables-addons/xt_geoip.ko- 验证是否就绪:
lsmod | grep geoip应有输出 - 封禁中国 IP:
iptables -I INPUT -m geoip --src-cc CN -j DROP - 只允许中国访问(白名单模式):
iptables -A INPUT ! -m geoip --src-cc CN -j DROP
规则顺序很重要,应放在通用 ACCEPT 规则之前;建议搭配 iptables-save > /etc/sysconfig/iptables 持久化(CentOS)或使用 netfilter-persistent(Debian/Ubuntu)。
验证与维护要点
部署后务必测试效果,避免误拦:
- 用境外代理或 VPS 测试能否被拦截(如 ping + curl)
- 检查日志:
iptables -L INPUT -v -n查看规则命中数 - 定期更新数据库:每月运行一次
xt_geoip_dl && xt_geoip_build并重载模块 - 注意局限性:无法识别 IPv6(除非你额外处理)、不覆盖所有 CDN 中转 IP、对 Tor 或代理出口 IP 效果有限










