如何将 Linux iptables 防火墙丢弃的数据包记录到日志文件中

本文是我们正在进行的 Linux iptables 系列文章的一部分。 当我们的 iptables 规则没有按预期工作时,我们可能需要记录 iptables 丢弃的数据包来进行故障排除。 本文介绍如何记录传入和传出丢弃的防火墙数据包。

如果我们是 iptables 的新手,请先熟悉 iptables 的基本概念。


记录所有丢弃的输入数据包

首先,我们需要了解如何将所有丢弃的 iptables 输入数据包记录到 syslog。

如果我们已经有一大堆 iptables 防火墙规则,请将它们添加到底部,这会将所有丢弃的输入数据包(传入)记录到 /var/log/messages

$ iptables -N LOGGING
$ iptables -A INPUT -j LOGGING
$ iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
$ iptables -A LOGGING -j DROP

在上面的示例中,它执行以下操作:

  • iptables -N LOGGING:创建一个名为LOGGING的新链
  • iptables -A INPUT -j LOGGING:所有剩余的传入数据包都会跳转到LOGGING链
  • 第 3 行:将传入数据包记录到 syslog (/var/log/messages)。下面详细解释这条线。
  • iptables -A LOGGING -j DROP:最后,丢弃所有到达 LOGGING 链的数据包。即现在它真的丢弃了传入的数据包。

在上面的第 3 行中,它具有以下用于记录丢弃数据包的选项:

  • -m limit:这使用限制匹配模块。使用它,您可以使用 –limit 选项限制日志记录。
  • –limit 2/min:这表示日志记录的最大平均匹配率。在此示例中,对于类似的数据包,它将记录限制为每分钟 2 个。我们还可以指定 2/秒、2/分钟、2/小时、2/天。当我们不想将日志消息与相同丢弃数据包的重复消息混淆时,这很有帮助。
  • -j LOG:表示这个包的目标是LOG。即写入日志文件。
  • –log-prefix “IPTables-Dropped:” 我们可以指定任何日志前缀,该前缀将附加到将写入 /var/log/messages 文件的日志消息中
  • –log-level 4 这是标准的系统日志级别。四是警告。我们可以使用 0 到 7 范围内的数字。0 是紧急情况,7 是调试。

记录所有丢弃的传出数据包

这与上面相同,但下面的第二行有 OUTPUT 而不是 INPUT

iptables -N LOGGING
iptables -A OUTPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP

记录所有丢弃的数据包(传入和传出)

这与之前相同,但我们将从前两个示例中获取第 2 行,并将其添加到此处。 即我们将为 INPUT 和 OUTPUT 设置一个单独的行,它将跳转到 LOGGING 链。

要记录传入和传出丢弃的数据包,请在现有 iptables 防火墙规则的底部添加以下行。

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A OUTPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A LOGGING -j DROP

此外,正如我们之前解释的,默认情况下,iptables 将使用 /var/log/messages 来记录所有消息。 如果我们想将此更改为自己的自定义日志文件,请将以下行添加到 /etc/syslog.conf

kern.warning   /var/log/custom.log

如何阅读 iptables 日志

以下是丢弃传入和传出数据包时在 /var/log/messages 中记录的行示例。

Aug  4 13:22:40 centos kernel: IPTables-Dropped: IN= OUT=em1 SRC=192.168.1.23 DST=192.168.1.20 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=59228 SEQ=2
Aug  4 13:23:00 centos kernel: IPTables-Dropped: IN=em1 OUT= MAC=a2:be:d2:ab:11:af:e2:f2:00:00 SRC=192.168.2.115 DST=192.168.1.23 LEN=52 TOS=0x00 PREC=0x00 TTL=127 ID=9434 DF PROTO=TCP SPT=58428 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0

在上面的输出中:

  • IPTables-Dropped:这是我们通过指定 –log-prefix 选项在日志记录中使用的前缀
  • IN=em1 这表示用于此传入数据包的接口。 对于传出的数据包,这将为空
  • OUT=em1 这表示用于传出数据包的接口。 对于传入的数据包,这将为空。
  • SRC= 数据包起源的源 IP 地址
  • DST= 数据包发送到的目标 IP 地址
  • LEN= 数据包长度
  • PROTO= 表示协议(如上图,第一行是传出的ICMP协议,第二行是传入的TCP协议)
  • SPT= 表示源端口
  • DPT= 表示目的端口。 在上面的第 2 行中,目的端口是 443。这表示传入的 HTTPS 数据包被丢弃