是否有可能通过所有网络层跟踪数据包Linux内核内部?我知道 SystemTap,但我想看看是否有另一个(更高级别的)解决方案。
我面临的问题如下:我有一台充当路由器的机器,具有多个接口、网桥、具有多个规则的防火墙以及一些使用自定义表的高级路由。一些传入数据包回复不会传递到本地进程(即使我使用 tcpdump 看到它们),并且很难确定它们是否由于路由、防火墙或其他原因而丢失。
我正在寻找一些可以帮助解决这个问题的工具,它可以“跟踪从 abcd 进入接口 X 的数据包”,并生成数据包如何通过网络层传输以及数据包被丢弃、传递或离开的位置的输出系统。类似于 strace,但用于数据包。
有这样的事情存在吗?
答案1
有时,您可以通过探测内核导出到用户空间的统计信息/SNMP 计数器来获取有关 Linux 内核堆栈中数据包遍历的信息。例如,通过“netstat -s”(或者也通过“cat /proc/net/snmp”,这不太容易阅读)。例如,如果由于错误的 IPv4 标头而出现某些错误,则 InHdrErrors 将递增,并且“cat /proc/net/snmp”将显示发生了此错误;查看运行“cat /proc/net/snmp”(称为“InHdrErrors”)时得到的第四列 Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors
如果您查看内核代码,您将看到在 ip_recv() 方法(IPv4 流量的处理程序)中,检查了最小标头长度,或者
IPv4 标头中的版本成员为“4”,如果不是这样,IPSTATS_MIB_INHDRERRORS 计数器就会增加:
看: http://lxr.free-electrons.com/source/net/ipv4/ip_input.c#L444 http://lxr.free-electrons.com/source/net/ipv4/ip_input.c#L494 http://lxr.free-electrons.com/source/include/uapi/linux/snmp.h
当然,还有其他类型的错误,还有 Linux 内核堆栈中数据包正常遍历的 SNMP 计数器/统计信息,您可以在运行“netstat -s”和/或“cat /proc/net”时探索它们/snmp”。
拉米·罗森