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

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

我如何从文件中读取 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-saveiptables-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

相关内容