Linux无统一丢包日志,需分层排查:网卡驱动只更新计数器(如ethtool -S的rx_missed_errors、rx_dropped等),iptables DROP需显式配置LOG才写入/var/log/messages或syslog,conntrack满等内核丢包仅出现在dmesg中。

Linux没有统一的“丢包日志”,得按丢包位置分层查
Linux本身不会把每次丢包都记成一行日志写进 /var/log/ 里。所谓“丢包日志”,其实是不同层级出问题时,各自留下的痕迹——网卡驱动不写日志,只更新计数器;iptables 丢包会打到 /var/log/messages 或 /var/log/syslog;而内核 conntrack 满了则直接在 dmesg 里吐错误。指望一个命令或一个文件看到全部丢包记录,注定找不到。
ethtool -S 的 rx_dropped 不等于日志,但它是第一线索
真正反映物理层/驱动层丢包的是这几个字段:rx_missed_errors、rx_dropped、rx_fifo_errors、tx_aborted_errors。它们不是日志,而是寄存器计数,用 ethtool -S eth0 查看。非零且持续增长,说明丢包发生在网卡或驱动,此时:
-
rx_missed_errors高 → ring buffer 溢出,常因 CPU 中断响应慢(比如 IRQ 全挤在 core 0)或负载过高 -
rx_dropped高 → 驱动主动丢弃,可能触发了反向路径验证(rp_filter=1)、校验失败,或某些 Realtek 网卡把 checksum error 也归进这里 -
rx_fifo_errors高 → DMA FIFO 溢出,常见于高吞吐 UDP 场景,和rx_missed_errors常成对出现 -
tx_aborted_errors非零 → 物理链路异常,比如网线松动、双工不匹配、交换机端口故障
注意:ethtool -S 对虚拟网卡(veth、macvlan)、部分 USB 转以太网设备或老旧芯片(如某些 RTL8139)可能返回 No data available,不是你操作错了,是驱动根本没实现这些统计。
iptables DROP 规则真会记日志,但默认不开启
如果你配了 iptables -A INPUT -m statistic --mode random --probability 0.3 -j DROP 这类规则,它不会默默丢包——只要加了 -j LOG,就会往 /var/log/messages(RHEL/CentOS)或 /var/log/syslog(Debian/Ubuntu)里写:
Jun 12 10:23:45 host kernel: [12345.678901] IN=eth0 OUT= MAC=... SRC=192.168.1.100 DST=192.168.1.1 ... DROP
但默认不记。要让它记,得显式插入一条 LOG 链:
- 先加日志规则:
iptables -I INPUT -m state --state INVALID -j LOG --log-prefix "INVALID_PACKET: " - 再跟 DROP:
iptables -I INPUT -m state --state INVALID -j DROP - 确保
sysctl net.netfilter.nf_log.2启用(IPv4 日志模块)
否则,iptables 丢包静默发生,netstat -s 里 UdpInErrors 或 TcpExtListenOverflows 可能升高,但你翻遍 /var/log/ 也看不到对应记录。
内核级丢包(如 conntrack 满、socket buffer 溢出)只报 dmesg,不落磁盘日志
这类丢包最隐蔽:不进 /var/log/,也不更新 ethtool -S,但 dmesg 实时刷屏:
-
nf_conntrack: table full, dropping packet→ 连接跟踪表满,需调net.netfilter.nf_conntrack_max -
UDP: too many orphaned sockets→ UDP socket 泄漏或未 close,内核强制回收 -
Out of memory: Kill process ... (sshd) score ... or sacrifice child→ OOM killer 干掉网络进程,间接导致丢包
dmesg -T | grep -i "drop\|error\|nf_conntrack" 是必查项。注意:dmesg 缓冲区有限,重启后清空,长期监控得靠 rsyslog 把内核消息转存到文件,否则关键线索就丢了。
真正难的不是查哪一行日志,而是判断丢包到底卡在哪一层——网卡计数器不动,netstat -s 却涨得飞快,dmesg 安静如鸡,那大概率是应用读得太慢,socket buffer 溢出了,这时候得看 ss -i 的 rcv_ssthresh 和 rcv_space,而不是翻日志。


















