多个IP禁止,从文件IP读取 – >在iptables中禁止

我怎么能从文件中读出IP地址,然后禁止在iptables中。

88.123.xxx
123.456.xxx
65.234.xxx

简单,直接,单线解决scheme:

for IP in $(cat ip_list); do iptables -A INPUT -s $IP/32 -d 0/0 -j DROP; done 

这将阻止来自任何协议或端口上的IP地址的任何通信。

但也许你应该考虑使用iptables-saveiptables-restore甚至Shorewall来做一个合适的防火墙脚本。

编辑:同一行,详细:

 for IP in $(cat ip_list); do echo "Banning $IP"; iptables -A INPUT -s $IP/32 -d 0/0 -j DROP; done 

尝试这个

 #!/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 

你也可以使用module ipset( http://ipset.netfilter.org/ )。 当IP地址列表变长时,将它们与各个iptables规则逐一匹配将导致性能降低。 Ipset应该performance得更好。 另外,使用ipset,您可以随时重新加载地址,而无需触摸您的规则。

即使你不想打扰ipset,最好放弃iptables“原始”表中禁止的地址。 这样,连接跟踪框架将不会看到它们,并且不会创build您永远不需要的状态logging。 如果防火墙需要处理大量的stream量,这也应该提高性能。

vadimk说,最好使用ipset和table raw 。 这是你如何做到的

 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