我如何从文件中读取 IP 地址,然后在 iptables 中禁止。
88.123.xxx
123.456.xxx
65.234.xxx
答案1
简单、直接、一行解决方案:
for IP in $(cat ip_list); do iptables -A INPUT -s $IP/32 -d 0/0 -j DROP; done
这将阻止来自任何协议或端口的 IP 地址的任何通信。
但也许你应该考虑使用iptables-save
和iptables-restore
甚至做一个适当的防火墙脚本岸墙。
编辑:同一行,详细:
for IP in $(cat ip_list); do echo "Banning $IP"; iptables -A INPUT -s $IP/32 -d 0/0 -j DROP; done
答案2
尝试这个
#!/bin/bash
while read ipaddr
do
/sbin/iptables -I INPUT -s $ipaddr -j DROP
done </path/to/iplist-to-drop | sort | uniq
~
或者使用单独的链
#!/bin/bash
/sbin/iptables -N Dropped-From-File
/sbin/iptables -I INPUT -s 0.0.0.0/0 -j Dropped-From-File
while read ipaddr
do
/sbin/iptables -I Dropped-From-File -s $ipaddr -j DROP
done </path/to/iplist-to-drop | sort | uniq
/sbin/iptables -A Dropped-From-File -j RETURN
答案3
你也可以使用模块 ipset (http://ipset.netfilter.org/)。当 IP 地址列表很长时,逐个匹配单个 iptables 规则会导致性能下降。Ipset 的性能应该会好得多。此外,使用 ipset,您可以随时重新加载地址,而无需触及规则。
即使您不想使用 ipset,最好还是删除 iptables“原始”表中被禁止的地址。这样,连接跟踪框架就不会看到它们,也不会创建您永远不需要的状态记录。如果防火墙必须处理大量流量,这还可以提高性能。
答案4
最好使用ipset
和表raw
,正如 vadimk 所说。以下是操作方法
apt-get install ipset
ipset -N badips iphash
while read ip; do ipset -A badips "$ip"; done < badips.txt
iptables -t raw -I PREROUTING -m set --match-set badips src,dst -j DROP
为了使这些规则在 Debian 7 上重启后仍然有效,我必须使用修改 iptables-persistent
/etc/init.d/iptables-persistent save