学习了 AF_XDP 后,一时手痒弄了个 ping-latency-injector
。
ping-latency-injector
它可以用来混淆使用 ping 实现的网络距离探测;比如注入 100ms 后,ping 得到的延时就会增加 100ms。
所以,对于面向公网的网关而言,不想关闭 ping、又不想别人 ping 真实的网络距离,就可以用上该工具注入指定延时。而计算真实真实延时,可以用 ping 延时减去指定延时。
小巧又有趣的工具。
编译并运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# git clone git@github.com:Asphaltt/ping-latency-injector.git
# cd ping-latency-injector
# go generate && go build
# ./ping-latency-injector -h
Usage of ./ping-latency-injector:
-D, --dev string device to inject latency to ping
-L, --lat string latency to delay, 1ms <= latency <= 10s (default "1ms")
pflag: help requested
# ./ping-latency-injector -D enp0s8 -L 600ms
2023/03/12 16:01:37 Attached XDP to enp0s8
# echo 在另一台主机上 ping
# ping -s 1400 -c3 192.168.1.138
PING 192.168.1.138 (192.168.1.138): 1400 data bytes
1408 bytes from 192.168.1.138: icmp_seq=0 ttl=64 time=601.807 ms
1408 bytes from 192.168.1.138: icmp_seq=1 ttl=64 time=600.700 ms
1408 bytes from 192.168.1.138: icmp_seq=2 ttl=64 time=601.272 ms
--- 192.168.1.138 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 600.700/601.260/601.807/0.452 ms
|
工作原理
没错,ping-latency-injector
由 XDP、AF_XDP 和用户态应用程序 3 部分组成。
- XDP: 检查当前网络包是否是 ICMPv4 ECHOREQUEST 网络包。
- XDP: 将 ICMPv4 ECHOREQUEST 网络包 redirect 给 AF_XDP。
- 用户态应用程序:从 AF_XDP 接收网络包。
- 用户态应用程序:将网络包更改为 ICMPv4 ECHOREPLY 网络包。
- 用户态应用程序:将网络包从 AF_XDP 发送出去。
详细源代码请查看 GitHub ping-latency-injector。
小结
这是一个 AF_XDP 练手工具。
方便后面深挖 AF_XDP 的内核源代码。