iptables 日志输出?

iptables 日志输出?

我发现使用 iptables 我们可以记录某些数据包。 Linux 中的日志记录发生在哪里?我应该检查哪个文件的日志?

iptables -A INPUT -i wlan0 -p tcp --syn -s 10.0.0.1 -j ACCEPT 

答案1

您问题中的命令iptables -A INPUT -i wlan0 -p tcp --syn -s 10.0.0.1 -j ACCEPT未指定任何日志记录。但是每个 iptables 规则都包含用于匹配数据包的数据包和字节计数器,因此在执行此命令之后,您可以运行,并查看自规则创建或上次重置以来通过源 IP 地址 10.0.0.1 的接口iptables -L -vn到达的 TCP SYN 数据包的数量wlan0iptables 规则计数器的数量(以最新的为准)。

如果使用-j LOGiptables 目标,匹配的数据包将记录在内核日志中。可以使用以下命令查看最新的内核日志消息dmesg;通常,内核日志消息也会由您的 Linux 发行版使用的任何日志系统记录。

使用经典syslog风格的日志记录,我希望通常在/var/log/messages(RHEL 风格的系统日志配置)或/var/log/kern.log(Debian 风格的系统日志配置)中看到内核日志消息。

在用作systemd-journald主要日志系统的发行版上,journalctl _TRANSPORT=kernel应输出当前存储的所有内核日志消息journald

--log-prefix您可以选择使用带有 的选项来指定最多 29 个字母的自定义消息前缀iptables ... -j LOG。日志消息是相当长的行,如下所示(为了\便于阅读,分为多行):

<timestamp> <hostname> kernel: [optional-prefix]IN=<incoming-interface> OUT=<outgoing-interface> \ 
    MAC=<destination MAC address>:<source MAC address>:<ethertype/length> \
    SRC=<source IP address> DST=<destination IP address> LEN=<packet length> \
    TOS=<type-of-service value> PREC=<precedence value> TTL=<packet time-to-live value> \
    ID=<ID field value/fragment ID> PROTO=<protocol> <protocol-specific information...>

IN=和字段OUT=将出现,但如果不适用则为空:记录在INPUT过滤器链中的包将仅具有IN=指定的接口, 和分别OUTPUT仅在链中OUT=;记录在链中的数据包FORWARD将填写这两个字段。

例如,记录的传入 TCP SYN 数据包的日志行-j LOG --log-prefix "custom-prefix:"可能如下所示:

Dec 08 12:00:00 hostname.example kernel: custom-prefix:IN=eth0 OUT= \
    MAC=11:22:33:44:55:66:aa:bb:cc:dd:ee:ff:08:00 SRC=192.0.2.2 DST=192.168.0.1 LEN=40 TOS=0x00 \
    PREC=0x00 TTL=232 ID=12345 PROTO=TCP SPT=54321 DPT=22 WINDOW=1023 RES=0x00 SYN URGP=0

如果您希望 iptables 日志与其他内核日志消息分开,您可以设置ulogd(版本 2.x 或更高版本),然后使用iptables ... -j NFLOG.在非常古老的内核上,您可能还会看到-j ULOG,但这已被弃用,现在应该成为古老的历史。

相关内容