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=ttl=64 time=601.807 ms
1408 bytes from 192.168.1.138: icmp_seq=ttl=64 time=600.700 ms
1408 bytes from 192.168.1.138: icmp_seq=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[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