S3Stellar/udp-packet-inspector

GitHub: S3Stellar/udp-packet-inspector

一个用 C 语言编写的单文件 Linux UDP 流量检查器,通过 AF_PACKET 原始套接字逐层解析数据包,帮助开发者从底层学习网络协议栈。

Stars: 0 | Forks: 0

# udp-packet-inspector 一个用于 Linux 的小型、单文件 UDP 流量检查器。它打开一个 `AF_PACKET` 原始套接字,依次解析 **Ethernet → IPv4 → UDP**,并为每个数据包打印一行 tcpdump 风格的 信息。它的构建初衷是为了从底层学习网络协议栈,而不是为了 替代 tcpdump。 ``` 21:14:08.402117 UDP 192.168.1.42:51322 -> 1.1.1.1:53 len=44 ttl=64 21:14:08.418664 UDP 1.1.1.1:53 -> 192.168.1.42:51322 len=68 ttl=57 21:14:09.001003 UDP 192.168.1.42:5353 -> 224.0.0.251:5353 len=187 ttl=255 ``` ## 构建 ``` make ``` ## 运行 ``` # 所有内容 sudo ./udp-inspector # 仅 DNS 流量,在 20 次匹配后停止 sudo ./udp-inspector --port 53 --count 20 # 同时以十六进制格式 dump 前 64 个 payload 字节 sudo ./udp-inspector --port 53 --hex ``` 需要 `CAP_NET_RAW` 权限。最简单的方法是使用 `sudo`。如果不想使用 `sudo` 运行: ``` sudo setcap cap_net_raw=ep ./udp-inspector ./udp-inspector ``` ## 为什么开发它 这是一个练习项目。解析路径中标注了每个头部 包含的字节数,因此从代码中就能直观地看出协议布局: | 层级 | 头部 | 大小 | 此处使用的关键字段 | |------:|:-------|:----:|:--------------------| | L2 | Ethernet II (RFC 894) | 14 B | `ethertype == 0x0800` → IPv4 | | L3 | IPv4 (RFC 791) | `ihl * 4` B | `protocol == 17` → UDP | | L4 | UDP (RFC 768) | 8 B | `src_port`, `dst_port`, `len` | 整个项目仅由一个 `udp-inspector.c` 和一个 Makefile 组成,因此读取路径 非常简短:`main → recv → parse_and_print → printers`。 ## 限制(刻意为之) - **仅支持 IPv4。** 没有 IPv6 路径;添加该路径意味着需要处理 `0x86DD` 并 解析 IPv6 的 next-header 链。这超出了作为学习工具的范围。 - **没有 BPF。** 过滤在用户空间进行(对于学习工具来说成本很低,但在高线速下开销很大)。一个真正的检查器会通过 `SO_ATTACH_FILTER` 将端口过滤器推送到内核中。 - **不支持选择网络接口。** 会捕获所有接口上的数据包。如果需要,可以使用 `SO_BINDTODEVICE` 绑定特定的接口。 - **不支持 IPv4 分片。** 仅显示第一个分片;后续的分片 将被忽略。 ## 许可证 MIT。详见 [LICENSE](./LICENSE)。
标签:AF_PACKET, UDP, 学习资源, 客户端加密, 网络协议解析, 网络流量分析