不推荐直接用 xargs 配合 iptables 批量封 IP,因其每 IP 新增一条规则导致性能下降、无法动态管理、不支持大批量添加且重启失效;推荐用 xargs + ipset:先创建集合,再批量导入 IP,最后用单条 iptables 规则引用集合,并持久化保存。

直接用 xargs 配合 iptables 批量封 IP 是可行的,但**不推荐用于大量 IP(比如上百条以上)**——因为每条 iptables -A INPUT -s x.x.x.x -j DROP 都会新增一条独立规则,规则链变长后性能下降明显,且无法动态管理。
为什么不用纯 xargs + iptables?
iptables 本身不支持“一次添加多个源 IP”的原生语法(虽然能用 -s ip1,ip2,ip3,但最多只支持 15 个,且不能混用 CIDR)。更重要的是:
- 每加一个 IP 就多一条规则,1000 个 IP = 1000 条规则,匹配效率线性下降
- 删除某个 IP 得逐条找编号再删,无法批量剔除或临时禁用
- 规则不持久,重启后丢失(除非手动保存)
真正高效的做法:xargs + ipset(推荐)
把 xargs 当作“管道搬运工”,把解析出的 IP 交给 ipset 批量注入集合,再用一条 iptables 规则引用整个集合。这才是生产环境标准流程:
yum install ipset(CentOS/RHEL)或 apt-get install ipset(Debian/Ubuntu)
sudo ipset create blacklist hash:ip maxelem 100000
(hash:ip 表示存单个 IP;maxelem 设大些防溢出)
假设你已有恶意 IP 列表文件 badips.txt(每行一个 IP):
cat badips.txt | xargs -I {} sudo ipset add blacklist {}
或更健壮写法(跳过空行/非法格式):
grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' badips.txt | xargs -r -I {} sudo ipset add blacklist {} 2>/dev/null
sudo iptables -I INPUT -m set --match-set blacklist src -j DROP
(-I 插入最前,确保优先拦截;src 匹配源 IP)
sudo ipset save blacklist > /etc/sysconfig/ipset-blacklistsudo iptables-save > /etc/sysconfig/iptables
(路径因系统而异,CentOS 7+ 常用 /etc/sysconfig/;Ubuntu 可用 netfilter-persistent)
附:如果坚持用纯 xargs + iptables(仅限少量 IP)
例如封 10 个以内明确 IP:
printf "%s\n" 1.1.1.1 2.2.2.2 3.3.3.3 | xargs -I {} sudo iptables -A INPUT -s {} -j DROP
⚠️ 注意:-A 追加在链尾,若前面有 ACCEPT 规则可能被绕过;务必确认策略和顺序。

















