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, 学习资源, 客户端加密, 网络协议解析, 网络流量分析