Π₯Π΅ΠΉ Π₯Π°Π±Ρ! ΠΠ½ΡΠΎΡΠΌΠΈΡΠ°ΠΌΠ΅ Π²ΠΈ, ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²ΡΠΌΠ΅ ΠΈΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ½ΠΈΠ³Π° "
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° BPF ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π°ΠΊΡΠΈΠ²Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°, Π½ΠΈΠ΅ ΠΏΡΠ΅Π²Π΅Π΄ΠΎΡ
ΠΌΠ΅ ΡΡΠ°ΡΠΈΡ Π·Π° Π²Π°Ρ, ΠΎΠΏΠΈΡΠ²Π°ΡΠ° Π½Π΅ΠΉΠ½ΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ ΡΠ΅ΠΊΡΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅.
ΠΡΠ΅Π· ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈΡΠ΅ ΠΈ ΡΠ΅Ρ
Π½ΠΈΠΊΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈΡ
Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡ, Π·Π° Π΄Π° ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡΠ°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux Π² ΡΠ»ΡΡΠ°ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Ρ Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ. ΠΠ΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΎΡ ΡΠΎΠ·ΠΈ Π²ΠΈΠ΄ Π΅ Ρ.Π½Π°Ρ Π±Π°ΠΉΠΏΠ°Ρ Π½Π° ΡΠ΄ΡΠΎΡΠΎ (Π±Π°ΠΉΠΏΠ°Ρ Π½Π° ΡΠ΄ΡΠΎΡΠΎ) ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°, ΠΏΡΠ΅ΡΠΊΠ°ΡΠ°ΠΉΠΊΠΈ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΠ»ΠΎΠΉ Π½Π° ΡΠ΄ΡΠΎΡΠΎ, Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΡΠ»Π°ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. ΠΠ°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΡΡΡΠΎ Π²ΠΊΠ»ΡΡΠ²Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΊΠ°ΡΡΠ° ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. Π‘ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΠΊΠ°ΡΡΠ°, Π½ΠΈΠ΅ ΡΠ°Π·ΡΠΈΡΠ°ΠΌΠ΅ Π½Π° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ.
Π§ΡΠ΅Π· ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΡΠ½Π΅ Π½Π° ΠΏΡΠ»Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΊΠ°ΡΡΠ° ΠΊΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, Π½ΠΈΠ΅ Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΠΆΠΈΠΉΠ½ΠΈΡΠ΅ ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈ, ΠΏΡΠΈΡΠΈΠ½Π΅Π½ΠΈ ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ (ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΠ»ΠΎΠΉ, ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½ΠΈΡ ΠΈ Ρ.Π½.), ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° ΡΡΡ ΡΠΊΠΎΡΠΎΡΡΠΈ ΠΎΡ 10Gb/s ΠΈΠ»ΠΈ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊ. ΠΠ°ΠΎΠ±ΠΈΠΊΠ°Π»ΡΠ½Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΏΠ»ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ (ΠΏΠ°ΠΊΠ΅ΡΠ½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°) ΠΈ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° (NUMA ΡΡΠ΅ΡΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ, ΠΠ·ΠΎΠ»Π°ΡΠΈΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°, ΠΈ Ρ.Π½.) ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²ΠΈΡΠ΅ Π½Π° Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½Π°ΡΠ° ΠΌΡΠ΅ΠΆΠ° Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. ΠΠΎΠΆΠ΅ Π±ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΎΠ·ΠΈ Π½ΠΎΠ² ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΊΡΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π΅
ΠΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈΠΌΠ° ΡΠ΅Π΄ΠΈΡΠ° Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΡΠΈ:
- Π―Π΄ΡΠΎΡΠΎ Π½Π° ΠΠ‘ Π΅ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΎΠ½Π΅Π½ ΡΠ»ΠΎΠΉ Π·Π° Ρ Π°ΡΠ΄ΡΠ΅ΡΠ½ΠΈ ΡΠ΅ΡΡΡΡΠΈ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Ρ ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ, ΡΠ΅ ΡΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡ ΡΠΈ Ρ Π°ΡΠ΄ΡΠ΅Ρ. Π’ΠΎΠ²Π° ΡΠ΅ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π½Π° Π²Π°ΡΠΈΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΈ.
- Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ΅ ΠΎΡΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΎΡ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ, Π½ΠΈΠ΅ ΡΠ΅ ΠΎΡΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΈ ΠΎΡ ΡΡΠ»Π°ΡΠ° ΠΌΡΠ΅ΠΆΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½Π° ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π²Π½Π΅Π΄ΡΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ Π²Π΅ΡΠ΅ Π΄Π° ΡΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°.
- ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ sandbox, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π° ΡΡΡ Π½ΠΎΡΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΈ ΠΈΠΌ ΠΏΡΠ΅ΡΠΈ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Ρ Ρ Π΄ΡΡΠ³ΠΈ ΡΠ°ΡΡΠΈ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°.
ΠΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Π² ΠΌΡΠ΅ΠΆΠ° Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π°Ρ ΡΡΠ΅Π· ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ ΡΠ΄ΡΠΎΡΠΎ ΠΊΡΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. XDP ΠΏΡΠ°Π²ΠΈ ΡΠΎΡΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΡΠΎ: ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ²Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ (ΡΠΈΠ»ΡΡΠΈ, ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΠΈ, ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ Ρ.Π½.) Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ. XDP Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²Π΅Π΄Π½Π°Π³Π° ΡΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΡΡ Π΄ΠΎΡΡΠΈΠ³Π½Π΅ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ Π΄Π° ΠΏΡΡΡΠ²Π° Π΄ΠΎ ΠΌΡΠ΅ΠΆΠΎΠ²Π°ΡΠ° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° Π½Π° ΡΠ΄ΡΠΎΡΠΎ. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ. ΠΠ°ΠΊ ΠΎΠ±Π°ΡΠ΅ ΡΠ΄ΡΠΎΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΡΠ²ΠΎΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ? ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π½Π° ΡΠΎΠ·ΠΈ Π²ΡΠΏΡΠΎΡ, Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ BPF.
BPF ΠΈ eBPF
ΠΡΠΏΡΠ΅ΠΊΠΈ Π½Π΅ ΡΡΠ²ΡΠ΅ΠΌ ΡΡΠ½ΠΎΡΠΎ ΠΈΠΌΠ΅, BPF (Packet Filtering, Berkeley) Π²ΡΡΡΠ½ΠΎΡΡ Π΅ ΠΌΠΎΠ΄Π΅Π» Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. Π’Π°Π·ΠΈ Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½Π° Π΄Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΎΡΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠ΄Π²Π° ΠΈ ΠΈΠΌΠ΅ΡΠΎ.
ΠΠ΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ 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 ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ethertype Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°.
- ΠΠ½ΡΡΡΡΠΊΡΠΈΡ (001): ΡΡΠ°Π²Π½ΡΠ²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π² Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠ° Ρ 0x86dd, Ρ.Π΅. ΡΡΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ethertype Π·Π° IPv6. ΠΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ Π²Π΅ΡΠ΅Π½, ΡΠΎΠ³Π°Π²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈΡΡ Π±ΡΠΎΡΡ ΠΎΡΠΈΠ²Π° ΠΊΡΠΌ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ (002), Π° Π°ΠΊΠΎ Π½Π΅, ΡΠΎΠ³Π°Π²Π° ΠΊΡΠΌ (006).
- ΠΠ½ΡΡΡΡΠΊΡΠΈΡ (006): ΡΡΠ°Π²Π½ΡΠ²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Ρ 0x800 (ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ethertype Π·Π° IPv4). ΠΠΊΠΎ ΠΎΡΠ³ΠΎΠ²ΠΎΡΡΡ Π΅ Π²Π΅ΡΠ΅Π½, ΡΠΎΠ³Π°Π²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΎΡΠΈΠ²Π° Π½Π° (007), Π°ΠΊΠΎ Π½Π΅, ΡΠΎΠ³Π°Π²Π° Π½Π° (015).
Π ΡΠ°ΠΊΠ° Π½Π°ΡΠ°ΡΡΠΊ, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π²ΡΡΠ½Π΅ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ Π±ΡΠ»Π΅Π²ΠΎ. ΠΡΡΡΠ°Π½Π΅ΡΠΎ Π½Π° Π½Π΅Π½ΡΠ»Π΅Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ (014)) ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡΡ Π΅ ΡΡΠ²ΠΏΠ°Π΄Π½Π°Π», Π° Π²ΡΡΡΠ°Π½Π΅ΡΠΎ Π½Π° Π½ΡΠ»Π° (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ (015)) ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡΡ Π½Π΅ Π΅ ΡΡΠ²ΠΏΠ°Π΄Π½Π°Π».
ΠΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° BPF ΠΈ Π½Π΅ΠΉΠ½ΠΈΡΡ Π±Π°ΠΉΡ ΠΊΠΎΠ΄ Π±ΡΡ
Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈ ΠΎΡ Π‘ΡΠΈΠ² ΠΠ°ΠΊΠΊΠ°Π½ ΠΈ ΠΠ°Π½ ΠΠΆΠ΅ΠΉΠΊΡΠ±ΡΡΠ½ Π² ΠΊΡΠ°Ρ Π½Π° 1992 Π³., ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·Π»Π΅Π·Π΅ ΡΡΡ
Π½Π°ΡΠ° ΡΡΠ°ΡΠΈΡ.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ BPF Π΅ Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠΎΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΡΠ΅Π΄Π°ΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ Π±Π°ΠΉΡ ΠΊΠΎΠ΄Π°, ΡΠΎΠΉ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° ΠΌΠΎΠ΄Π΅Π» Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Π·Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ (ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈΡΠ΅ Π·Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΈΠΌΠΏΠ»ΠΈΡΠΈΡΠ½ΠΎ ΠΊΡΠΌ ΠΏΠ°ΠΊΠ΅Ρ), ΡΠ΅Π³ΠΈΡΡΡΠΈ (A ΠΈ X; Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡΠ½ΠΈ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ), ΠΏΠ°ΠΌΠ΅Ρ Π·Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ ΡΠΊΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Π½ Π±ΡΠΎΡΡ. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΡΠΎ Π΅, ΡΠ΅ Π±Π°ΠΉΡ ΠΊΠΎΠ΄ΡΡ Π½Π° BPF Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ°Π½ ΡΠ»Π΅Π΄ Motorola 6502 ISA. ΠΠ°ΠΊΡΠΎ Π‘ΡΠΈΠ² ΠΠ°ΠΊΠΊΠ°Π½ ΡΠΈ ΡΠΏΠΎΠΌΠ½Ρ Π² ΡΠ²ΠΎΡ
ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° BPF Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½Π° Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux Π²ΡΠ² Π²Π΅ΡΡΠΈΡ v2.5 ΠΈ ΠΏΠΎ-Π½ΠΎΠ²Π°, Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Π³Π»Π°Π²Π½ΠΎ ΠΎΡ Jay Schullist. BPF ΠΊΠΎΠ΄ΡΡ ΠΎΡΡΠ°Π½Π° Π½Π΅ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ Π΄ΠΎ 2011 Π³., ΠΊΠΎΠ³Π°ΡΠΎ ΠΡΠΈΠΊ ΠΡΠΌΠ°ΡΠ΅Ρ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠΈ BPF ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π² JIT ΡΠ΅ΠΆΠΈΠΌ (ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ:
ΠΠΎ-ΠΊΡΡΠ½ΠΎ, ΠΏΡΠ΅Π· 2014 Π³., ΠΠ»Π΅ΠΊΡΠ΅ΠΉ Π‘ΡΠ°ΡΠΎΠ²ΠΎΠΉΡΠΎΠ² ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ Π½ΠΎΠ² JIT ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° BPF. ΠΡΡΡΠ½ΠΎΡΡ ΡΠΎΠ·ΠΈ Π½ΠΎΠ² JIT ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ½Π° Π² Π½ΠΎΠ²Π° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° BPF ΠΈ Π±Π΅ΡΠ΅ Π½Π°ΡΠ΅ΡΠ΅Π½Π° eBPF. ΠΠΈΡΠ»Ρ, ΡΠ΅ ΠΈ Π΄Π²Π΅ΡΠ΅ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΡΡΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π½ΠΎ ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΎ Π²ΡΡΡ Ρ eBPF. ΠΡΡΡΠ½ΠΎΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ BPF ΡΠ΅ Π½Π°ΡΠΈΡΠ° eBPF, Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡΡ BPF Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ Π΄Π½Π΅Ρ ΠΊΠ°ΡΠΎ cBPF.
eBPF ΡΠ°Π·ΡΠΈΡΡΠ²Π° ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠ°ΡΠ° BPF Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π°ΡΠΈΠ½Π°:
- Π Π°Π·ΡΠΈΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ 64-Π±ΠΈΡΠΎΠ²ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ. eBPF ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° 64-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈ ΠΈ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° Π±ΡΠΎΡ Π½Π° Π½Π°Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈ ΠΎΡ 2 (Π°ΠΊΡΠΌΡΠ»Π°ΡΠΎΡ ΠΈ X) Π½Π° 10. eBPF ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΈ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (BPF_MOV, BPF_JNE, BPF_CALLβ¦).
- ΠΡΠ΄Π΅Π»Π΅Π½ ΠΎΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΠ»ΠΎΠΉ. BPF Π±Π΅ΡΠ΅ ΡΠ²ΡΡΠ·Π°Π½ Ρ ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° ΠΏΠ°ΡΡΠΈΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π±Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, Π½Π΅Π³ΠΎΠ²ΠΈΡΡ ΠΊΠΎΠ΄ Π±Π΅ΡΠ΅ Π² ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΠΊΠΎΡΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠ΅ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° eBPF ΠΎΠ±Π°ΡΠ΅ Π²Π΅ΡΠ΅ Π½Π΅ Π΅ ΠΎΠ±Π²ΡΡΠ·Π°Π½Π° Ρ ΠΌΠΎΠ΄Π΅Π» Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ΅Π»ΠΈ. Π ΡΠ°ΠΊΠ°, ΡΠ΅Π³Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° eBPF ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° ΠΊΡΠΌ tracepoint ΠΈΠ»ΠΈ kprobe. Π’ΠΎΠ²Π° ΠΎΡΠ²Π°ΡΡ Π²ΡΠ°ΡΠ°ΡΠ° ΠΊΡΠΌ eBPF ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ΡΠ»ΡΡΠ°ΠΈ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° Π΄ΡΡΠ³ΠΈ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠΈ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. Π‘Π΅Π³Π° ΠΊΠΎΠ΄ΡΡ Π½Π° eBPF ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΡΡ: kernel/bpf.
- ΠΠ»ΠΎΠ±Π°Π»Π½ΠΈ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π° Π΄Π°Π½Π½ΠΈ, Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈ ΠΠ°ΡΡΠΈ. ΠΠ°ΡΡΠΈΡΠ΅ ΡΠ° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π½Π° ΠΊΠ»ΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡ, ΠΊΠΎΠΈΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Ρ ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ. eBPF ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π²ΠΈΠ΄Π° ΠΊΠ°ΡΡΠΈ.
- ΠΡΠΎΡΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ, Π·Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ, ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π° ΡΡΠΌΠ° ΠΈΠ»ΠΈ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ. Π’Π΅Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π²ΡΡΡΠ΅ Π² ΡΠ΄ΡΠΎΡΠΎ ΠΈ Π½Π΅ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ ΠΊΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° eBPF.
- ΠΡΠ°ΠΉ Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅. Π Π°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° Π² eBPF Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π΄ΠΎ 4096 Π±Π°ΠΉΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡΡΠ° Π·Π° ΠΊΡΠ°ΠΉ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π΄Π° ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π½ΠΎΠ²Π° eBPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π΄Π° Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»ΠΈ ΡΠΎΠ²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ (Π΄ΠΎ 32 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½).
ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° eBPF
ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π·Π° eBPF Π² ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux. ΠΠ°Π»ΠΈΡΠ½ΠΈ ΡΠ° Π½Π° samples/bpf/. ΠΠ° Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΡΠ΅ ΡΠ΅Π·ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ, ΠΏΡΠΎΡΡΠΎ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅:
$ sudo make samples/bpf/
ΠΡΠΌΠ° Π΄Π° ΠΏΠΈΡΠ° ΡΠ°ΠΌ Π½ΠΎΠ² ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° eBPF, Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅, Π½Π°Π»ΠΈΡΠ½ΠΈ Π² samples/bpf/. Π©Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ Π½ΡΠΊΠΎΠΈ ΡΠ°ΡΡΠΈ ΠΎΡ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ΅ ΠΎΠ±ΡΡΠ½Ρ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ. ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ·Π±ΡΠ°Ρ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° tracex4
.
ΠΠ°ΡΠΎ ΡΡΠ»ΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅ Π² samples/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
ΠΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π² sample/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: ΠΠΈΠ½Π°Π»ΠΎ, Π½Π°ΡΡΠΎΡΡΠ΅ ΠΈ Π±ΡΠ΄Π΅ΡΠ΅ Π€Π΅ΡΠΈΡ ΠΠ»ΠΈΡ. Longread ΡΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΎ ΡΠΈ ΡΡΡΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ΅. ΠΠ΄Π½Π° ΠΎΡ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈΠΈ Π·Π° eBPF, Π½Π° ΠΊΠΎΠΈΡΠΎ ΡΡΠΌ ΠΏΠΎΠΏΠ°Π΄Π°Π».
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com