学习了 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 部分组成。

  1. XDP: 检查当前网络包是否是 ICMPv4 ECHOREQUEST 网络包。
  2. XDP: 将 ICMPv4 ECHOREQUEST 网络包 redirect 给 AF_XDP。
  3. 用户态应用程序:从 AF_XDP 接收网络包。
  4. 用户态应用程序:将网络包更改为 ICMPv4 ECHOREPLY 网络包。
  5. 用户态应用程序:将网络包从 AF_XDP 发送出去。

详细源代码请查看 GitHub ping-latency-injector

小结

这是一个 AF_XDP 练手工具。

方便后面深挖 AF_XDP 的内核源代码。