我发现使用 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 数据包的数量wlan0
iptables 规则计数器的数量(以最新的为准)。
如果使用-j LOG
iptables 目标,匹配的数据包将记录在内核日志中。可以使用以下命令查看最新的内核日志消息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
,但这已被弃用,现在应该成为古老的历史。