如何列出被iptables阻止的IP地址?


16

为了防止针对ssh的暴力攻击,我添加了一些iptables规则(如下)。问题是:如何列出被阻止的IP地址?

(1)
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

1
iptables -L INPUT -v -n显示所有被阻止的ip
动态的

Answers:


16

一种选择是使用以下规则记录您丢弃的任何数据包:

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl -j LOG --log-prefix "FW_DROPPED: "

将其立即插入DROP规则之前。然后,您可以grep syslog文件中包含“ FW_DROPPED”的任何内容,并且IP列表将在其中。日志文件中的条目如下所示:

Jun  3 08:05:57 some-machine kernel: [15852451.420557] FW_DROPPED: IN=eth0 OUT= MAC=00:50:ba:4a:d9:e3:00:12:17:3a:e3:64:08:00 SRC=228.23.45.189 DST=192.168.1.1 LEN=48 TOS=0x00 PREC=0x00 TTL=106 ID=10941 PROTO=TCP SPT=58212 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0

因此,截取“ SRC =“之后的内容将显示已删除的IP。排序,消除重复,您将得到列表。

我发现“ iptables教程”是iptables / netfilter的最有用的文档。


是的,这是这样做的方法。
布伦特

这将需要您重复规则,因为您无需登录并放入同一规则。
David Pashley 09年

3
如果他创建一个用户链来记录并丢弃有问题的数据包,那就更好了。通过这样做,不必要的重复被删除。可以这样完成:iptables -N攻击;iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m最近--update --seconds 60 --hitcount 8 --rttl --name SSH -j攻击; iptables -A Attacks -j LOG --log-prefix“ FW_DROPPED:”; iptables -A攻击-j DROP
Cristian Ciupitu 09年

1
同意 表/链是必经之路;iptables的全部要点,真的。我为接受,静默掉落,可听见拒绝,丢弃,可疑洪水,非法,可疑探测,可疑扫描,未知类型和监视流量创建了单独的表格。我FWS都是基于这个老脚本(警告:自我推销):code.google.com/p/klondike-firewall/source/browse/trunk/...
yukondude

1
ipozgaj和David Pashley引用的ipt_recent模块是一个很不错的添加,尽管它不能提供相同的详细原因来丢弃特定IP(因为您可以使用不同的--log-prefix设置)或跟踪具有时间戳记的攻击历史悠久。绝对可以同时使用这两种技术。
yukondude


4

看着

/proc/net/ipt_recent/YOURNAME

其中YOURNAME是您在iptables规则中与--name选项一起使用的名称。


在某些发行版(例如Debian)上,有效路径为:/proc/net/xt_recent/[list-name]
itachi


1

例如,对于输入地址欺骗,我要做的是定义链SPOOF_REJECT

iptables -N SPOOF_REJECT
iptables -A SPOOF_REJECT -j LOG --log-prefix "Input spoof detected: "
iptables -A SPOOF_REJECT -j REJECT

然后,如果数据包被欺骗,则将其发送到该链:

iptables -A INPUT -i $EXT_DEV1 -s $INT_NET -j SPOOF_REJECT
iptables -A INPUT -i $EXT_DEV2 -s $INT_NET -j SPOOF_REJECT

您可以对丢弃或拒绝的每种类型的数据包执行类似的操作,以在系统日志中找到一行,然后定期进行grep,剪切,排序,以仅从这些日志行中获取IP地址。

对每个类别使用单独的链的好处在于,您的配置变得更加简单明了,并且易于阅读iptables配置。随着您添加越来越多的规则,您会很高兴将各个链用于特定的不同操作。


您究竟如何检测到欺骗性数据包?以我的经验,这在一般情况下是不可能的。
MarkR

以上仅是示例。在这里,我正在寻找到达INPUT链的任何数据包,这些数据包来自外部设备,但声称来自网络内部的IP地址。在这种情况下,我可以绝对检测到地址欺骗,但是可以,在一般情况下情况有所不同。
Eddie

1

“问题是:如何列出被阻止的IP地址?”

创建一个BANNED链:

iptables -N BANNED
iptables -F BANNED

创建一个日志链:

iptables -N BANNEDLOG
iptables -F BANNEDLOG
iptables -A BANNEDLOG -j LOG --log-prefix "BANNED:" --log-level 6
iptables -A BANNEDLOG -j DROP

在其他大多数规则之前,在INPUT链中添加跳转到禁止链

...
iptables -A INPUT -j BANNED
...

现在将ipaddresses添加到被禁止的链中:

flock -w 5 /var/lock/iptables -c 'iptables -A BANNED -s 140.130.20.202/32 -i eth0 -m comment --comment "2012-03-19 23:49:33 accesslog" -j BANNEDLOG'
etc...

您还可以像使用带注释选项的数据库一样使用它,因此您可以知道何时,为什么等等。当iptables被许多进程频繁更新时,flock很重要-看来iptables并未内置任何锁定。

要查看禁止链中的禁止地址和规则:

iptables -S BANNED

要查看刚刚排序的唯一ipaddress,请执行以下操作:

iptables -S BANNED | egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -u

我的服务器上运行着许多守护进程,用于检查syslog文件和Weblog,因此,如果任何人尝试进行任何令人讨厌的操作,则其地址将被自动禁止几天,具体取决于类型,严重性和以前的攻击次数。该信息已登录到mysql数据库,并定期过期。该地址还通过mysql复制分发到群集中的所有其他计算机,因此它们也受到保护并保持同步。我的软件还查询网络的所有者,并将投诉邮寄到ISP。

经过10年的工作,我希望将其提供给所有人,以供尽快使用。我目前有大约150万个ip地址历史记录,并报告了数十万封邮件和ssh攻击,有助于清理网络。如果更多的人会使用它,那么我希望它将产生更大的影响。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.