iptables本身不支持按国家封ip,因其仅识别ip地址或cidr网段,无法解析地理信息;所谓“按国家封禁”实为先获取该国全部ip段列表(如apnic权威数据),再批量转换为iptables规则或通过ipset高效加载。

为什么 iptables 本身不支持按国家封 IP
iptables 没有内置地理信息识别能力,iptables -s 只认 IP 地址或 CIDR 网段,无法直接写 country=CN 这类条件。所谓“按国家封禁”,本质是:先拿到该国所有已知 IP 段列表,再把这些网段批量转成 iptables -I INPUT -s x.x.x.x/y -j DROP 规则。漏掉网段就等于放行,更新不及时就会失效。
获取准确、可更新的国家 IP 段数据源
别用过时的 cn.zone 或手动爬网页——APNIC 官方发布的 delegated-apnic-latest 是最权威的源头(含 CN/JP/KR/US 等全部 APNIC 管辖区域)。执行以下命令可提取中国 IPv4 段并生成干净列表:
curl -s http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | awk -F\| '$2=="CN" && $3=="ipv4" {printf "%s/%d\n", $4, 32-log($5)/log(2)}' | sort -n > /root/china_ip.list
注意:awk 中的子网掩码换算逻辑必须保留,否则 /24 写成 /32 就会只封单个 IP;输出文件不能带空行或注释,否则后续 ipset 加载会失败。
用 ipset + iptables 实现高效封禁(推荐)
直接往 iptables 里塞几千条 -s 规则会导致匹配变慢、重启丢失、管理困难。正确做法是用 ipset 预加载网段集合,再用一条 iptables 规则引用:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
-
ipset create cnip hash:net—— 创建名为cnip的网段集合(不是 IP 列表) while read net; do ipset add cnip "$net"; done —— 批量导入,跳过非法格式行更稳妥-
iptables -I INPUT -m set --match-set cnip src -j DROP—— 入站流量查表丢弃 - 保存规则:
ipset save cnip > /etc/sysconfig/ipset.cnip,并在系统启动时用ipset restore加载
关键点:hash:net 类型才能存网段;--match-set 必须和 ipset 名称完全一致;规则插入位置(-I vs -A)影响优先级,建议插在最前面。
firewalld 用户别硬套 iptables 命令
CentOS/RHEL 7+ 默认用 firewalld,直接敲 iptables -I 临时有效,但重启 firewalld 或系统后规则消失。正确方式是用 rich rule 绑定 ipset:
firewall-cmd --permanent --ipset=cnip --add-entry="1.0.0.0/24" firewall-cmd --permanent --add-rich-rule='rule source ipset="cnip" reject'
注意:--ipset 必须提前用 firewall-cmd --permanent --new-ipset=cnip --type=hash:net 创建;reject 比 drop 更友好(返回 ICMP 不可达);所有操作后必须 firewall-cmd --reload 生效。
IP 地理围栏真正难的不是加规则,而是持续验证网段有效性、处理 CDN 回源 IP 误杀、以及区分真实用户代理和攻击者出口——这些没法靠一次脚本解决。










