eBPF Talk: 使用 AF_XDP 注入延時
學習了 AF_XDP 後,一時手癢弄了個 ping-latency-injector
。
ping-latency-injector
它可以用來混淆使用 ping 實現的網絡距離探測;比如注入 100ms 後,ping 得到的延時就會增加 100ms。
所以,對於面向公網的網關而言,不想關閉 ping、又不想別人 ping 真實的網絡距離,就可以用上該工具注入指定延時。而計算真實真實延時,可以用 ping 延時減去指定延時。
小巧又有趣的工具。
編譯並運行
# 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[1]。
小結
這是一個 AF_XDP 練手工具。
方便後面深挖 AF_XDP 的內核源代碼。
參考資料
[1]
GitHub ping-latency-injector: https://github.com/Asphaltt/ping-latency-injector
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Pvgdpzzpa03T6Onat2OlsQ