ΠΠ΄ΡΠ°Π²ΠΎ, Π₯Π°Π±Ρ! ΠΠ΅ ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΡΠ²Π°ΠΌΠ΅ ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ·Π΄Π°Π²Π°ΡΠ΅β.
ΠΠΈΠ΄Π΅ΡΡΠΈ Π²ΠΈΡΡΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° BPF ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΡΠ²Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π²ΠΎ ΠΏΡΠ°ΠΊΡΠ°, Π½ΠΈΠ΅ Π²ΠΈ ΠΏΡΠ΅Π²Π΅Π΄ΠΎΠ²ΠΌΠ΅ ΡΡΠ°ΡΠΈΡΠ° Π²ΠΎ ΠΊΠΎΡΠ° ΡΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°Π°Ρ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΡΠ΅ Π³Π»Π°Π²Π½ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½Π°ΡΠ° ΡΠΎΡΡΠΎΡΠ±Π°.
ΠΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈΡΠ΅ Π°Π»Π°ΡΠΊΠΈ ΠΈ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈ ΡΡΠ°Π½Π°Π° ΡΓ¨ ΠΏΠΎΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΈ Π·Π° Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠ΅Π½Π·ΠΈΡΠ°Π°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ°ΡΠ° Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π½Π° Linux Π²ΠΎ ΡΠ»ΡΡΠ°ΠΈ ΠΊΠΎΠ³Π° Π΅ ΠΏΠΎΡΡΠ΅Π±Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΠΎ Π²ΠΈΡΠΎΠΊΠΈ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈ. ΠΠ΄Π½Π° ΠΎΠ΄ Π½Π°ΡΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΈΡΠ΅ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈ ΠΎΠ΄ ΠΎΠ²ΠΎΡ Π²ΠΈΠ΄ ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π° Π±Π°ΡΠΏΠ°Ρ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ (Π±Π°ΡΠΏΠ°Ρ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ) ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°, Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΡΠ²Π°ΡΡΠΈ Π³ΠΎ ΠΌΡΠ΅ΠΆΠ½ΠΈΠΎΡ ΡΠ»ΠΎΡ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ, Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ ΡΠ΅Π»Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ. ΠΠ°ΠΎΠ±ΠΈΠΊΠΎΠ»ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° ΠΌΡΠ΅ΠΆΠ½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ° ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ. Π‘ΠΎ Π΄ΡΡΠ³ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ, ΠΊΠΎΠ³Π° ΡΠ°Π±ΠΎΡΠΈΠΌΠ΅ ΡΠΎ ΠΌΡΠ΅ΠΆΠ½Π° ΠΊΠ°ΡΡΠΈΡΠΊΠ°, ΡΠ΅ ΠΏΠΎΡΠΏΠΈΡΠ°ΠΌΠ΅ Π½Π° Π²ΠΎΠ·Π°ΡΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ.
ΠΡΠ΅Π½Π΅ΡΡΠ²Π°ΡΡΠΈ ΡΠ° ΡΠ΅Π»ΠΎΡΠ½Π°ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»Π° Π½Π° ΠΌΡΠ΅ΠΆΠ½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΡΠΊΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ, Π³ΠΈ Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΠΌΠ΅ ΡΡΠΎΡΠΎΡΠΈΡΠ΅ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ (ΠΏΡΠ΅ΡΡΠ»ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΌΡΠ΅ΠΆΠ½ΠΈΠΎΡ ΡΠ»ΠΎΡ, ΠΏΡΠ΅ΠΊΠΈΠ½ΠΈ ΠΈΡΠ½.), ΡΡΠΎ Π΅ Π΄ΠΎΡΡΠ° Π²Π°ΠΆΠ½ΠΎ ΠΊΠΎΠ³Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ Π±ΡΠ·ΠΈΠ½ΠΈ ΠΎΠ΄ 10 Gb/s ΠΈΠ»ΠΈ ΠΏΠΎΠ²ΠΈΡΠΎΠΊΠΈ. ΠΠ°ΡΠΏΠ°Ρ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΏΠ»ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΠ° ΠΎΠ΄ Π΄ΡΡΠ³ΠΈ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ (ΡΠ΅ΡΠΈΡΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°) ΠΈ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π΅ΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΈΠ·Π²Π΅Π΄Π±Π°ΡΠ° (ΠΠ£ΠΠ ΡΠΌΠ΅ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ, ΠΠ·ΠΎΠ»Π°ΡΠΈΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΎΡ, ΠΈΡΠ½.) ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° ΠΎΡΠ½ΠΎΠ²ΠΈΡΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎ Π²ΠΈΡΠΎΠΊΠΈ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈ Π²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ. ΠΠΎΠΆΠ΅Π±ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΎΠ²ΠΎΡ Π½ΠΎΠ² ΠΏΡΠΈΡΡΠ°ΠΏ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π΅
ΠΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠ½ΠΈΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠΈ Π²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π½Π° Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠΈ:
- ΠΠ°Π΄ΡΠΎΡΠΎ Π½Π° ΠΠ‘ Π΅ ΡΠ»ΠΎΡ Π·Π° Π°ΠΏΡΡΡΠ°ΠΊΡΠΈΡΠ° Π·Π° Ρ Π°ΡΠ΄Π²Π΅ΡΡΠΊΠΈ ΡΠ΅ΡΡΡΡΠΈ. ΠΠΈΠ΄Π΅ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ ΡΡΠ΅Π±Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°Π°Ρ ΡΠΎ Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ, ΡΠΈΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΠΏΡΠ°Π²ΡΠ²Π°Π°Ρ ΡΠΎ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈΠΎΡ Ρ Π°ΡΠ΄Π²Π΅Ρ. ΠΠ²Π° ΡΠ΅ΡΡΠΎ Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°ΡΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈ Π΄ΡΠ°ΡΠ²Π΅ΡΠΈ.
- ΠΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅Π»ΠΎΡΠ½ΠΎ ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΡΠ²Π°ΠΌΠ΅ ΠΎΠ΄ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ, ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΡΠ²Π°ΠΌΠ΅ ΠΈ ΠΎΠ΄ ΡΠ΅ΡΠ° ΠΌΡΠ΅ΠΆΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° ΠΎΠ΄ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ ΠΌΠΎΡΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Π±ΠΈ Π²Π΅ΡΠ΅ ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ΠΈ ΠΎΠ΄ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ.
- ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Ρ Π²ΠΎ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΠΏΠ΅ΡΠΎΠΊ, ΡΡΠΎ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎ ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π° Π½ΠΈΠ²Π½Π°ΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΠΈ Π³ΠΈ ΡΠΏΡΠ΅ΡΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π°Ρ ΡΠΎ Π΄ΡΡΠ³ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ.
ΠΠΎ ΡΡΡΡΠΈΠ½Π°, ΠΏΡΠΈ Π²ΠΌΡΠ΅ΠΆΡΠ²Π°ΡΠ΅ Π²ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ, ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈΠ²ΠΊΠΈΡΠ΅ ΠΎΠ΄ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½ΡΠ²Π°Π°Ρ ΡΠΎ ΠΏΡΠ΅ΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΠ΄ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π΄ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ. XDP Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠΊΠΌΡ ΡΠΏΡΠΎΡΠΈΠ²Π½ΠΎΡΠΎ: Π³ΠΈ ΠΏΡΠ΅ΠΌΠ΅ΡΡΡΠ²Π° ΠΌΡΠ΅ΠΆΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ (ΡΠΈΠ»ΡΡΠΈ, ΡΠ΅Π·ΠΎΠ»ΡΡΠΎΡΠΈ, ΡΡΡΠΈΡΠ°ΡΠ΅, ΠΈΡΠ½.) Π²ΠΎ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ. XDP Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ ΠΌΡΠ΅ΠΆΠ½Π° ΡΡΠ½ΠΊΡΠΈΡΠ° Π²Π΅Π΄Π½Π°Ρ ΡΡΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΡ Π³ΠΎ ΠΏΠΎΠ³ΠΎΠ΄ΠΈ ΠΌΡΠ΅ΠΆΠ½ΠΈΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ ΠΈ ΠΏΡΠ΅Π΄ Π΄Π° ΠΏΠΎΡΠ½Π΅ Π΄Π° ΡΠ΅ Π΄Π²ΠΈΠΆΠΈ Π½Π°Π³ΠΎΡΠ΅ Π²ΠΎ ΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΡ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ. ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π°. ΠΠ΅ΡΡΡΠΎΠ°, ΠΊΠ°ΠΊΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΌΡ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π΄Π° Π³ΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π²ΠΎ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ? ΠΡΠ΅Π΄ Π΄Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΈΠΌΠ΅ Π½Π° ΠΎΠ²Π° ΠΏΡΠ°ΡΠ°ΡΠ΅, Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΡΡΠΎ Π΅ BPF.
BPF ΠΈ eBPF
Π ΠΏΠΎΠΊΡΠ°Ρ Π·Π±ΡΠ½ΡΠ²Π°ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅, BPF (Berkeley Packet Filtering) Π΅ Π²ΡΡΡΠ½ΠΎΡΡ ΠΌΠΎΠ΄Π΅Π» Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. ΠΠ²Π°Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΠΏΡΠ²ΠΈΡΠ½ΠΎ Π±Π΅ΡΠ΅ Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°Π½Π° Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π° ΡΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΏΠ° ΠΎΡΡΡΠΊΠ° ΠΈ ΠΈΠΌΠ΅ΡΠΎ.
ΠΠ΄Π½Π° ΠΎΠ΄ Π½Π°ΡΠΏΠΎΠ·Π½Π°ΡΠΈΡΠ΅ Π°Π»Π°ΡΠΊΠΈ ΠΊΠΎΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ BPF Π΅ tcpdump
. ΠΠΎΠ³Π° ΡΠ°ΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ tcpdump
ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°Π²Π΅Π΄Π΅ ΠΈΠ·ΡΠ°Π· Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ. Π‘Π°ΠΌΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΡΡΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° ΠΎΠ²ΠΎΡ ΠΈΠ·ΡΠ°Π· ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π·Π°ΡΠΎΠ±Π΅Π½ΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ·ΡΠ°Π·ΠΎΡ βtcp dst port 80
β ΡΠ΅ ΠΎΠ΄Π½Π΅ΡΡΠ²Π° Π½Π° ΡΠΈΡΠ΅ TCP ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΠΎΠΈ ΠΏΡΠΈΡΡΠΈΠ³Π½ΡΠ²Π°Π°Ρ Π½Π° ΠΏΠΎΡΡΠ°ΡΠ° 80. ΠΠΎΠΌΠΏΠ°ΡΠ»Π΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΡΠΊΡΠ°ΡΠΈ ΠΎΠ²ΠΎΡ ΠΈΠ·ΡΠ°Π· ΡΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ BPF Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄.
$ sudo tcpdump -d "tcp dst port 80"
(000) ldh [12]
(001) jeq #0x86dd jt 2 jf 6
(002) ldb [20]
(003) jeq #0x6 jt 4 jf 15
(004) ldh [56]
(005) jeq #0x50 jt 14 jf 15
(006) jeq #0x800 jt 7 jf 15
(007) ldb [23]
(008) jeq #0x6 jt 9 jf 15
(009) ldh [20]
(010) jset #0x1fff jt 15 jf 11
(011) ldxb 4*([14]&0xf)
(012) ldh [x + 16]
(013) jeq #0x50 jt 14 jf 15
(014) ret #262144
(015) ret #0
ΠΠ²Π° Π΅ ΠΎΠ½Π° ΡΡΠΎ Π³ΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π²ΠΎ ΠΎΡΠ½ΠΎΠ²Π° Π³ΠΎ ΠΏΡΠ°Π²ΠΈ:
- Π£ΠΏΠ°ΡΡΡΠ²ΠΎ (000): ΠΠΎ Π²ΡΠΈΡΡΠ²Π° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ ΡΠΎ ΠΏΠΎΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅ 12, ΠΊΠ°ΠΊΠΎ 16-Π±ΠΈΡΠ΅Π½ Π·Π±ΠΎΡ, Π²ΠΎ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ. ΠΡΡΠ΅Ρ 12 ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π½Π° Π΅ΡΠ΅ΡΡΠΈΠΏΠΎΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ.
- ΠΠ½ΡΡΡΡΠΊΡΠΈΡΠ° (001): ΡΠ° ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° Π²ΠΎ Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΎΡ ΡΠΎ 0x86dd, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΡΠΎ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° Π½Π° Π΅ΡΠ΅ΡΡΠΈΠΏΠΎΡ Π·Π° IPv6. ΠΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ Π΅ ΡΠΎΡΠ΅Π½, ΡΠΎΠ³Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈΠΎΡ Π±ΡΠΎΡΠ°Ρ ΠΎΠ΄ΠΈ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠ°ΡΠ° (002), Π° Π°ΠΊΠΎ Π½Π΅, ΡΠΎΠ³Π°Ρ Π½Π° (006).
- Π£ΠΏΠ°ΡΡΡΠ²ΠΎ (006): ΡΠ° ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° ΡΠΎ 0x800 (Π΅ΡΠ΅ΡΡΠΈΠΏ Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π·Π° IPv4). ΠΠΊΠΎ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΎΡ Π΅ ΡΠΎΡΠ΅Π½, ΡΠΎΠ³Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΎΠ΄ΠΈ Π½Π° (007), Π°ΠΊΠΎ Π½Π΅, ΡΠΎΠ³Π°Ρ Π½Π° (015).
Π ΡΠ°ΠΊΠ° Π½Π°ΡΠ°ΠΌΡ Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π΅ Π²ΡΠ°ΡΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ. ΠΠ²Π° Π΅ ΠΎΠ±ΠΈΡΠ½ΠΎ ΠΡΠ»ΠΎΠ²Π°. ΠΡΠ°ΡΠ°ΡΠ΅ΡΠΎ Π½Π΅-Π½ΡΠ»ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠ° (014)) Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ Π΅ ΠΏΡΠΈΡΠ°ΡΠ΅Π½, Π° Π²ΡΠ°ΡΠ°ΡΠ΅ΡΠΎ Π½ΡΠ»ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠ° (015)) Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ Π½Π΅ Π±ΠΈΠ» ΠΏΡΠΈΡΠ°ΡΠ΅Π½.
ΠΠΈΡΡΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° BPF ΠΈ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΠΎΡ Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ Π±Π΅Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈ ΠΎΠ΄ Π‘ΡΠΈΠ² ΠΠ΅ΠΊΠΠ΅Π½ ΠΈ ΠΠ°Π½ ΠΠ΅ΡΠΊΠΎΠ±ΡΠΎΠ½ ΠΊΠΎΠ½ ΠΊΡΠ°ΡΠΎΡ Π½Π° 1992 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΊΠΎΠ³Π° Π½ΠΈΠ²Π½ΠΈΠΎΡ ΡΡΡΠ΄ Π±Π΅ΡΠ΅ ΠΎΠ±ΡΠ°Π²Π΅Π½
ΠΠΈΠ΄Π΅ΡΡΠΈ BPF Π΅ Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° ΠΎΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ° Π²ΠΎ ΠΊΠΎΡΠ° ΡΠ°Π±ΠΎΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅. ΠΠΎΠΊΡΠ°Ρ Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ΠΎΡ, ΡΠΎΡ Π³ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π½Π° ΡΠ΅ΡΠΈΡΠΊΠ° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π·Π° Π²ΡΠΈΡΡΠ²Π°ΡΠ΅ ΡΠ΅ ΠΈΠΌΠΏΠ»ΠΈΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅ΡΠΈ Π½Π° ΡΠ΅ΡΠΈΡΠ°ΡΠ°), ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ΅ (A ΠΈ X; Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠΈ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ), ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ° Π·Π° Π³ΡΠ΅Π±Π΅ΡΠ΅ ΠΈ ΠΈΠΌΠΏΠ»ΠΈΡΠΈΡΠ΅Π½ Π±ΡΠΎΡΠ°Ρ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅ ΡΡΠΎ BPF Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄ΠΎΡ Π±Π΅ΡΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ°Π½ ΠΏΠΎ Motorola 6502 ISA. ΠΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠΈ Π‘ΡΠΈΠ² ΠΠ΅ΠΊΠΠ΅Π½ Π²ΠΎ Π½Π΅Π³ΠΎΠ²Π°ΡΠ°
ΠΠΎΠ΄Π΄ΡΡΠΊΠ°ΡΠ° Π·Π° BPF Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΠΈΠ½ΡΠΊΡ Π²ΠΎ Π²Π΅ΡΠ·ΠΈΠΈ v2.5 ΠΈ ΠΏΠΎΠ²ΠΈΡΠΎΠΊΠΈ, Π΄ΠΎΠ΄Π°Π΄Π΅Π½ΠΈ Π³Π»Π°Π²Π½ΠΎ ΡΠΎ Π½Π°ΠΏΠΎΡΠΈΡΠ΅ Π½Π° ΠΠ΅Ρ Π¨ΡΠ»ΠΈΡΡ. ΠΠΎΠ΄ΠΎΡ BPF ΠΎΡΡΠ°Π½Π° Π½Π΅ΠΏΡΠΎΠΌΠ΅Π½Π΅Ρ Π΄ΠΎ 2011 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠΎΠ³Π° ΠΡΠΈΠΊ ΠΡΠΌΠ°ΡΠ΅Ρ Π³ΠΎ ΡΠ΅Π΄ΠΈΠ·Π°ΡΠ½ΠΈΡΠ°ΡΠ΅ ΠΏΡΠ΅Π²Π΅Π΄ΡΠ²Π°ΡΠΎΡ BPF Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π²ΠΎ JIT ΡΠ΅ΠΆΠΈΠΌ (ΠΠ·Π²ΠΎΡ:
ΠΠΎΠ΄ΠΎΡΠ½Π°, Π²ΠΎ 2014 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΠ»Π΅ΠΊΡΠ΅Ρ Π‘ΡΠ°ΡΠΎΠ²ΠΎΠΈΡΠΎΠ² ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ Π½ΠΎΠ² JIT ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° BPF. ΠΡΡΡΠ½ΠΎΡΡ, ΠΎΠ²ΠΎΡ Π½ΠΎΠ² JIT ΡΡΠ°Π½Π° Π½ΠΎΠ²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° BPF ΠΈ Π±Π΅ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅Π½ eBPF. ΠΠΈΡΠ»Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΈ Π΄Π²Π΅ΡΠ΅ VM ΠΊΠΎΠ΅Π³Π·ΠΈΡΡΠΈΡΠ°Π° Π½Π΅ΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΠ΅, Π½ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Π»Π½ΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° eBPF. ΠΡΡΡΠ½ΠΎΡΡ, Π²ΠΎ ΠΌΠ½ΠΎΠ³Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°, BPF ΡΠ΅ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ° ΠΊΠ°ΠΊΠΎ eBPF, Π° ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΠΎΡ BPF Π΄Π΅Π½Π΅Ρ Π΅ ΠΏΠΎΠ·Π½Π°Ρ ΠΊΠ°ΠΊΠΎ cBPF.
eBPF ΡΠ° ΠΏΡΠΎΡΠΈΡΡΠ²Π° ΠΊΠ»Π°ΡΠΈΡΠ½Π°ΡΠ° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° BPF Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π½Π°ΡΠΈΠ½ΠΈ:
- ΠΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ 64-Π±ΠΈΡΠ½ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ. eBPF ΠΊΠΎΡΠΈΡΡΠΈ 64-Π±ΠΈΡΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ ΠΈ Π³ΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π° Π±ΡΠΎΡΠΎΡ Π½Π° Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ ΠΎΠ΄ 2 (Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ ΠΈ X) Π½Π° 10. eBPF ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΎΠΏΡΠΈΡΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ (BPF_MOV, BPF_JNE, BPF_CALL...).
- ΠΠ΄Π²ΠΎΠ΅Π½ΠΎ ΠΎΠ΄ ΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΡ Π½Π° ΠΌΡΠ΅ΠΆΠ½ΠΈΠΎΡ ΡΠ»ΠΎΡ. BPF Π±Π΅ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ ΡΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π½Π° ΡΠ΅ΡΠΈΡΠΊΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ ΠΊΠΎΠ΄ ΡΠ΅ Π½Π°ΠΎΡΠ°ΡΠ΅ Π²ΠΎ ΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΡ ΡΡΠΎ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΌΡΠ΅ΠΆΠ½ΠΈ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ. Π‘Π΅ΠΏΠ°ΠΊ, Π²ΠΈΡΡΡΠ΅Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° eBPF ΠΏΠΎΠ²Π΅ΡΠ΅ Π½Π΅ Π΅ Π²ΡΠ·Π°Π½Π° Π·Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΊΠΎΡΠ° Π±ΠΈΠ»ΠΎ Π½Π°ΠΌΠ΅Π½Π°. ΠΠ½Π°ΡΠΈ, ΡΠ΅Π³Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° eBPF ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π΅ ΡΠΎ ΡΠΎΡΠΊΠ° Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ ΠΈΠ»ΠΈ kprobe. ΠΠ²Π° Π³ΠΎ ΠΎΡΠ²ΠΎΡΠ° ΠΏΠ°ΡΠΎΡ Π΄ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° eBPF, Π°Π½Π°Π»ΠΈΠ·Π°ΡΠ° Π½Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ ΠΈ ΠΌΠ½ΠΎΠ³Ρ Π΄ΡΡΠ³ΠΈ ΡΠ»ΡΡΠ°ΠΈ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π½Π° Π΄ΡΡΠ³ΠΈ ΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠΈ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ. Π‘Π΅Π³Π° ΠΊΠΎΠ΄ΠΎΡ eBPF ΡΠ΅ Π½Π°ΠΎΡΠ° Π½Π° ΡΠΎΠΏΡΡΠ²Π΅Π½Π°ΡΠ° ΠΏΠ°ΡΠ΅ΠΊΠ°: ΠΊΠ΅ΡΠ½Π΅Π»/bpf.
- ΠΠ»ΠΎΠ±Π°Π»Π½ΠΈ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° Π·Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈ βΠΠ°ΡΡΠΈβ. ΠΠ°ΠΏΠΈΡΠ΅ ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ° ΡΠΎ ΠΊΠ»ΡΡΠ½ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΠΊΠΎΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π°Π°Ρ ΡΠ°Π·ΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΏΠΎΠΌΠ΅ΡΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΡΠΎΡ ΠΈ ΠΏΡΠΎΡΡΠΎΡΠΎΡ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ. eBPF ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π²ΠΈΠ΄ΠΎΠ²ΠΈ Π½Π° ΠΌΠ°ΠΏΠΈ.
- Π‘Π΅ΠΊΡΠ½Π΄Π°ΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΎΠ±Π΅Π½ΠΎ, Π·Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠΈ ΠΏΠ°ΠΊΠ΅Ρ, ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ°ΡΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π° ΡΡΠΌΠ° ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΡΡΠ΅ ΠΏΠ°ΠΊΠ΅Ρ. ΠΠ²ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°Ρ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΈ Π½Π΅ ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ. ΠΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΠΎΡΡΠ²Π°ΡΡΠ²Π°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ ΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ eBPF.
- ΠΠ°Π²ΡΡΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ. ΠΠΎΠ»Π΅ΠΌΠΈΠ½Π°ΡΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π²ΠΎ eBPF Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π° Π½Π° 4096 Π±Π°ΡΡΠΈ. Π€ΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π·Π° ΠΎΠΏΠ°ΡΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° eBPF Π΄Π° ΡΠ° ΠΏΡΠ΅Π½Π΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π°ΡΠ° Π½Π° Π½ΠΎΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° eBPF ΠΈ Π½Π° ΡΠΎΡ Π½Π°ΡΠΈΠ½ Π΄Π° Π³ΠΎ Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈ ΠΎΠ²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΡΠ²Π°ΡΠ΅ (Π½Π° ΠΎΠ²ΠΎΡ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Ρ Π΄ΠΎ 32 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ).
eBPF: ΠΏΡΠΈΠΌΠ΅Ρ
ΠΠΎΡΡΠΎΡΠ°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° eBPF Π²ΠΎ ΠΈΠ·Π²ΠΎΡΠΈΡΠ΅ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π½Π° ΠΠΈΠ½ΡΠΊΡ. Π’ΠΈΠ΅ ΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ/bpf/. ΠΠ° Π΄Π° Π³ΠΈ ΡΠΎΠ±Π΅ΡΠ΅ΡΠ΅ ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ, Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π²Π½Π΅ΡΠ΅ΡΠ΅:
$ sudo make samples/bpf/
ΠΠ°Ρ ΡΠ°ΠΌΠΈΠΎΡ Π½Π΅ΠΌΠ° Π΄Π° Π½Π°ΠΏΠΈΡΠ°ΠΌ Π½ΠΎΠ² ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° eBPF, ΡΡΠΊΡ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°ΠΌ Π΅Π΄Π΅Π½ ΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈΡΠ΅ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ Π²ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ/bpf/. ΠΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π°ΠΌ Π½Π΅ΠΊΠΎΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΡ ΠΈ ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½Π°ΠΌ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°. ΠΠ°ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ° ΠΈΠ·Π±ΡΠ°Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° tracex4
.
ΠΠ΅Π½Π΅ΡΠ°Π»Π½ΠΎ, ΡΠ΅ΠΊΠΎΡ ΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ Π²ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ/bpf/ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ Π΄Π²Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ:
tracex4_kern.c
, Π³ΠΎ ΡΠΎΠ΄ΡΠΆΠΈ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ Π²ΠΎ ΡΠ°Π΄ΡΠΎΡΠΎ ΠΊΠ°ΠΊΠΎ eBPF Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄.tracex4_user.c
, ΡΠΎΠ΄ΡΠΆΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ.
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ tracex4_kern.c
Π΄ΠΎ eBPF Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² Π²ΠΎ gcc
Π½Π΅ΠΌΠ° Π·Π°Π΄Π½ΠΈΠ½ΡΠΊΠΈ Π·Π° eBPF. ΠΠ° ΡΡΠ΅ΡΠ°, clang
ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ΠΌΠΈΡΡΠ²Π° eBPF Π±Π°ΡΡΠ΅ΠΊΠΎΠ΄.
ΠΊΠΎΡΠΈΡΡΠΈ clang
Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΠ° tracex4_kern.c
Π΄ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°.
ΠΠΎΠ³ΠΎΡΠ΅ ΡΠΏΠΎΠΌΠ½Π°Π² Π΄Π΅ΠΊΠ° Π΅Π΄Π½Π° ΠΎΠ΄ Π½Π°ΡΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ Π½Π° eBPF ΡΠ΅ ΠΌΠ°ΠΏΠΈΡΠ΅. tracex4_kern Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π΅Π΄Π½Π° ΠΊΠ°ΡΡΠ°:
struct pair {
u64 val;
u64 ip;
};
struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(long),
.value_size = sizeof(struct pair),
.max_entries = 1000000,
};
BPF_MAP_TYPE_HASH
Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΡΡΠ΅ Π²ΠΈΠ΄ΠΎΠ²ΠΈ ΠΊΠ°ΡΡΠΈΡΠΊΠΈ ΡΡΠΎ Π³ΠΈ Π½ΡΠ΄ΠΈ eBPF. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠΎΠ° Π΅ ΡΠ°ΠΌΠΎ Ρ
Π°Ρ. ΠΠΎΠΆΠ΅Π±ΠΈ ΡΡΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π»Π΅ ΠΈ ΠΎΠ³Π»Π°Ρ SEC("maps")
. SEC Π΅ ΠΌΠ°ΠΊΡΠΎ ΡΡΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½ΠΎΠ² Π΄Π΅Π» ΠΎΠ΄ Π±ΠΈΠ½Π°ΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°. ΠΡΡΡΠ½ΠΎΡΡ, Π²ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ tracex4_kern
Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ ΡΠ΅ ΡΡΡΠ΅ Π΄Π²Π° Π΄Π΅Π»Π°:
SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{
long ptr = PT_REGS_PARM2(ctx);
bpf_map_delete_elem(&my_map, &ptr);
return 0;
}
SEC("kretprobe/kmem_cache_alloc_node")
int bpf_prog2(struct pt_regs *ctx)
{
long ptr = PT_REGS_RC(ctx);
long ip = 0;
// ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ip-Π°Π΄ΡΠ΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ kmem_cache_alloc_node()
BPF_KRETPROBE_READ_RET_IP(ip, ctx);
struct pair v = {
.val = bpf_ktime_get_ns(),
.ip = ip,
};
bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
return 0;
}
ΠΠ²ΠΈΠ΅ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Π°Ρ Π΄Π° ΠΈΠ·Π±ΡΠΈΡΠ΅ΡΠ΅ Π·Π°ΠΏΠΈΡ ΠΎΠ΄ ΠΊΠ°ΡΡΠ°ΡΠ° (kprobe/kmem_cache_free
) ΠΈ Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π½ΠΎΠ² Π·Π°ΠΏΠΈΡ Π½Π° ΠΊΠ°ΡΡΠ°ΡΠ° (kretprobe/kmem_cache_alloc_node
). Π‘ΠΈΡΠ΅ ΠΈΠΌΠΈΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ ΡΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈ Π±ΡΠΊΠ²ΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° ΠΌΠ°ΠΊΡΠΎΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π²ΠΎ
.
ΠΠΊΠΎ Π³ΠΈ ΠΈΡΡΡΠ»Π°ΠΌ Π΄Π΅Π»ΠΎΠ²ΠΈΡΠ΅ ΠΎΠ΄ ΠΎΠ±ΡΠ΅ΠΊΡΠ½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΡΡΠ΅Π±Π° Π΄Π° Π²ΠΈΠ΄Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠ²ΠΈΠ΅ Π½ΠΎΠ²ΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ ΡΠ΅ Π²Π΅ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ:
$ objdump -h tracex4_kern.o
tracex4_kern.o: file format elf64-little
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 kprobe/kmem_cache_free 00000048 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
2 kretprobe/kmem_cache_alloc_node 000000c0 0000000000000000 0000000000000000 00000088 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
3 maps 0000001c 0000000000000000 0000000000000000 00000148 2**2
CONTENTS, ALLOC, LOAD, DATA
4 license 00000004 0000000000000000 0000000000000000 00000164 2**0
CONTENTS, ALLOC, LOAD, DATA
5 version 00000004 0000000000000000 0000000000000000 00000168 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .eh_frame 00000050 0000000000000000 0000000000000000 00000170 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
ΠΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠΎΡΡΠΎΠΈ
, Π³Π»Π°Π²Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°. ΠΠΎ ΠΎΡΠ½ΠΎΠ²Π°, ΠΎΠ²Π°Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΡΠ»ΡΡΠ° Π½Π°ΡΡΠ°Π½ΠΈ kmem_cache_alloc_node
. ΠΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠΈ ΡΠ°ΠΊΠΎΠ² Π½Π°ΡΡΠ°Π½, ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΠΎΡ eBPF ΠΊΠΎΠ΄. ΠΠΎΠ΄ΠΎΡ Π³ΠΎ Π·Π°ΡΡΠ²ΡΠ²Π° IP Π°ΡΡΠΈΠ±ΡΡΠΎΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΡ Π²ΠΎ ΠΌΠ°ΠΏΠ°, Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΡ ΠΏΠΎΡΠΎΠ° ΡΠ΅ Π²ΡΡΠΈ Π½ΠΈΠ· Π³Π»Π°Π²Π½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°. ΠΡΠΈΠΌΠ΅Ρ:
$ sudo ./tracex4
obj 0xffff8d6430f60a00 is 2sec old was allocated at ip ffffffff9891ad90
obj 0xffff8d6062ca5e00 is 23sec old was allocated at ip ffffffff98090e8f
obj 0xffff8d5f80161780 is 6sec old was allocated at ip ffffffff98090e8f
ΠΠ°ΠΊΠΎ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° eBPF? ΠΠ° ΠΈΠ½ΠΈΡΠΈΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡΠ° tracex4_user.c
Π²ΡΠΈΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡ-Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° tracex4_kern.o
ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° load_bpf_file
.
int main(int ac, char **argv)
{
struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
char filename[256];
int i;
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
if (setrlimit(RLIMIT_MEMLOCK, &r)) {
perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)");
return 1;
}
if (load_bpf_file(filename)) {
printf("%s", bpf_log_buf);
return 1;
}
for (i = 0; ; i++) {
print_old_objects(map_fd[1]);
sleep(1);
}
return 0;
}
Π‘ΠΎ ΠΏΡΠ°Π²Π΅ΡΠ΅
ΡΠ΅ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ ΡΠΎΠ½Π΄ΠΈ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° eBPF /sys/kernel/debug/tracing/kprobe_events
. Π‘Π΅Π³Π° Π³ΠΈ ΡΠ»ΡΡΠ°ΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ Π½Π°ΡΡΠ°Π½ΠΈ ΠΈ Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π΅ΡΡΠΎ ΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠ°Ρ.
$ sudo cat /sys/kernel/debug/tracing/kprobe_events
p:kprobes/kmem_cache_free kmem_cache_free
r:kprobes/kmem_cache_alloc_node kmem_cache_alloc_node
Π‘ΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π²ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΊΠΎΡ/bpf/ ΡΠ΅ ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΈ ΡΠ»ΠΈΡΠ½ΠΎ. Π’ΠΈΠ΅ ΡΠ΅ΠΊΠΎΠ³Π°Ρ ΡΠΎΠ΄ΡΠΆΠ°Ρ Π΄Π²Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ:
XXX_kern.c
: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° eBPF.XXX_user.c
: Π³Π»Π°Π²Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°.
ΠΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° eBPF Π³ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΠ²Π° ΠΌΠ°ΠΏΠΈΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ Π΄Π΅Π». ΠΠΎΠ³Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΈΠ·Π΄Π°Π²Π° Π½Π°ΡΡΠ°Π½ ΠΎΠ΄ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΡΠΈΠΏ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, tracepoint
), ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Π°Ρ Π²ΡΠ·Π°Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΡΡΠΈΡΠΊΠΈΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°Π°Ρ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ.
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
ΠΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° Π³ΠΈ Π΄ΠΈΡΠΊΡΡΠΈΡΠ°ΡΠ΅ BPF ΠΈ eBPF Π²ΠΎ ΠΎΠΏΡΡΠΈ ΡΠ΅ΡΠΌΠΈΠ½ΠΈ. ΠΠ½Π°ΠΌ Π΄Π΅ΠΊΠ° Π΄Π΅Π½Π΅Ρ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈ ΡΠ΅ΡΡΡΡΠΈ Π·Π° eBPF, ΠΏΠ° Π·Π°ΡΠΎΠ° ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΠ°ΡΠ°ΠΌ ΡΡΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΡΡΡΡΠΈ Π·Π° ΠΏΠΎΠ½Π°ΡΠ°ΠΌΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠ²Π°ΡΠ΅
ΠΡΠ΅ΠΏΠΎΡΠ°ΡΡΠ²Π°ΠΌ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅:
BPF: ΡΠ½ΠΈΠ²Π΅ΡΠ·Π°Π»Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΠΎΠ½Π°ΡΠ°Π½ ΠΠΎΡΠ±Π΅Ρ. ΠΠΎΠ²Π΅Π΄ Π²ΠΎ BPF ΠΈ ΠΊΠ°ΠΊΠΎ ΡΠΎΡ Π΅Π²ΠΎΠ»ΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ eBPF.Π’Π΅ΠΌΠ΅Π»Π΅Π½ Π²ΠΎΠ²Π΅Π΄ Π²ΠΎ eBPF ΠΡΠ΅Π½Π΄Π°Π½ ΠΡΠ΅Π³. Π‘ΡΠ°ΡΠΈΡΠ° ΠΎΠ΄ LWN.net. ΠΡΠ΅Π½Π΄Π°Π½ ΡΠ΅ΡΡΠΎ ΡΠ²ΠΈΡΠ° Π·Π° eBPF ΠΈ ΠΎΠ΄ΡΠΆΡΠ²Π° Π»ΠΈΡΡΠ° Π½Π° ΡΠ΅ΡΡΡΡΠΈ Π½Π° ΡΠ΅ΠΌΠ°ΡΠ° Π½Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ°Π±Π»ΠΎΠ³ ΠΏΠΎΡΡ .ΠΠ΅Π»Π΅ΡΠΊΠΈ Π·Π° BPF ΠΈ eBPF ΠΡΠ»ΠΈΡΠ° ΠΠ²Π°Π½Ρ. ΠΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π½Π° ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π‘ΡΡΠ°ΠΊΡΠ° Π¨Π°ΡΠΌΠ° βΠ€ΠΈΠ»ΡΠ΅ΡΠΎΡ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ BSD: ΠΠΎΠ²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π·Π° ΡΠ°ΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊβ. ΠΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ ΡΠ΅ Π΄ΠΎΠ±ΡΠΈ ΠΈ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π°Π°Ρ Π΄Π° Π³ΠΈ ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ»Π°ΡΠ΄ΠΎΠ²ΠΈΡΠ΅.eBPF, Π΄Π΅Π» 1: ΠΠΈΠ½Π°ΡΠΎΡΠΎ, ΡΠ΅Π³Π°ΡΠ½ΠΎΡΡΠ° ΠΈ ΠΈΠ΄Π½ΠΈΠ½Π°ΡΠ° Π€Π΅ΡΠΈΡ ΠΠ»ΠΈΡ. ΠΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠΎΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ , Π½ΠΎ Π²ΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°. ΠΠ΄Π½Π° ΠΎΠ΄ Π½Π°ΡΠ΄ΠΎΠ±ΡΠΈΡΠ΅ Π½Π°ΠΏΠΈΡΠΈ ΡΡΠΎ ΡΡΠΌ Π³ΠΈ ΡΡΠ΅ΡΠ½Π°Π» Π½Π° eBPF.
ΠΠ·Π²ΠΎΡ: www.habr.com