ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ Cloudflare ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ , Π² ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ²Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° tcpdump, ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° (eXpress Data Path). ΠΠΎΠ΄ΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Go ΠΈ Π΅ Ρ Π»ΠΈΡΠ΅Π½Π· BSD. ΠΡΠΎΠ΅ΠΊΡΡΡ Π²ΠΊΠ»ΡΡΠ²Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° eBPF ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π° ΡΡΠ°ΡΠΈΠΊ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Go.
Π£ΡΠΈΠ»ΠΈΡΠ°ΡΠ° xdpcap Π΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° Ρ ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° tcpdump/libpcap ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ ΡΡΠ°ΡΠΈΠΊ Π½Π° ΡΡΡΠΎΡΠΎ ΠΎΠ±ΠΎΡΡΠ΄Π²Π°Π½Π΅. Xdpcap ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π² ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΠΈΡΠΎ ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΈΡΡ tcpdump Π½Π΅ Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠΈΠ»ΡΡΠΈΡΠ°ΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ, Π·Π°ΡΠΈΡΠ° ΠΎΡ DoS Π°ΡΠ°ΠΊΠΈ ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° XDP Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ ΡΡΡ Π½ΠΎΡΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΏΡΠ΅Π· ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ΅ΠΊ Π½Π° ΡΠ΄ΡΠΎΡΠΎ (tcpdump Π½Π΅ Π²ΠΈΠΆΠ΄Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅, ΠΎΡΡ Π²ΡΡΠ»Π΅Π½ΠΈ ΠΎΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° XDP).
ΠΠΈΡΠΎΠΊΠ°ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠΈΡΠ΅ eBPF ΠΈ XDP. eBPF Π΅ Π²Π³ΡΠ°Π΄Π΅Π½ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ Π½Π° Π±Π°ΠΉΡΠΊΠΎΠ΄ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° Linux, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΠΈΡΠΎΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π½Π° Π²Ρ ΠΎΠ΄ΡΡΠΈ/ΠΈΠ·Ρ ΠΎΠ΄ΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅ ΠΈΠ»ΠΈ ΠΎΡΡ Π²ΡΡΠ»ΡΠ½Π΅. Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° JIT ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° Π±Π°ΠΉΡΠΊΠΎΠ΄ΡΡ eBPF ΡΠ΅ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ° Π² ΠΌΠ°ΡΠΈΠ½Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π½Π° Π»Π΅ΡΠΈΡΠ΅ΡΠΎ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° Π½Π°ΡΠΈΠ²Π΅Π½ ΠΊΠΎΠ΄. ΠΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° XDP (eXpress Data Path) Π΄ΠΎΠΏΡΠ»Π²Π° eBPF Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ, ΠΊΠ°ΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ DMA Π±ΡΡΠ΅ΡΠΈΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΠΈ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΅ΡΠ°ΠΏΠ° ΠΏΡΠ΅Π΄ΠΈ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° Π±ΡΡΠ΅ΡΠ° skbuff ΠΎΡ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ ΡΡΠ΅ΠΊ.
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° tcpdump, ΡΡΠΈΠ»ΠΈΡΠ°ΡΠ° xdpcap ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΠ° Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΡΠΈΠ»Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠΈΠ»ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ°ΡΠΈΠΊ Π² ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° BPF (cBPF) Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° libpcap, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π³ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π° Π² ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ eBPF, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠ° , ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π½Π° LLVM/Clang. ΠΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΡΡΠ°ΡΠΈΠΊΠ° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅Π½ ΡΠΎΡΠΌΠ°Ρ pcap, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈΡΡ Π² xdpcap Π΄Π°ΠΌΠΏ Π½Π° ΡΡΠ°ΡΠΈΠΊΠ° Π·Π° ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΎ ΠΏΡΠΎΡΡΠ²Π°Π½Π΅ Π² tcpdump ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ Π½Π° ΡΡΠ°ΡΠΈΠΊ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π·Π°Ρ Π²Π°ΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° DNS ΡΡΠ°ΡΠΈΠΊ Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Β«tcpdump ip and udp port 53Β» ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Β«xdpcap /path/to/hook capture.pcap βip and udp port 53βΒ», ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°ΠΉΠ»Π° capture.pcap, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Β«tcpdump -rΒ» ΠΈΠ»ΠΈ Π² Wireshark.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
