рд▓рд╣рд╛рди рдореБрд▓рд╛рдВрд╕рд╛рдареА BPF, рднрд╛рдЧ рд╢реВрдиреНрдп: рдХреНрд▓рд╛рд╕рд┐рдХ BPF

рдмрд░реНрдХрд▓реЗ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░реНрд╕ (BPF) рд╣реЗ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдЖрд╣реЗ рдЬреЗ рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдкрд╛рд╕реВрди рдЗрдВрдЧреНрд░рдЬреА-рднрд╛рд╖реЗрдЪреНрдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдкреНрд░рдХрд╛рд╢рдирд╛рдВрдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдкрд╛рдирд╛рдВрд╡рд░ рдЖрд╣реЗ. рдкрд░рд┐рд╖рджрд╛ BPF рдЪреНрдпрд╛ рд╡рд╛рдкрд░ рдЖрдгрд┐ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЕрд╣рд╡рд╛рд▓рд╛рдВрдиреА рднрд░рд▓реЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рдбреЗрд╡реНрд╣рд┐рдб рдорд┐рд▓рд░, рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдореЗрдВрдЯреЗрдирд░, рд▓рд┐рдирдХреНрд╕ рдкреНрд▓рдВрдмрд░реНрд╕ 2018 рдордзреНрдпреЗ рддреНрдпрд╛рдВрдЪреЗ рднрд╛рд╖рдг рдХреЙрд▓ рдХрд░рддреЗ "рд╣реА рдЪрд░реНрдЪрд╛ XDP рдмрджреНрджрд▓ рдирд╛рд╣реА" (XDP рдмреАрдкреАрдПрдлрд╕рд╛рдареА рдПрдХ рд╡рд╛рдкрд░ рдХреЗрд╕ рдЖрд╣реЗ). рдмреНрд░реЗрдВрдбрди рдЧреНрд░реЗрдЧ рдпрд╛ рд╢реАрд░реНрд╖рдХрд╛рдЦрд╛рд▓реА рднрд╛рд╖рдгреЗ рджреЗрддрд╛рдд рд▓рд┐рдирдХреНрд╕ рдмреАрдкреАрдПрдл рд╕реБрдкрд░рдкреЙрд╡рд░реНрд╕. рдЯреЛрдХреЗ рд╣рд╛рдИрд▓рдБрдб-рдЬреЙрд░реНрдЧреЗрдирд╕реЗрди рд╣рд╕рддреЛрдХреА рдХрд░реНрдирд▓ рдЖрддрд╛ рдорд╛рдпрдХреНрд░реЛрдХрд░реНрдирд▓ рдЖрд╣реЗ. рдереЙрдорд╕ рдЧреНрд░рд╛рдл рдпрд╛ рдХрд▓реНрдкрдиреЗрд▓рд╛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рджреЗрддрд╛рдд рдмреАрдкреАрдПрдл рдХрд░реНрдирд▓рд╕рд╛рдареА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрд╣реЗ.

Habr├й рд╡рд░ BPF рдЪреЗ рдЕрджреНрдпрд╛рдк рдХреЛрдгрддреЗрд╣реА рдкрджреНрдзрддрд╢реАрд░ рд╡рд░реНрдгрди рдирд╛рд╣реА, рдЖрдгрд┐ рдореНрд╣рдгреВрдирдЪ рд▓реЗрдЦрд╛рдВрдЪреНрдпрд╛ рдорд╛рд▓рд┐рдХреЗрдд рдореА рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рдмрджреНрджрд▓ рдмреЛрд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реЗрди, рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рд╡рд┐рдХрд╛рд╕ рд╕рд╛рдзрдирд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░реЗрди рдЖрдгрд┐ BPF рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрдгрд┐ рд╕рд░рд╛рд╡рд╛рдЪреНрдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рдВрдЪреА рд░реВрдкрд░реЗрд╖рд╛ рд╕рд╛рдВрдЧреЗрди. рд╣рд╛ рд▓реЗрдЦ, рд╢реВрдиреНрдп, рдорд╛рд▓рд┐рдХреЗрддреАрд▓, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдЖрдгрд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕рд╛рдВрдЧрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рддрддреНрддреНрд╡рд╛рдВрдЪреЗ рд░рд╣рд╕реНрдп рджреЗрдЦреАрд▓ рдкреНрд░рдХрдЯ рдХрд░рддреЛ. tcpdump, seccomp, strace, рдЖрдгрд┐ рдмрд░реЗрдЪ рдХрд╛рд╣реА.

рдмреАрдкреАрдПрдлрдЪрд╛ рд╡рд┐рдХрд╛рд╕ рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рд╕рдореБрджрд╛рдпрд╛рджреНрд╡рд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рдмреАрдкреАрдПрдлрдЪреЗ рдореБрдЦреНрдп рд╡рд┐рджреНрдпрдорд╛рди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗрдд рдЖрдгрд┐ рдореНрд╣рдгреВрди рдкрд░рд╡рд╛рдирдЧреАрд╕рд╣ @eucariot, рдореА рдпрд╛ рдорд╛рд▓рд┐рдХреЗрд▓рд╛ "рд▓рд╣рд╛рди рдореБрд▓рд╛рдВрд╕рд╛рдареА BPF" рдореНрд╣рдЯрд▓реЗ рдЖрд╣реЗ, рдорд╣рд╛рди рдорд╛рд▓рд┐рдХреЗрдЪреНрдпрд╛ рд╕рдиреНрдорд╛рдирд╛рд░реНрде "рд▓рд╣рд╛рди рдореБрд▓рд╛рдВрд╕рд╛рдареА рдиреЗрдЯрд╡рд░реНрдХ".

BPF рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рддреАрд▓ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрд░реНрд╕ (c)

рдЖрдзреБрдирд┐рдХ BPF рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╣реЗ рддреНрдпрд╛рдЪ рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдЬреБрдиреНрдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреА рд╕реБрдзрд╛рд░рд┐рдд рдЖрдгрд┐ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЖрд╡реГрддреНрддреА рдЖрд╣реЗ, рдЬреНрдпрд╛рд▓рд╛ рдЖрддрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдореНрд╣рдгрддрд╛рдд рдЧреЛрдВрдзрд│ рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА. рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдпреБрдХреНрддрддрд╛ рддрдпрд╛рд░ рдХреЗрд▓реА рдЧреЗрд▓реА tcpdump, рдпрдВрддреНрд░рдгрд╛ seccomp, рддрд╕реЗрдЪ рдХрдореА рдЬреНрдЮрд╛рдд рдореЙрдбреНрдпреВрд▓реНрд╕ xt_bpf рддреЗ iptables рдЖрдгрд┐ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддрд╛ cls_bpf. рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ, рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рдЖрдкреЛрдЖрдк рдирд╡реАрди рд╕реНрд╡рд░реВрдкрд╛рдд рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд, рддрдерд╛рдкрд┐, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдПрдкреАрдЖрдп рдХрд╛рдпрдо рдЖрд╣реЗ рдЖрдгрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрд╕рд╛рдареА рдирд╡реАрди рдЙрдкрдпреЛрдЧ, рдЬрд╕реЗ рдЖрдкрдг рдпрд╛ рд▓реЗрдЦрд╛рдд рдкрд╛рд╣реВ, рдЕрдЬреВрдирд╣реА рд╢реЛрдзрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗрдд. рдпрд╛ рдХрд╛рд░рдгрд╛рд╕реНрддрд╡, рдЖрдгрд┐ рд▓рд┐рдирдХреНрд╕рдордзреАрд▓ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдлрдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рдЪреЗ рдЕрдиреБрд╕рд░рдг рдХреЗрд▓реНрдпрд╛рдореБрд│реЗ, рддреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреБрдирд┐рдХ рд╕реНрд╡рд░реВрдкрд╛рдд рдХрд╕реЗ рдЖрдгрд┐ рдХрд╛ рд╡рд┐рдХрд╕рд┐рдд рдЭрд╛рд▓реЗ рд╣реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдИрд▓, рдореА рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдл рдмрджреНрджрд▓рдЪреНрдпрд╛ рд▓реЗрдЦрд╛рд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд▓реЗ.

рдЧреЗрд▓реНрдпрд╛ рд╢рддрдХрд╛рдЪреНрдпрд╛ рдРрдВрд╢реАрдЪреНрдпрд╛ рджрд╢рдХрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА, рдкреНрд░рд╕рд┐рджреНрдз рд▓реЙрд░реЗрдиреНрд╕ рдмрд░реНрдХрд▓реЗ рдкреНрд░рдпреЛрдЧрд╢рд╛рд│реЗрддреАрд▓ рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрдирд╛ рдЧреЗрд▓реНрдпрд╛ рд╢рддрдХрд╛рдЪреНрдпрд╛ рдРрдВрд╢реАрдЪреНрдпрд╛ рджрд╢рдХрд╛рдЪреНрдпрд╛ рдЙрддреНрддрд░рд╛рд░реНрдзрд╛рдд рдЖрдзреБрдирд┐рдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░рд╡рд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреЕрдХреЗрдЯреНрд╕ рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХрд╕реЗ рдлрд┐рд▓реНрдЯрд░ рдХрд░рд╛рдпрдЪреЗ рдпрд╛ рдкреНрд░рд╢реНрдирд╛рдд рд░рд╕ рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓рд╛. рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрдЪреА рдореВрд│ рдХрд▓реНрдкрдирд╛, рдореВрд│рдд: CSPF (CMU/Stanford Packet Filter) рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдордзреНрдпреЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реА рдЧреЗрд▓реА, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреЕрдХреЗрдЯреНрд╕ рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рд▓рд╡рдХрд░ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреЗ, рдореНрд╣рдгрдЬреЗ. рдХрд░реНрдирд▓ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ, рдХрд╛рд░рдг рдпрд╛рдореБрд│реЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдгреЗ рдЯрд╛рд│рд▓реЗ рдЬрд╛рддреЗ. рдХрд░реНрдирд▓ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдХреЛрдб рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рд░рдирдЯрд╛рдЗрдо рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕рдБрдбрдмреЙрдХреНрд╕ рдХреЗрд▓реЗрд▓реЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╡рд╛рдкрд░рд▓реЗ рдЧреЗрд▓реЗ.

рддрдерд╛рдкрд┐, рд╡рд┐рджреНрдпрдорд╛рди рдлрд┐рд▓реНрдЯрд░реНрд╕рд╕рд╛рдареА рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╕реНрдЯреЕрдХ-рдЖрдзрд╛рд░рд┐рдд рдорд╢реАрдирд╡рд░ рдЪрд╛рд▓рдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реНрдпрд╛ рд╣реЛрддреНрдпрд╛ рдЖрдгрд┐ рдирд╡реАрди RISC рдорд╢реАрдирд╡рд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдиреЗ рдЪрд╛рд▓рдд рдирд╛рд╣реАрдд. рдкрд░рд┐рдгрд╛рдореА, рдмрд░реНрдХрд▓реЗ рд▓реЕрдмрдордзреАрд▓ рдЕрднрд┐рдпрдВрддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рддреВрди, рдПрдХ рдирд╡реАрди рдмреАрдкреАрдПрдл (рдмрд░реНрдХрд▓реЗ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░) рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рдЬреНрдпрд╛рдЪреЗ рдЖрднрд╛рд╕реА рдорд╢реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЛрдЯреЛрд░реЛрд▓рд╛ 6502 рдкреНрд░реЛрд╕реЗрд╕рд░рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗ рдЧреЗрд▓реЗ - рдЕрд╢рд╛ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЙрддреНрдкрд╛рджрдирд╛рдВрдЪреЗ рд╡рд░реНрдХрд╣реЛрд░реНрд╕. рдНрдкрд▓ рджреБрд╕рд░рд╛ рдХрд┐рдВрд╡рд╛ рдПрдирдИрдПрд╕. рдирд╡реАрди рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдиреЗ рд╡рд┐рджреНрдпрдорд╛рди рд╕реЛрд▓реНрдпреВрд╢рдиреНрд╕рдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рдлрд┐рд▓реНрдЯрд░ рдХрд╛рдордЧрд┐рд░реА рджрд╣рд╛рдкрдЯ рд╡рд╛рдврд╡рд▓реА рдЖрд╣реЗ.

рдмреАрдкреАрдПрдл рдорд╢реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрди рдЖрдореНрд╣реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рд╢реА рдХрд╛рд░реНрдпрд╢реАрд▓ рдорд╛рд░реНрдЧрд╛рдиреЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдК. рддрдерд╛рдкрд┐, рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рдЕрд╕реЗ рдореНрд╣рдгреВрдпрд╛ рдХреА рдорд╢реАрдирдордзреНрдпреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рд╡реЗрд╢рдпреЛрдЧреНрдп рджреЛрди 32-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛрддреЗ, рдПрдХ рд╕рдВрдЪрдпрдХ A рдЖрдгрд┐ рдЗрдВрдбреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ X, 64 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдорд░реА (16 рд╢рдмреНрдж), рд▓реЗрдЦрди рдЖрдгрд┐ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рд╡рд╛рдЪрдирд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз, рдЖрдгрд┐ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдорд╛рдВрдбрдЪреА рдПрдХ рдЫреЛрдЯреА рдкреНрд░рдгрд╛рд▓реА. рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдВрдордзреНрдпреЗ рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддреА рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬрдВрдк рд╕реВрдЪрдирд╛ рджреЗрдЦреАрд▓ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреНрдпрд╛, рдкрд░рдВрддреБ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡реЗрд│реЗрд╡рд░ рдкреВрд░реНрдг рд╣реЛрдгреНрдпрд╛рдЪреА рд╣рдореА рджреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдЬрдВрдк рдлрдХреНрдд рдкреБрдвреЗ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрддрд╛рдд, рдореНрд╣рдгрдЬреЗ, рд╡рд┐рд╢реЗрд╖рддрдГ, рд▓реВрдк рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рдордирд╛рдИ рд╣реЛрддреА.

рдорд╢реАрди рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЪреА рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдг рдпреЛрдЬрдирд╛ рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ. рд╡рд╛рдкрд░рдХрд░реНрддрд╛ BPF рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░рддреЛ рдЖрдгрд┐ рд╡рд╛рдкрд░реВрди рдХрд╛рд╣реА рдХрд░реНрдирд▓ рдореЗрдХреЕрдирд┐рдЭрдо (рдЬрд╕реЗ рдХреА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓), рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЛрдб рдХрд░рддреЗ рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рдХрд╛рд╣реА рд╕рд╛рдареА рдХрд░реНрдирд▓рдордзреАрд▓ рдЗрд╡реНрд╣реЗрдВрдЯ рдЬрдирд░реЗрдЯрд░рд▓рд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЗрд╡реНрд╣реЗрдВрдЯ рдореНрд╣рдгрдЬреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдбрд╡рд░реАрд▓ рдкреБрдвреАрд▓ рдкреЕрдХреЗрдЯрдЪреЗ рдЖрдЧрдорди). рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреА рдШрдЯрдирд╛ рдШрдбрддреЗ, рддреЗрд╡реНрд╣рд╛ рдХрд░реНрдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡рддреЗ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рджреБрднрд╛рд╖реНрдпрд╛рдордзреНрдпреЗ), рдЖрдгрд┐ рдорд╢реАрди рдореЗрдорд░реА рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЕрд╕рддреЗ рдХрд╛рд╣реА рд╕рд╛рдареА рдХрд░реНрдирд▓ рдореЗрдорд░реА рдкреНрд░рджреЗрд╢ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЗрдирдХрдорд┐рдВрдЧ рдкреЕрдХреЗрдЯрдЪрд╛ рдбреЗрдЯрд╛).

рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд░реАрд▓ рдЧреЛрд╖реНрдЯреА рдкреБрд░реЗрд╕реЗ рдЕрд╕рддреАрд▓: рдЖрд╡рд╢реНрдпрдХрддреЗрдиреБрд╕рд╛рд░ рдЖрдореНрд╣реА рд╕рд┐рд╕реНрдЯрдо рдЖрдгрд┐ рдХрдорд╛рдВрдб рдлреЙрд░рдореЕрдЯрд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдК. рдЬрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдирдЪреНрдпрд╛ рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдордЪрд╛ рддрд╛рдмрдбрддреЛрдм рдЕрднреНрдпрд╛рд╕ рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддреНрдпрд╛рддреАрд▓ рд╕рд░реНрд╡ рдХреНрд╖рдорддрд╛ рдЬрд╛рдгреВрди рдШреНрдпрд╛рдпрдЪреНрдпрд╛ рдЕрд╕рддреАрд▓ рддрд░ рддреБрдореНрд╣реА рдореВрд│ рд▓реЗрдЦ рд╡рд╛рдЪреВ рд╢рдХрддрд╛. рдмреАрдПрд╕рдбреА рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░ рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ рдлрд╛рдЗрд▓рдЪрд╛ рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ Documentation/networking/filter.txt рдХрд░реНрдирд▓ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рддреВрди. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдЖрдкрдг рд╕рд╛рджрд░реАрдХрд░рдгрд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реВ рд╢рдХрддрд╛ libpcap: рдкреЕрдХреЗрдЯ рдХреЕрдкреНрдЪрд░рд╕рд╛рдареА рдПрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдкрджреНрдзрдд, рдЬреНрдпрд╛рдордзреНрдпреЗ рдореЕрдХрдХреЗрди, рдмреАрдкреАрдПрдлрдЪреНрдпрд╛ рд▓реЗрдЦрдХрд╛рдВрдкреИрдХреА рдПрдХ, рдирд┐рд░реНрдорд┐рддреАрдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рдмрджреНрджрд▓ рдмреЛрд▓рддреЛ libpcap.

рдЖрдореНрд╣реА рдЖрддрд╛ рд▓рд┐рдирдХреНрд╕рд╡рд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕рд░реНрд╡ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ: tcpdump (libpcap), seccomp, xt_bpf, cls_bpf.

tcpdump

рдмреАрдкреАрдПрдлрдЪрд╛ рд╡рд┐рдХрд╛рд╕ рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрд╕рд╛рдареА рдлреНрд░рдВрдЯрдПрдВрдбрдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рд╕рдорд╛рдВрддрд░рдкрдгреЗ рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ - рдПрдХ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдпреБрдХреНрддрддрд╛ tcpdump. рдЖрдгрд┐, рд╣реЗ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬреБрдиреЗ рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рдкреНрд░рд╕рд┐рджреНрдз рдЙрджрд╛рд╣рд░рдг рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдЕрдиреЗрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯреАрдорд╡рд░ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ, рдЖрдореНрд╣реА рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪрд╛ рдЖрдордЪрд╛ рдЕрднреНрдпрд╛рд╕ рд╕реБрд░реВ рдХрд░реВ.

(рдореА рд▓рд┐рдирдХреНрд╕рд╡рд░ рдпрд╛ рд▓реЗрдЦрд╛рддреАрд▓ рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ рдЪрд╛рд▓рд╡рд▓реА 5.6.0-rc6. рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рд╡рд╛рдЪрдиреАрдпрддреЗрд╕рд╛рдареА рдХрд╛рд╣реА рдХрдорд╛рдВрдбреНрд╕рдЪреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕рдВрдкрд╛рджрд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ.)

рдЙрджрд╛рд╣рд░рдг: IPv6 рдкреЕрдХреЗрдЯрдЪреЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдгреЗ

рдЪрд▓рд╛ рдХрд▓реНрдкрдирд╛ рдХрд░реВрдпрд╛ рдХреА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЗрдВрдЯрд░рдлреЗрд╕рд╡рд░ рд╕рд░реНрд╡ IPv6 рдкреЕрдХреЗрдЯреНрд╕ рдкрд╣рд╛рдпрдЪреЗ рдЖрд╣реЗрдд eth0. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдкрдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ tcpdump рд╕рд╛рдзреНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рд╕рд╣ ip6:

$ sudo tcpdump -i eth0 ip6

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ tcpdump рдлрд┐рд▓реНрдЯрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ ip6 BPF рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрд╛рдЗрдЯрдХреЛрдбрдордзреНрдпреЗ рдЖрдгрд┐ рдХрд░реНрдирд▓рд╡рд░ рдкрд╛рдард╡рд╛ (рд╡рд┐рднрд╛рдЧрд╛рддреАрд▓ рддрдкрд╢реАрд▓ рдкрд╣рд╛ Tcpdump: рд▓реЛрдб рд╣реЛрдд рдЖрд╣реЗ). рд▓реЛрдб рдХреЗрд▓реЗрд▓реЗ рдлрд┐рд▓реНрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕рдордзреВрди рдЬрд╛рдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреЕрдХреЗрдЯрд╕рд╛рдареА рдЪрд╛рд▓рд╡рд▓реЗ рдЬрд╛рдИрд▓ eth0. рдЬрд░ рдлрд┐рд▓реНрдЯрд░ рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓реЗ рдореВрд▓реНрдп рдкрд░рдд рдХрд░рдд рдЕрд╕реЗрд▓ n, рдирдВрддрд░ рдкрд░реНрдпрдВрдд n рдкреЕрдХреЗрдЯрдЪреЗ рдмрд╛рдЗрдЯреНрд╕ рдпреБрдЬрд░ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдХреЙрдкреА рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓ рдЖрдгрд┐ рдЖрдореНрд╣реА рддреЗ рдЖрдЙрдЯрдкреБрдЯрдордзреНрдпреЗ рдкрд╛рд╣реВ tcpdump.

рд▓рд╣рд╛рди рдореБрд▓рд╛рдВрд╕рд╛рдареА BPF, рднрд╛рдЧ рд╢реВрдиреНрдп: рдХреНрд▓рд╛рд╕рд┐рдХ BPF

рдЕрд╕реЗ рджрд┐рд╕реВрди рдЖрд▓реЗ рдХреА рдХрд░реНрдирд▓рд▓рд╛ рдХреЛрдгрддрд╛ рдмрд╛рдпрдХреЛрдб рдкрд╛рдард╡рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рд╣реЗ рдЖрдкрдг рд╕рд╣рдЬрдкрдгреЗ рд╢реЛрдзреВ рд╢рдХрддреЛ tcpdump рдЪреНрдпрд╛ рдорджрддреАрдиреЗ tcpdump, рдЖрдореНрд╣реА рддреЗ рдкрд░реНрдпрд╛рдпрд╛рд╕рд╣ рдЪрд╛рд▓рд╡рд▓реНрдпрд╛рд╕ -d:

$ sudo tcpdump -i eth0 -d ip6
(000) ldh      [12]
(001) jeq      #0x86dd          jt 2    jf 3
(002) ret      #262144
(003) ret      #0

рд╢реВрдиреНрдпрд╛рд╡рд░ рдЖрдкрдг рдХрдорд╛рдВрдб рд░рди рдХрд░рддреЛ ldh [12], рдЬреНрдпрд╛рдЪрд╛ рдЕрд░реНрде тАЬрд▓реЛрдб рдЗрди рд░рдЬрд┐рд╕реНрдЯрд░ A рдЕрд░реНрдзрд╛ рд╢рдмреНрдж (16 рдмрд┐рдЯ) рдкрддреНрддрд╛ 12 рд╡рд░ рд╕реНрдерд┐рдд рдЖрд╣реЗтАЭ рдЖрдгрд┐ рдПрдХрдЪ рдкреНрд░рд╢реНрди рдЖрд╣реЗ рдХреА рдЖрдкрдг рдХреЛрдгрддреНрдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреА рдореЗрдорд░реА рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдд рдЖрд╣реЛрдд? рдЙрддреНрддрд░ рдЖрд╣реЗ рдХреА рдпреЗрдереЗ x рд╕реБрд░реВ рд╣реЛрддреЗ (x+1)рд╡рд┐рд╢реНтАНрд▓реЗрд╖рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рдкреЕрдХреЗрдЯрдЪрд╛ рд╡рд╛ рдмрд╛рдЗрдЯ. рдЖрдореНрд╣реА рдЗрдерд░рдиреЗрдЯ рдЗрдВрдЯрд░рдлреЗрд╕рдордзреВрди рдкреЕрдХреЗрдЯ рд╡рд╛рдЪрддреЛ eth0рдЖрдгрд┐ рд╣реЗ рдореНрд╣рдгрдЬреЗрдкреЕрдХреЗрдЯ рдЕрд╕реЗ рджрд┐рд╕рддреЗ (рд╕рд╛рдзреЗрдкрдгрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЧреГрд╣реАрдд рдзрд░рддреЛ рдХреА рдкреЕрдХреЗрдЯрдордзреНрдпреЗ рдХреЛрдгрддреЗрд╣реА VLAN рдЯреЕрдЧ рдирд╛рд╣реАрдд):

       6              6          2
|Destination MAC|Source MAC|Ether Type|...|

рддрд░ рдЖрдЬреНрдЮрд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реНрдпрд╛рдирдВрддрд░ ldh [12] рд░рдЬрд┐рд╕реНрдЯрд░ рдордзреНрдпреЗ A рдПрдХ рдлреАрд▓реНрдб рдЕрд╕реЗрд▓ Ether Type тАФ рдпрд╛ рдЗрдерд░рдиреЗрдЯ рдлреНрд░реЗрдордордзреНрдпреЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреЕрдХреЗрдЯрдЪрд╛ рдкреНрд░рдХрд╛рд░. рдУрд│ 1 рд╡рд░ рдЖрдореНрд╣реА рд░рдЬрд┐рд╕реНрдЯрд░рдордзреАрд▓ рд╕рд╛рдордЧреНрд░реАрдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЛ A (рдкреЕрдХреЗрдЬ рдкреНрд░рдХрд╛рд░) c 0x86ddрдЖрдгрд┐ рд╣реЗ рдЖрдгрд┐ рдЖрд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓рд╛ рдкреНрд░рдХрд╛рд░ IPv6 рдЖрд╣реЗ. рдУрд│ 1 рд╡рд░, рддреБрд▓рдирд╛ рдЖрджреЗрд╢рд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдЖрдгрдЦреА рджреЛрди рд╕реНрддрдВрдн рдЖрд╣реЗрдд - jt 2 ╨╕ jf 3 рддреБрд▓рдирд╛ рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреНрдпрд╛ рдЧреБрдгрд╛рдВрд╡рд░ рдЬрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ (A == 0x86dd) рдЖрдгрд┐ рдЕрдпрд╢рд╕реНрд╡реА. рдореНрд╣рдгреВрди, рдпрд╢рд╕реНрд╡реА рдХреЗрд╕рдордзреНрдпреЗ (IPv6) рдЖрдкрдг рдУрд│ 2 рд╡рд░ рдЬрд╛рддреЛ, рдЖрдгрд┐ рдЕрдпрд╢рд╕реНрд╡реА рдкреНрд░рдХрд░рдгрд╛рдд - 3 рд╡реНрдпрд╛ рдУрд│реАрд╡рд░. рдУрд│реА 3 рд╡рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб 0 рд╕рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЛ (рдкреЕрдХреЗрдЯ рдХреЙрдкреА рдХрд░реВ рдирдХрд╛), 2 рд╡реНрдпрд╛ рдУрд│реАрд╡рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдбрд╕рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЛ. 262144 (рдорд▓рд╛ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд 256 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯреНрд╕рдЪреЗ рдкреЕрдХреЗрдЬ рдХреЙрдкреА рдХрд░рд╛).

рдПрдХ рдЕрдзрд┐рдХ рдХреНрд▓рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг: рдЖрдореНрд╣реА рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯрджреНрд╡рд╛рд░реЗ TCP рдкреЕрдХреЗрдЯреНрд╕ рдкрд╛рд╣рддреЛ

рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдХрд╕рд╛ рджрд┐рд╕рддреЛ рддреЗ рдкрд╛рд╣реВ рдпрд╛ рдЬреЗ рд╕рд░реНрд╡ TCP рдкреЕрдХреЗрдЯреНрд╕ рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ 666 рд╕рд╣ рдХреЙрдкреА рдХрд░рддреЗ. рдЖрдореНрд╣реА IPv4 рдХреЗрд╕рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ, рдХрд╛рд░рдг IPv6 рдХреЗрд╕ рд╕реЛрдкреЗ рдЖрд╣реЗ. рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣реА рд╕реНрд╡рддрдГрд▓рд╛ рдПрдХ рд╡реНрдпрд╛рдпрд╛рдо рдореНрд╣рдгреВрди IPv6 рдлрд┐рд▓реНрдЯрд░ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░реВ рд╢рдХрддрд╛ (ip6 and tcp dst port 666) рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХреЗрд╕рд╕рд╛рдареА рдлрд┐рд▓реНрдЯрд░ (tcp dst port 666). рддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реЗрд▓реЗ рдлрд┐рд▓реНрдЯрд░ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

$ sudo tcpdump -i eth0 -d ip and tcp dst port 666
(000) ldh      [12]
(001) jeq      #0x800           jt 2    jf 10
(002) ldb      [23]
(003) jeq      #0x6             jt 4    jf 10
(004) ldh      [20]
(005) jset     #0x1fff          jt 10   jf 6
(006) ldxb     4*([14]&0xf)
(007) ldh      [x + 16]
(008) jeq      #0x29a           jt 9    jf 10
(009) ret      #262144
(010) ret      #0

рдУрд│реА 0 рдЖрдгрд┐ 1 рдХрд╛рдп рдХрд░рддрд╛рдд рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ. рдУрд│ 2 рд╡рд░ рдЖрдореНрд╣реА рдЖрдзреАрдЪ рддрдкрд╛рд╕рд▓реЗ рдЖрд╣реЗ рдХреА рд╣реЗ IPv4 рдкреЕрдХреЗрдЯ рдЖрд╣реЗ (рдЗрдерд░ рдкреНрд░рдХрд╛рд░ = 0x800) рдЖрдгрд┐ рддреЗ рд░рдЬрд┐рд╕реНрдЯрд░рдордзреНрдпреЗ рд▓реЛрдб рдХрд░рд╛ A рдкреЕрдХреЗрдЯрдЪрд╛ 24 рд╡рд╛ рдмрд╛рдЗрдЯ. рдЖрдордЪреЗ рдкреЕрдХреЗрдЬ рдЕрд╕реЗ рджрд┐рд╕рддреЗ

       14            8      1     1
|ethernet header|ip fields|ttl|protocol|...|

рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЖрдореНрд╣реА рд░рдЬрд┐рд╕реНрдЯрд░рдордзреНрдпреЗ рд▓реЛрдб рдХрд░рддреЛ A IP рд╣реЗрдбрд░рдЪреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдлреАрд▓реНрдб, рдЬреЗ рд▓реЙрдЬрд┐рдХрд▓ рдЖрд╣реЗ, рдХрд╛рд░рдг рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд TCP рдкреЕрдХреЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рд╛рдпрдЪреЗ рдЖрд╣реЗрдд. рдЖрдореНрд╣реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╢реА рддреБрд▓рдирд╛ рдХрд░рддреЛ 0x6 (IPPROTO_TCPрдУрд│ 3 рд╡рд░.

рдУрд│реА 4 рдЖрдгрд┐ 5 рд╡рд░ рдЖрдореНрд╣реА рдкрддреНрддрд╛ 20 рд╡рд░ рд╕реНрдерд┐рдд рдЕрд░реНрдзрд╢рдмреНрдж рд▓реЛрдб рдХрд░рддреЛ рдЖрдгрд┐ рдХрдорд╛рдВрдб рд╡рд╛рдкрд░рддреЛ jset рддреАрдирдкреИрдХреА рдПрдХ рд╕реЗрдЯ рдЖрд╣реЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕рд╛ рдЭреЗрдВрдбреЗ - рдЬрд╛рд░реА рдХреЗрд▓реЗрд▓рд╛ рдорд╛рд╕реНрдХ рдкрд░рд┐рдзрд╛рди jset рддреАрди рд╕рд░реНрд╡рд╛рдд рд▓рдХреНрд╖рдгреАрдп рдмрд┐рдЯ рд╕рд╛рдл рдХреЗрд▓реЗ рдЖрд╣реЗрдд. рддреАрди рдмрд┐рдЯреНрд╕рдкреИрдХреА рджреЛрди рдкреЕрдХреЗрдЯ рдЦрдВрдбрд┐рдд IP рдкреЕрдХреЗрдЯрдЪрд╛ рднрд╛рдЧ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧрддрд╛рдд рдЖрдгрд┐ рддрд╕реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреЛ рд╢реЗрд╡рдЯрдЪрд╛ рддреБрдХрдбрд╛ рдЖрд╣реЗ рдХреА рдирд╛рд╣реА. рддрд┐рд╕рд░рд╛ рдмрд┐рдЯ рдЖрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ рд╢реВрдиреНрдп рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдореНрд╣реА рдПрдХрддрд░ рдЕрдкреВрд░реНрдг рдХрд┐рдВрд╡рд╛ рддреБрдЯрд▓реЗрд▓реА рдкреЕрдХреЗрдЯ рддрдкрд╛рд╕реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рддрд┐рдиреНрд╣реА рдмрд┐рдЯреНрд╕ рддрдкрд╛рд╕рддреЛ.

рдпрд╛ рд╕реВрдЪреАрдордзреНрдпреЗ рд▓рд╛рдЗрди 6 рд╕рд░реНрд╡рд╛рдд рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ. рдЕрднрд┐рд╡реНрдпрдХреНрддреА ldxb 4*([14]&0xf) рдореНрд╣рдгрдЬреЗ рдЖрдореНрд╣реА рд░рдЬрд┐рд╕реНрдЯрд░рдордзреНрдпреЗ рд▓реЛрдб рдХрд░рддреЛ X рдкреЕрдХреЗрдЯрдЪреНрдпрд╛ рдкрдВрдзрд░рд╛рд╡реНрдпрд╛ рдмрд╛рдЗрдЯрдЪреЗ рдХрд┐рдорд╛рди рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ 4 рдиреЗ рдЧреБрдгрд▓реЗ. рдкрдВрдзрд░рд╛рд╡реНрдпрд╛ рдмрд╛рдЗрдЯрдЪреЗ рд╕рд░реНрд╡рд╛рдд рдХрдореА рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЪрд╛рд░ рдмрд┐рдЯреНрд╕ рд╣реЗ рдлреАрд▓реНрдб рдЖрд╣реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рд╣реЗрдбрд░рдЪреА рд▓рд╛рдВрдмреА IPv4 рд╣реЗрдбрд░, рдЬреЗ рд╣реЗрдбрд░рдЪреА рд▓рд╛рдВрдмреА рд╢рдмреНрджрд╛рдВрдордзреНрдпреЗ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рддреЗ, рддреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣рд╛рд▓рд╛ 4 рдиреЗ рдЧреБрдгрд╛рдХрд╛рд░ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧреЗрд▓. рд╡рд┐рд╢реЗрд╖ рдореНрд╣рдгрдЬреЗ, рдЕрднрд┐рд╡реНрдпрдХреНрддреА 4*([14]&0xf) рд╣реЗ рдПрдХрд╛ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдмреЛрдзрд┐рдд рдпреЛрдЬрдиреЗрдЪреЗ рдкрджрдирд╛рдо рдЖрд╣реЗ рдЬреЗ рдХреЗрд╡рд│ рдпрд╛ рдлреЙрд░реНрдордордзреНрдпреЗ рдЖрдгрд┐ рдлрдХреНрдд рдиреЛрдВрджрдгреАрд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ X, рдореНрд╣рдгрдЬреЗ рдЖрдореНрд╣реАрд╣реА рд╕рд╛рдВрдЧреВ рд╢рдХрдд рдирд╛рд╣реА ldb 4*([14]&0xf) рдирд╛рд╣реА ldxb 5*([14]&0xf) (рдЖрдореНрд╣реА рдлрдХреНрдд рднрд┐рдиреНрди рдСрдлрд╕реЗрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, ldxb 4*([16]&0xf)). рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдХреА рд╣реА рдЕреЕрдбреНрд░реЗрд╕рд┐рдВрдЧ рдпреЛрдЬрдирд╛ рдмреАрдкреАрдПрдлрдордзреНрдпреЗ рдЕрдЪреВрдХрдкрдгреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рдЖрд╣реЗ X (рдЗрдВрдбреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░) IPv4 рд╢реАрд░реНрд╖рд▓реЗрдЦ рд▓рд╛рдВрдмреА.

рддрд░ ренрд╡реНрдпрд╛ рдУрд│реАрд╡рд░ рдЖрдкрдг рдЕрд░реНрдзрд╛ рд╢рдмреНрдж рдпреЗрдереЗ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЛ (X+16). рдЗрдерд░рдиреЗрдЯ рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдиреЗ 14 рдмрд╛рдЗрдЯреНрд╕ рд╡реНрдпрд╛рдкрд▓реЗрд▓реЗ рдЖрд╣реЗрдд рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рдгреЗ, рдЖрдгрд┐ X IPv4 рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдЪреА рд▓рд╛рдВрдмреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ, рдЖрдореНрд╣реА рд╕рдордЬрддреЛ рдХреА рдордзреНрдпреЗ A TCP рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯ рд▓реЛрдб рдХреЗрд▓реЗ рдЖрд╣реЗ:

       14           X           2             2
|ethernet header|ip header|source port|destination port|

рд╢реЗрд╡рдЯреА, 8 рд╡реНрдпрд╛ рдУрд│реАрд╡рд░ рдЖрдореНрд╣реА рдЗрдЪреНрдЫрд┐рдд рдореВрд▓реНрдпрд╛рд╕рд╣ рдЧрдВрддрд╡реНрдп рдкреЛрд░реНрдЯрдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЛ рдЖрдгрд┐ 9 рдХрд┐рдВрд╡рд╛ 10 рд╡реНрдпрд╛ рдУрд│реАрдВрд╡рд░ рдЖрдореНрд╣реА рдкрд░рд┐рдгрд╛рдо рдкрд░рдд рдХрд░рддреЛ - рдкреЕрдХреЗрдЯ рдХреЙрдкреА рдХрд░рд╛рдпрдЪреЗ рдХреА рдирд╛рд╣реА.

Tcpdump: рд▓реЛрдб рд╣реЛрдд рдЖрд╣реЗ

рдорд╛рдЧреАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ, рдЖрдореНрд╣реА рд╡рд┐рд╢реЗрд╖рдд: рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░рд┐рдВрдЧрд╕рд╛рдареА рдХрд░реНрдирд▓рдордзреНрдпреЗ рдмреАрдкреАрдПрдл рдмрд╛рдпрдХреЛрдб рдХрд╕реЗ рд▓реЛрдб рдХрд░рддреЛ рдпрд╛рдмрджреНрджрд▓ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛ рдирд╛рд╣реА. рд╕рд╛рдзрд╛рд░рдгрддрдГ рдмреЛрд▓рд╛рддрд╛рдВрдиреА, tcpdump рдЕрдиреЗрдХ рд╕рд┐рд╕реНрдЯреАрдорд╡рд░ рдЖрдгрд┐ рдлрд┐рд▓реНрдЯрд░рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреЛрд░реНрдЯ рдХреЗрд▓реЗрд▓реЗ tcpdump рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░рддреЗ libpcap. рдереЛрдбрдХреНрдпрд╛рдд, рд╡рд╛рдкрд░реВрди рдЗрдВрдЯрд░рдлреЗрд╕рд╡рд░ рдлрд┐рд▓реНрдЯрд░ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА libpcap, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рдЧреЛрд╖реНрдЯреА рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

  • рдПрдХ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рддрдпрд╛рд░ рдХрд░рд╛ pcap_t рдЗрдВрдЯрд░рдлреЗрд╕ рдирд╛рд╡рд╛рд╡рд░реВрди: pcap_create,
  • рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдХреНрд░рд┐рдп рдХрд░рд╛: pcap_activate,
  • рдлрд┐рд▓реНрдЯрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рд╛: pcap_compile,
  • рдлрд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рд╛: pcap_setfilter.

рдХрд╛рд░реНрдп рдХрд╕реЗ рдЖрд╣реЗ рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА pcap_setfilter рд▓рд┐рдирдХреНрд╕ рдордзреНрдпреЗ рд▓рд╛рдЧреВ, рдЖрдореНрд╣реА рд╡рд╛рдкрд░рддреЛ strace (рдХрд╛рд╣реА рдУрд│реА рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реНрдпрд╛ рдЖрд╣реЗрдд):

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

рдЖрдЙрдЯрдкреБрдЯрдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рджреЛрди рдУрд│реАрдВрд╡рд░ рдЖрдкрдг рддрдпрд╛рд░ рдХрд░рддреЛ рдХрдЪреНрдЪрд╛ рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡ рдЗрдерд░рдиреЗрдЯ рдлреНрд░реЗрдореНрд╕ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреЗ рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рдмрд╛рдВрдзрдгреНрдпрд╛рд╕рд╛рдареА eth0... рдкрд╛рд╕реВрди рдЖрдордЪреЗ рдкрд╣рд┐рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рдлрд┐рд▓реНрдЯрд░ ip рдЪрд╛рд░ BPF рд╕реВрдЪрдирд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕реЗрд▓ рдЖрдгрд┐ рддрд┐рд╕рд▒реНрдпрд╛ рдУрд│реАрд╡рд░ рдЖрдкрдг рдкрд░реНрдпрд╛рдп рдХрд╕рд╛ рд╡рд╛рдкрд░рд╛рдпрдЪрд╛ рддреЗ рдкрд╛рд╣реВ SO_ATTACH_FILTER рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ setsockopt рдЖрдореНрд╣реА 4 рд▓рд╛рдВрдмреАрдЪрд╛ рдлрд┐рд▓реНрдЯрд░ рд▓реЛрдб рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ. рд╣реЗ рдЖрдордЪреЗ рдлрд┐рд▓реНрдЯрд░ рдЖрд╣реЗ.

рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ рдХреА рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрдордзреНрдпреЗ, рдлрд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд░рдгреЗ рдЖрдгрд┐ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ рдиреЗрд╣рдореАрдЪ рдЕрдгреВ рдСрдкрд░реЗрд╢рди рдореНрд╣рдгреВрди рд╣реЛрддреЗ рдЖрдгрд┐ рдмреАрдкреАрдПрдлрдЪреНрдпрд╛ рдирд╡реАрди рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЛрдб рдХрд░рдгреЗ рдЖрдгрд┐ рдЗрд╡реНрд╣реЗрдВрдЯ рдЬрдирд░реЗрдЯрд░рд▓рд╛ рдмрдВрдзрдирдХрд╛рд░рдХ рдХрд░рдгреЗ рд╡реЗрд│реЗрдд рд╡реЗрдЧрд│реЗ рдХреЗрд▓реЗ рдЬрд╛рддреЗ.

рд▓рдкрд▓реЗрд▓реЗ рд╕рддреНрдп

рдЖрдЙрдЯрдкреБрдЯрдЪреА рдереЛрдбреА рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдЖрд╡реГрддреНрддреА рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

$ sudo strace -f -e trace=%network tcpdump -p -i eth0 ip
socket(AF_PACKET, SOCK_RAW, 768)        = 3
bind(3, {sa_family=AF_PACKET, sll_protocol=htons(ETH_P_ALL), sll_ifindex=if_nametoindex("eth0"), sll_hatype=ARPHRD_NETROM, sll_pkttype=PACKET_HOST, sll_halen=0}, 20) = 0
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=1, filter=0xbeefbeefbeef}, 16) = 0
recvfrom(3, 0x7ffcad394257, 1, MSG_TRUNC, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
setsockopt(3, SOL_SOCKET, SO_ATTACH_FILTER, {len=4, filter=0xb00bb00bb00b}, 16) = 0
...

рд╡рд░ рдирдореВрдж рдХреЗрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЖрдореНрд╣реА рдЖрдордЪреЗ рдлрд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд░рддреЛ рдЖрдгрд┐ 5 рд╡реНрдпрд╛ рдУрд│реАрд╡рд░ рд╕реЙрдХреЗрдЯрд╢реА рдХрдиреЗрдХреНрдЯ рдХрд░рддреЛ, рдкрд░рдВрддреБ 3 рдЖрдгрд┐ 4 рдУрд│реАрдВрд╡рд░ рдХрд╛рдп рд╣реЛрддреЗ? рд╣реЗ рдмрд╛рд╣реЗрд░ рд╡рд│рддреЗ рдХреА рд╣реЗ libpcap рдЖрдордЪреА рдХрд╛рд│рдЬреА рдШреЗрддреЗ - рдЬреЗрдгреЗрдХрд░реБрди рдЖрдордЪреНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рдЪреНрдпрд╛ рдЖрдЙрдЯрдкреБрдЯрдордзреНрдпреЗ рд▓рд╛рдпрдмреНрд░рд░реАрдЪреЗ рд╕рдорд╛рдзрд╛рди рди рдХрд░рдгрд╛рд░реЗ рдкреЕрдХреЗрдЯ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдирд╕рд╛рд╡реЗрдд рдЬреЛрдбрддреЗ рдбрдореА рдлрд┐рд▓реНрдЯрд░ ret #0 (рд╕рд░реНрд╡ рдкреЕрдХреЗрдЯреНрд╕ рдбреНрд░реЙрдк рдХрд░рд╛), рд╕реЙрдХреЗрдЯрд▓рд╛ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдореЛрдбрд╡рд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рдЖрдгрд┐ рдорд╛рдЧреАрд▓ рдлрд┐рд▓реНрдЯрд░реНрд╕рдордзреВрди рд░рд╛рд╣рд┐рд▓реЗрд▓реА рд╕рд░реНрд╡ рдкреЕрдХреЗрдЯреНрд╕ рд╡рдЬрд╛ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЗ.

рдПрдХрдВрджрд░реАрдд, рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд╛рдкрд░реВрди рд▓рд┐рдирдХреНрд╕рд╡рд░ рдкреЕрдХреЗрдЬреЗрд╕ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдордЪреНрдпрд╛рдХрдбреЗ рд╕рдВрд░рдЪрдиреЗрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдлрд┐рд▓реНрдЯрд░ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬрд╕реЗ рдХреА struct sock_fprog рдЖрдгрд┐ рдПрдХ рдУрдкрди рд╕реЙрдХреЗрдЯ, рдЬреНрдпрд╛рдирдВрддрд░ рдлрд┐рд▓реНрдЯрд░рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рд╕реЙрдХреЗрдЯрд╢реА рд╕рдВрд▓рдЧреНрди рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ setsockopt.

рд╡рд┐рд╢реЗрд╖ рдореНрд╣рдгрдЬреЗ, рдлрд┐рд▓реНрдЯрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реЙрдХреЗрдЯрд╢реА рд╕рдВрд▓рдЧреНрди рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ, рдХреЗрд╡рд│ рдХрдЪреНрдЪрд╛ рдирд╛рд╣реА. рдпреЗрдереЗ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рд╕рд░реНрд╡ рдпреЗрдгрд╛рд░реНтАНрдпрд╛ UDP рдбреЗрдЯрд╛рдЧреНрд░рд╛рдордордзреВрди рдкрд╣рд┐рд▓реНрдпрд╛ рджреЛрди рдмрд╛рдЗрдЯреНрд╕рд╢рд┐рд╡рд╛рдп рд╕рд░реНрд╡ рдХрд╛рдкрддреЛ. (рд▓реЗрдЦрд╛рдд рдЧреЛрдВрдзрд│ рд╣реЛрдК рдирдпреЗ рдореНрд╣рдгреВрди рдореА рдХреЛрдбрдордзреНрдпреЗ рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рдЬреЛрдбрд▓реНрдпрд╛ рдЖрд╣реЗрдд.)

рд╡рд╛рдкрд░рд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓ setsockopt рдлрд┐рд▓реНрдЯрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдкрд╣рд╛ рд╕реЙрдХреЗрдЯ(рен), рдкрдг рдЬрд╕реЗ рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдмрджреНрджрд▓ struct sock_fprog рдорджрддреАрд╢рд┐рд╡рд╛рдп tcpdump рдЖрдореНрд╣реА рд╡рд┐рднрд╛рдЧрд╛рдд рдмреЛрд▓реВ рдЖрдордЪреНрдпрд╛ рд╕реНрд╡рдд: рдЪреНрдпрд╛ рд╣рд╛рддрд╛рдВрдиреА рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ.

рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЖрдгрд┐ 21 рд╡реЗ рд╢рддрдХ

BPF 1997 рдордзреНрдпреЗ рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрдгрд┐ рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рддреЗ рдХрд╛рд░реНрдпрд░рдд рдЖрд╣реЗ libpcap рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡рд┐рд╢реЗрд╖ рдмрджрд▓рд╛рдВрд╢рд┐рд╡рд╛рдп (рд▓рд┐рдирдХреНрд╕-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрджрд▓, рдЕрд░реНрдерд╛рддрдЪ, рддреЛ рд╣реЛрддрд╛, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдиреА рдЬрд╛рдЧрддрд┐рдХ рдЪрд┐рддреНрд░ рдмрджрд▓рд▓реЗ рдирд╛рд╣реА). рдмреАрдкреАрдПрдл рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдгреНрдпрд╛рдЪреА рдкрд╣рд┐рд▓реА рдЧрдВрднреАрд░ рдЪрд┐рдиреНрд╣реЗ 2011 рдордзреНрдпреЗ рдЖрд▓реА, рдЬреЗрд╡реНрд╣рд╛ рдПрд░рд┐рдХ рдбреБрдорд╛рдЭреЗрдЯрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗрд▓реЗ. рдкреЕрдЪ, рдЬреЗ рдХрд░реНрдирд▓рдордзреНрдпреЗ Just In Time Compiler рдЬреЛрдбрддреЗ - BPF bytecode рдиреЗрдЯрд┐рд╡реНрд╣рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреБрд╡рд╛рджрдХ x86_64 рдХреЛрдб

рдЬреЗрдЖрдпрдЯреА рдХрдВрдкрд╛рдЗрд▓рд░ рдмрджрд▓рд╛рдВрдЪреНрдпрд╛ рд╕рд╛рдЦрд│реАрддреАрд▓ рдкрд╣рд┐рд▓реЗ рд╣реЛрддреЗ: 2012 рдордзреНрдпреЗ рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реЗ рд╕рд╛рдареА рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рд╕реЗрдХреЙрдореНрдк, BPF рд╡рд╛рдкрд░реВрди, рдЬрд╛рдиреЗрд╡рд╛рд░реА 2013 рдордзреНрдпреЗ рд╣реЛрддреЗ рдЬреЛрдбрд▓реЗ рдореЙрдбреНрдпреВрд▓ xt_bpf, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд┐рдпрдо рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ iptables BPF рдЪреНрдпрд╛ рдорджрддреАрдиреЗ, рдЖрдгрд┐ рдСрдХреНрдЯреЛрдмрд░ 2013 рдордзреНрдпреЗ рд╣реЛрддреЗ рдЬреЛрдбрд▓реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рджреЗрдЦреАрд▓ cls_bpf, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ BPF рд╡рд╛рдкрд░реВрди рд░рд╣рджрд╛рд░реА рд╡рд░реНрдЧреАрдХрд░рдг рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ.

рдЖрдореНрд╣реА рд▓рд╡рдХрд░рдЪ рд╣реА рд╕рд░реНрд╡ рдЙрджрд╛рд╣рд░рдгреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ, рдкрд░рдВрддреБ рдкреНрд░рдердо BPF рд╕рд╛рдареА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╕реЗ рд▓рд┐рд╣рд╛рд╡реЗ рдЖрдгрд┐ рд╕рдВрдХрд▓рд┐рдд рдХрд░рд╛рд╡реЗ рд╣реЗ рд╢рд┐рдХрдгреЗ рдЖрдкрд▓реНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░реЗрд▓, рдХрд╛рд░рдг рд▓рд╛рдпрдмреНрд░рд░реАрджреНрд╡рд╛рд░реЗ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреНрд╖рдорддрд╛ libpcap рдорд░реНрдпрд╛рджрд┐рдд (рд╕рд╛рдзреЗ рдЙрджрд╛рд╣рд░рдг: рдлрд┐рд▓реНрдЯрд░ рд╡реНрдпреБрддреНрдкрдиреНрди libpcap рдлрдХреНрдд рджреЛрди рдореВрд▓реНрдпреЗ рдкрд░рдд рдХрд░реВ рд╢рдХрддрд╛рдд - 0 рдХрд┐рдВрд╡рд╛ 0x40000) рдХрд┐рдВрд╡рд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ, seccomp рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рд▓рд╛рдЧреВ рд╣реЛрдд рдирд╛рд╣реАрдд.

рдЖрдордЪреНрдпрд╛ рд╕реНрд╡рдд: рдЪреНрдпрд╛ рд╣рд╛рддрд╛рдВрдиреА рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ

рдЪрд▓рд╛ рдмреАрдкреАрдПрдл рдирд┐рд░реНрджреЗрд╢рд╛рдВрдЪреНрдпрд╛ рдмрд╛рдпрдирд░реА рд╕реНрд╡рд░реВрдкрд╛рд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдКрдпрд╛, рд╣реЗ рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ:

   16    8    8     32
| code | jt | jf |  k  |

рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдирд╛ 64 рдмрд┐рдЯ рд╡реНрдпрд╛рдкрддреЗ, рдЬреНрдпрд╛рдордзреНрдпреЗ рдкрд╣рд┐рд▓реЗ 16 рдмрд┐рдЯ рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдЕрд╕рддрд╛рдд, рддреНрдпрд╛рдирдВрддрд░ рджреЛрди рдЖрда-рдмрд┐рдЯ рдЗрдВрдбреЗрдВрдЯ рдЕрд╕рддрд╛рдд, jt ╨╕ jf, рдЖрдгрд┐ рдпреБрдХреНрддрд┐рд╡рд╛рджрд╛рд╕рд╛рдареА 32 рдмрд┐рдЯ K, рдЬреНрдпрд╛рдЪрд╛ рдЙрджреНрджреЗрд╢ рдЖрджреЗрд╢рд╛рдиреБрд╕рд╛рд░ рдмрджрд▓рддреЛ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрджреЗрд╢ ret, рдЬреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рддреНрдпрд╛рд▓рд╛ рдХреЛрдб рдЕрд╕рддреЛ 6, рдЖрдгрд┐ рдкрд░рддрд╛рд╡рд╛ рдореВрд▓реНрдп рд╕реНрдерд┐рд░рд╛рдВрдХрд╛рддреВрди рдШреЗрддрд▓реЗ рдЬрд╛рддреЗ K. C рдордзреНрдпреЗ, рдПрдХрдЪ BPF рд╕реВрдЪрдирд╛ рд░рдЪрдирд╛ рдореНрд╣рдгреВрди рджрд░реНрд╢рд╡рд┐рд▓реА рдЬрд╛рддреЗ

struct sock_filter {
        __u16   code;
        __u8    jt;
        __u8    jf;
        __u32   k;
}

рдЖрдгрд┐ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрд░рдЪрдиреЗрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдЖрд╣реЗ

struct sock_fprog {
        unsigned short len;
        struct sock_filter *filter;
}

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЖрдореНрд╣реА рдЖрдзреАрдЪ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рд╣реВ рд╢рдХрддреЛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣рд╛рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ рдХреЛрдб рдорд╛рд╣рд┐рдд рдЖрд╣реЗрдд [1]). рд╣реЗ рдлрд┐рд▓реНрдЯрд░ рдХрд╕реЗ рджрд┐рд╕реЗрд▓ ip6 рдкрд╛рд╕реВрди рдЖрдордЪреЗ рдкрд╣рд┐рд▓реЗ рдЙрджрд╛рд╣рд░рдг:

struct sock_filter code[] = {
        { 0x28, 0, 0, 0x0000000c },
        { 0x15, 0, 1, 0x000086dd },
        { 0x06, 0, 0, 0x00040000 },
        { 0x06, 0, 0, 0x00000000 },
};
struct sock_fprog prog = {
        .len = ARRAY_SIZE(code),
        .filter = code,
};

рдХрд╛рд░реНрдпрдХреНрд░рдо prog рдЖрдореНрд╣реА рдХрд╛рдпрджреЗрд╢реАрд░рд░рд┐рддреНрдпрд╛ рдХреЙрд▓рдордзреНрдпреЗ рд╡рд╛рдкрд░реВ рд╢рдХрддреЛ

setsockopt(sk, SOL_SOCKET, SO_ATTACH_FILTER, &prog, sizeof(prog))

рдорд╢реАрди рдХреЛрдбрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рд╣рд┐рдгреЗ рдлрд╛рд░ рд╕реЛрдпреАрдЪреЗ рдирд╕рддреЗ, рдкрд░рдВрддреБ рдХрд╛рд╣реАрд╡реЗрд│рд╛ рддреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдбреАрдмрдЧрд┐рдВрдЧрд╕рд╛рдареА, рдпреБрдирд┐рдЯ рдЪрд╛рдЪрдгреНрдпрд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╣реЕрдмреНрд░реЗрд╡рд░ рд▓реЗрдЦ рд▓рд┐рд╣рд┐рдгреЗ рдЗ.). рд╕реЛрдпреАрд╕рд╛рдареА, рдлрд╛рдЗрд▓рдордзреНрдпреЗ <linux/filter.h> рд╣реЗрд▓реНрдкрд░ рдореЕрдХреНрд░реЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗрдд - рд╡рд░реАрд▓ рдкреНрд░рдорд╛рдгреЗрдЪ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ

struct sock_filter code[] = {
        BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 12),
        BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_IPV6, 0, 1),
        BPF_STMT(BPF_RET|BPF_K, 0x00040000),
        BPF_STMT(BPF_RET|BPF_K, 0),
}

рддрдерд╛рдкрд┐, рд╣рд╛ рдкрд░реНрдпрд╛рдп рдлрд╛рд░ рд╕реЛрдпреАрд╕реНрдХрд░ рдирд╛рд╣реА. рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рдиреЗ рд╣реЗрдЪ рддрд░реНрдХ рдХреЗрд▓реЗ рдЖрдгрд┐ рдореНрд╣рдгреВрдирдЪ рдирд┐рд░реНрджреЗрд╢рд┐рдХреЗрдд tools/bpf рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд░реНрдирд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗрдВрдмрд▓рд░ рдЖрдгрд┐ рдбреАрдмрдЧрд░ рд╢реЛрдзреВ рд╢рдХрддрд╛.

рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдбреАрдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рд╕рд╛рд░рдЦреАрдЪ рдЕрд╕рддреЗ tcpdump, рдкрд░рдВрддреБ рддреНрдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд рдЖрдореНрд╣реА рдкреНрд░рддрд┐рдХрд╛рддреНрдордХ рд▓реЗрдмрд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрддреЛ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпреЗрдереЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрд╣реЗ рдЬреЛ TCP/IPv4 рд╡рдЧрд│рддрд╛ рд╕рд░реНрд╡ рдкреЕрдХреЗрдЯ рд╕реЛрдбрддреЛ:

$ cat /tmp/tcp-over-ipv4.bpf
ldh [12]
jne #0x800, drop
ldb [23]
jneq #6, drop
ret #-1
drop: ret #0

рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, рдЕрд╕реЗрдВрдмрд▓рд░ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рдХреЛрдб рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рддреЛ <╨║╨╛╨╗╨╕╤З╨╡╤Б╤В╨▓╨╛ ╨╕╨╜╤Б╤В╤А╤Г╨║╤Ж╨╕╨╣>,<code1> <jt1> <jf1> <k1>,..., TCP рд╕рд╣ рдЖрдордЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА рддреЗ рдЕрд╕реЗрд▓

$ tools/bpf/bpf_asm /tmp/tcp-over-ipv4.bpf
6,40 0 0 12,21 0 3 2048,48 0 0 23,21 0 1 6,6 0 0 4294967295,6 0 0 0,

рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рдЪреНрдпрд╛ рд╕реЛрдпреАрд╕рд╛рдареА, рднрд┐рдиреНрди рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ:

$ tools/bpf/bpf_asm -c /tmp/tcp-over-ipv4.bpf
{ 0x28,  0,  0, 0x0000000c },
{ 0x15,  0,  3, 0x00000800 },
{ 0x30,  0,  0, 0x00000017 },
{ 0x15,  0,  1, 0x00000006 },
{ 0x06,  0,  0, 0xffffffff },
{ 0x06,  0,  0, 0000000000 },

рд╣рд╛ рдордЬрдХреВрд░ рдкреНрд░рдХрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рд╡реНрдпрд╛рдЦреНрдпреЗрдордзреНрдпреЗ рдХреЙрдкреА рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ struct sock_filter, рдЬрд╕реЗ рдЖрдореНрд╣реА рдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдХреЗрд▓реЗ.

рд▓рд┐рдирдХреНрд╕ рдЖрдгрд┐ рдиреЗрдЯрд╕реНрдирд┐рдл-рдПрдирдЬреА рд╡рд┐рд╕реНрддрд╛рд░

рдорд╛рдирдХ рдмреАрдкреАрдПрдл рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд▓рд┐рдирдХреНрд╕ рдЖрдгрд┐ tools/bpf/bpf_asm рд╕рдорд░реНрдерди рдЖрдгрд┐ рдиреЙрди-рд╕реНрдЯрдБрдбрд░реНрдб рд╕реЗрдЯ. рдореВрд▓рднреВрддрдкрдгреЗ, рд╕рдВрд░рдЪрдиреЗрдЪреНрдпрд╛ рдлреАрд▓реНрдбрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реВрдЪрдирд╛ рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд struct sk_buff, рдЬреЗ рдХрд░реНрдирд▓рдордзреАрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкреЕрдХреЗрдЯрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ. рддрдерд╛рдкрд┐, рдЗрддрд░ рдкреНрд░рдХрд╛рд░рдЪреНрдпрд╛ рдорджрддрдиреАрд╕ рд╕реВрдЪрдирд╛ рджреЗрдЦреАрд▓ рдЖрд╣реЗрдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде ldw cpu рд░рдЬрд┐рд╕реНрдЯрд░ рдордзреНрдпреЗ рд▓реЛрдб рд╣реЛрдИрд▓ A рдХрд░реНрдирд▓ рдлрдВрдХреНрд╢рди рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдкрд░рд┐рдгрд╛рдо raw_smp_processor_id(). (BPF рдЪреНрдпрд╛ рдирд╡реАрди рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ, рд╣реЗ рдиреЙрди-рд╕реНрдЯрдБрдбрд░реНрдб рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдорд░реА, рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ рдЖрдгрд┐ рдЬрдирд░реЗрдЯрд┐рдВрдЧ рдЗрд╡реНрд╣реЗрдВрдЯрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд░реНрдирд▓ рд╕рд╣рд╛рдпреНрдпрдХрд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЪрд╛рд╕рд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреНрд░рджрд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗрдд.) рдпреЗрдереЗ рдлрд┐рд▓реНрдЯрд░рдЪреЗ рдПрдХ рдордиреЛрд░рдВрдЬрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдореНрд╣реА рдлрдХреНрдд рдХреЙрдкреА рдХрд░рддреЛ. рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд╛рдкрд░реВрди рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕рдордзреНрдпреЗ рдкреЕрдХреЗрдЯ рд╢реАрд░реНрд╖рд▓реЗрдЦ poff, рдкреЗрд▓реЛрдб рдСрдлрд╕реЗрдЯ:

ld poff
ret a

рдордзреНрдпреЗ BPF рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реАрдд tcpdump, рдкрд░рдВрддреБ рдпреБрдЯрд┐рд▓рд┐рдЯреА рдкреЕрдХреЗрдЬрд╢реА рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдгреНрдпрд╛рдЪреЗ рд╣реЗ рдПрдХ рдЪрд╛рдВрдЧрд▓реЗ рдХрд╛рд░рдг рдЖрд╣реЗ netsniff-ng, рдЬреНрдпрд╛рдордзреНрдпреЗ, рдЗрддрд░ рдЧреЛрд╖реНрдЯреАрдВрдмрд░реЛрдмрд░рдЪ, рдПрдХ рдкреНрд░рдЧрдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрд╣реЗ netsniff-ng, рдЬреНрдпрд╛рдордзреНрдпреЗ, BPF рд╡рд╛рдкрд░реВрди рдлрд┐рд▓реНрдЯрд░ рдХрд░рдгреНрдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдПрдХ рдкреНрд░рднрд╛рд╡реА рд░рд╣рджрд╛рд░реА рдЬрдирд░реЗрдЯрд░ рджреЗрдЦреАрд▓ рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рдкреНрд░рдЧрдд tools/bpf/bpf_asm, BPF рдЕрд╕реЗрдВрдмрд▓рд░ рдмреЛрд▓рд╛рд╡рд▓реЗ bpfc. рдкреЕрдХреЗрдЬрдордзреНрдпреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рджрд╕реНрддрдРрд╡рдЬ рдЖрд╣реЗрдд, рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рджреБрд╡реЗ рджреЗрдЦреАрд▓ рдкрд╣рд╛.

рд╕реЗрдХреЙрдореНрдк

рддреНрдпрд╛рдореБрд│реЗ, рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдЬрдЯрд┐рд▓рддреЗрдЪреЗ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ рдирд╡реАрди рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдЖрд╣реЛрдд, рддреНрдпрд╛рдкреИрдХреА рдкрд╣рд┐рд▓реЗ seccomp рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдЖрд╣реЗ, рдЬреЗ BPF рдлрд┐рд▓реНрдЯрд░ рд╡рд╛рдкрд░реВрди, рдЙрдкрд▓рдмреНрдз рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡рд┐рддрд░реНрдХрд╛рдВрдЪрд╛ рд╕реЗрдЯ рдЖрдгрд┐ рд╕рдВрдЪ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рджрд┐рд▓реЗрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рд╡рдВрд╢рдЬ.

seccomp рдЪреА рдкрд╣рд┐рд▓реА рдЖрд╡реГрддреНрддреА рдХрд░реНрдирд▓рдордзреНрдпреЗ 2005 рдордзреНрдпреЗ рдЬреЛрдбрд▓реА рдЧреЗрд▓реА рд╣реЛрддреА рдЖрдгрд┐ рддреА рдлрд╛рд░рд╢реА рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╡реНрд╣рддреА, рдХрд╛рд░рдг рддреА рдлрдХреНрдд рдПрдХрдЪ рдкрд░реНрдпрд╛рдп рдкреНрд░рджрд╛рди рдХрд░рддреЗ - рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓реНрд╕рдЪреНрдпрд╛ рд╕реЗрдЯрд▓рд╛ рдЦрд╛рд▓реАрд▓ рдЧреЛрд╖реНрдЯреАрдВрдкрд░реНрдпрдВрдд рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА: read, write, exit ╨╕ sigreturn, рдЖрдгрд┐ рдирд┐рдпрдорд╛рдВрдЪреЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рдгрд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд░реВрди рдорд╛рд░рд▓реА рдЧреЗрд▓реА SIGKILL. рддрдерд╛рдкрд┐, 2012 рдордзреНрдпреЗ, seccomp рдиреЗ BPF рдлрд┐рд▓реНрдЯрд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд▓реА, рдЬреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдиреБрдордд рд╕рд┐рд╕реНрдЯреАрдо рдХреЙрд▓реНрд╕рдЪрд╛ рд╕рдВрдЪ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рдпреЗрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдпреБрдХреНрддрд┐рд╡рд╛рджрд╛рдВрдЪреА рддрдкрд╛рд╕рдгреА рджреЗрдЦреАрд▓ рдХрд░рддрд╛ рдпреЗрддреЗ. (рдордЬреЗрдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ, рдХреНрд░реЛрдо рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдкреИрдХреА рдПрдХ рд╣реЛрддрд╛, рдЖрдгрд┐ рдХреНрд░реЛрдо рд▓реЛрдХ рд╕рдзреНрдпрд╛ BPF рдЪреНрдпрд╛ рдирд╡реАрди рдЖрд╡реГрддреНрддреАрд╡рд░ рдЖрдзрд╛рд░рд┐рдд KRSI рдпрдВрддреНрд░рдгрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдд рдЖрд╣реЗрдд рдЖрдгрд┐ Linux рд╕реБрд░рдХреНрд╖рд╛ рдореЙрдбреНрдпреВрд▓реНрд╕рдЪреНрдпрд╛ рд╕рд╛рдиреБрдХреВрд▓рдирд╛рд╕ рдЕрдиреБрдорддреА рджреЗрдд тАЛтАЛрдЖрд╣реЗрдд.) рдЕрддрд┐рд░рд┐рдХреНрдд рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рд▓рд┐рдВрдХреНрд╕ рд╢реЗрд╡рдЯреА рдЖрдврд│реВ рд╢рдХрддрд╛рдд. рд▓реЗрдЦрд╛рдЪрд╛.

рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА seccomp рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рд╣рдмрд╡рд░ рдЖрдзреАрдЪ рд▓реЗрдЦ рдЖрд▓реЗ рдЖрд╣реЗрдд, рдХрджрд╛рдЪрд┐рдд рдХреЛрдгреАрддрд░реА рдЦрд╛рд▓реАрд▓ рдЙрдкрд╡рд┐рднрд╛рдЧ рд╡рд╛рдЪрдгреНрдпрд╛рдкреВрд░реНрд╡реА (рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдРрд╡рдЬреА) рддреЗ рд╡рд╛рдЪреВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕реЗрд▓. рд▓реЗрдЦрд╛рдд рдХрдВрдЯреЗрдирд░ рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд╛: seccomp seccomp рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рджреЗрддреЗ, 2007 рдЖрд╡реГрддреНрддреА рдЖрдгрд┐ BPF рд╡рд╛рдкрд░реВрди рдЖрд╡реГрддреНрддреА рджреЛрдиреНрд╣реА (libseccomp рд╡рд╛рдкрд░реВрди рдлрд┐рд▓реНрдЯрд░ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд), рдбреЙрдХрд░рд╕рд╣ seccomp рдЪреНрдпрд╛ рдХрдиреЗрдХреНрд╢рдирдмрджреНрджрд▓ рдмреЛрд▓рддрд╛рдд рдЖрдгрд┐ рдЕрдиреЗрдХ рдЙрдкрдпреБрдХреНрдд рджреБрд╡реЗ рджреЗрдЦреАрд▓ рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рд▓реЗрдЦрд╛рдд рд╕рд┐рд╕реНрдЯрдордб рдХрд┐рдВрд╡рд╛ "рдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЙрдХрд░рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА!" рд╕рд╣ рдбрд┐рдорди рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдпрд╛рдордзреНрдпреЗ, рд╡рд┐рд╢реЗрд╖рддрдГ, systemd рд░рдирд┐рдВрдЧ рдбрд┐рдордирд╕рд╛рдареА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреА рдмреНрд▓реЕрдХрд▓рд┐рд╕реНрдЯ рдХрд┐рдВрд╡рд╛ рд╡реНрд╣рд╛рдИрдЯрд▓рд┐рд╕реНрдЯ рдХрд╢реА рдЬреЛрдбрд╛рдпрдЪреА рд╣реЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ.

рдкреБрдвреЗ рдЖрдкрдг рдлрд┐рд▓реНрдЯрд░ рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ рдЖрдгрд┐ рд▓реЛрдб рдХрд░рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣реВ seccomp рдмреЗрдЕрд░ рд╕реА рдордзреНрдпреЗ рдЖрдгрд┐ рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░реВрди libseccomp рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реНрдпрд╛рдпрд╛рдЪреЗ рдлрд╛рдпрджреЗ рдЖрдгрд┐ рддреЛрдЯреЗ рдХрд╛рдп рдЖрд╣реЗрдд рдЖрдгрд┐ рд╢реЗрд╡рдЯреА, seccomp рдкреНрд░реЛрдЧреНрд░рд╛рдорджреНрд╡рд╛рд░реЗ рдХрд╕рд╛ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ рддреЗ рдкрд╛рд╣реВрдпрд╛ strace.

seccomp рд╕рд╛рдареА рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рдгреЗ рдЖрдгрд┐ рд▓реЛрдб рдХрд░рдгреЗ

BPF рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рдХрд╕реЗ рд▓рд┐рд╣рд╛рдпрдЪреЗ рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдкреНрд░рдердо seccomp рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд╛рд╣реВ. рддреБрдореНрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрддрд░рд╛рд╡рд░ рдлрд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рд╕рд░реНрд╡ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдмрдВрдзрд╛рдВрдЪрд╛ рд╡рд╛рд░рд╕рд╛ рдШреЗрддреАрд▓. рд╣реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рдХреЗрд▓реЗ рдЬрд╛рддреЗ seccomp(2):

seccomp(SECCOMP_SET_MODE_FILTER, flags, &filter)

рдЬреЗрдереЗ &filter - рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдзреАрдЪ рдкрд░рд┐рдЪрд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рдВрд░рдЪрдиреЗрдЪреЗ рд╕реВрдЪрдХ рдЖрд╣реЗ struct sock_fprog, рдореНрд╣рдгрдЬреЗ рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо.

seccomp рд╕рд╛рдареАрдЪреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЙрдХреЗрдЯреНрд╕рдЪреНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдкреЗрдХреНрд╖рд╛ рд╡реЗрдЧрд│реЗ рдХрд╕реЗ рдЖрд╣реЗрдд? рдкреНрд░рд╕рд╛рд░рд┐рдд рд╕рдВрджрд░реНрдн. рд╕реЙрдХреЗрдЯреНрд╕рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдкреЕрдХреЗрдЯ рдЕрд╕рд▓реЗрд▓реЗ рдореЗрдорд░реА рдХреНрд╖реЗрддреНрд░ рджрд┐рд▓реЗ рдЧреЗрд▓реЗ рдЖрдгрд┐ seccomp рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╢реА рд░рдЪрдирд╛ рджрд┐рд▓реА рдЧреЗрд▓реА.

struct seccomp_data {
    int   nr;
    __u32 arch;
    __u64 instruction_pointer;
    __u64 args[6];
};

рддреЛ рдЖрд╣реЗ nr рд▓рд╛рдБрдЪ рд╣реЛрдгрд╛рд░реНтАНрдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪрд╛ рдирдВрдмрд░ рдЖрд╣реЗ, arch - рд╡рд░реНрддрдорд╛рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдЦрд╛рд▓реА рдпрд╛рд╡рд░реАрд▓ рдЕрдзрд┐рдХ), args - рд╕рд╣рд╛ рдкрд░реНрдпрдВрдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡рд┐рддрд░реНрдХ, рдЖрдгрд┐ instruction_pointer рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╕реНрдкреЗрд╕ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рдирд╕рд╛рдареА рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЖрд╣реЗ рдЬреНрдпрд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗрд▓рд╛. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд░рдЬрд┐рд╕реНрдЯрд░рдордзреНрдпреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА A рдЖрдореНрд╣рд╛рд▓рд╛ рдореНрд╣рдгрд╛рдпрдЪреЗ рдЖрд╣реЗ

ldw [0]

seccomp рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рд╕рд╛рдареА рдЗрддрд░ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдЖрд╣реЗрдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рдВрджрд░реНрдн рдлрдХреНрдд 32-рдмрд┐рдЯ рд╕рдВрд░реЗрдЦрдирд╛рджреНрд╡рд╛рд░реЗ рдкреНрд░рд╡реЗрд╢ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ рдЖрдгрд┐ рдлрд┐рд▓реНрдЯрд░ рд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддрд╛рдирд╛ рдЖрдкрдг рдЕрд░реНрдзрд╛ рд╢рдмреНрдж рдХрд┐рдВрд╡рд╛ рдмрд╛рдЗрдЯ рд▓реЛрдб рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА ldh [0] рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ seccomp рдкрд░рдд рдпреЗрдИрд▓ EINVAL. рдлрдВрдХреНрд╢рди рд▓реЛрдб рдХреЗрд▓реЗрд▓реЗ рдлрд┐рд▓реНрдЯрд░ рддрдкрд╛рд╕рддреЗ seccomp_check_filter() рдХрд░реНрдирд▓ (рдордЬреЗрдЪреА рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ, seccomp рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдореВрд│ рдХрдорд┐рдЯрдордзреНрдпреЗ, рддреЗ рдпрд╛ рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рд╕реВрдЪрдирд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдЬреЛрдбрдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░рд▓реЗ. mod (рд╡рд┐рднрд╛рдЧрдгреА рдЙрд░реНрд╡рд░рд┐рдд) рдЖрдгрд┐ рдЖрддрд╛ seccomp BPF рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдВрд╕рд╛рдареА рдЕрдиреБрдкрд▓рдмреНрдз рдЖрд╣реЗ, рддреЗ рдЬреЛрдбрд▓реНрдпрд╛рдкрд╛рд╕реВрди рдЦрдВрдбрд┐рдд рд╣реЛрдИрд▓ ABI.)

рдореБрд│рд╛рдд, seccomp рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡рдХрд╛рд╣реА рдЖрдзреАрдЪ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ. рд╕рд╣рд╕рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдЬрд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреА рдкрд╛рдВрдврд░реА рдХрд┐рдВрд╡рд╛ рдХрд╛рд│реА рдпрд╛рджреА рдореНрд╣рдгреВрди рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдкреНрд░реЛрдЧреНрд░рд╛рдо

ld [0]
jeq #304, bad
jeq #176, bad
jeq #239, bad
jeq #279, bad
good: ret #0x7fff0000 /* SECCOMP_RET_ALLOW */
bad: ret #0

304, 176, 239, 279 рдХреНрд░рдорд╛рдВрдХрд╛рдЪреНрдпрд╛ рдЪрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреА рдмреНрд▓реЕрдХрд▓рд┐рд╕реНрдЯ рддрдкрд╛рд╕рддреЗ. рд╣реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛рдп рдЖрд╣реЗрдд? рдЖрдореНрд╣реА рдирд┐рд╢реНрдЪрд┐рддрдкрдгреЗ рд╕рд╛рдВрдЧреВ рд╢рдХрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА рдХреА рд╣рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдгрддреНрдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рд╕рд╛рдареА рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ. рдореНрд╣рдгреВрди, seccomp рдЪреЗ рд▓реЗрдЦрдХ рдСрдлрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рддрдкрд╛рд╕рдгреАрд╕рд╣ рд╕рд░реНрд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕ рд╕реБрд░реВ рдХрд░рд╛ (рд╕рдзреНрдпрд╛рдЪреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдлреАрд▓реНрдб рдореНрд╣рдгреВрди рд╕рдВрджрд░реНрднрд╛рдордзреНрдпреЗ рд╕реВрдЪрд┐рдд рдХреЗрд▓реЗ рдЖрд╣реЗ arch рд╕рдВрд░рдЪрдирд╛ struct seccomp_data). рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рддрдкрд╛рд╕рд▓реНрдпрд╛рдирдВрддрд░, рдЙрджрд╛рд╣рд░рдгрд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд рдЕрд╢реА рджрд┐рд╕реЗрд▓:

ld [4]
jne #0xc000003e, bad_arch ; SCMP_ARCH_X86_64

рдЖрдгрд┐ рдордЧ рдЖрдордЪреНрдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░рд▓рд╛ рдХрд╛рд╣реА рдореВрд▓реНрдпреЗ рдорд┐рд│рддреАрд▓.

рдЖрдореНрд╣реА seccomp рд╡рд╛рдкрд░реВрди рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рддреЛ рдЖрдгрд┐ рд▓реЛрдб рдХрд░рддреЛ libseccomp

рдиреЗрдЯрд┐рд╡реНрд╣ рдХреЛрдбрдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ BPF рдЕрд╕реЗрдВрдмреНрд▓реАрдордзреНрдпреЗ рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдиреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд┐рдХрд╛рд▓рд╛рд╡рд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдареЗрд╡рддрд╛ рдпреЗрддреЗ, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдХрд╛рд╣реА рд╡реЗрд│рд╛ рдкреЛрд░реНрдЯреЗрдмрд▓ рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ рд╡рд╛рдЪрдиреАрдп рдХреЛрдб рдЕрд╕рдгреЗ рд╢реНрд░реЗрдпрд╕реНрдХрд░ рдЕрд╕рддреЗ. рдпрд╛рд╕рд╛рдареА рдЧреНрд░рдВрдерд╛рд▓рдп рдЖрдореНрд╣рд╛рд▓рд╛ рдорджрдд рдХрд░реЗрд▓ libseccomp, рдЬреЗ рдХрд╛рд│реЗ рдХрд┐рдВрд╡рд╛ рдкрд╛рдВрдврд░реЗ рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдорд╛рдирдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рдЪрд▓рд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рд╣реВ рдЬреЛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдирд┐рд╡рдбреАрдЪреА рдмрд╛рдпрдирд░реА рдлрд╛рдЗрд▓ рдЪрд╛рд▓рд╡рддреЛ, рдЬреНрдпрд╛рдиреЗ рдпрд╛рдкреВрд░реНрд╡реА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреА рдмреНрд▓реЕрдХрд▓рд┐рд╕реНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реА рдЖрд╣реЗ рд╡рд░реАрд▓ рд▓реЗрдЦ (рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдзрд┐рдХ рд╡рд╛рдЪрдиреАрдпрддреЗрд╕рд╛рдареА рд╕рд░рд▓реАрдХреГрдд рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ, рд╕рдВрдкреВрд░реНрдг рдЖрд╡реГрддреНрддреА рдЖрдврд│реВ рд╢рдХрддреЗ рдпреЗрдереЗ):

#include <seccomp.h>
#include <unistd.h>
#include <err.h>

static int sys_numbers[] = {
        __NR_mount,
        __NR_umount2,
       // ... ╨╡╤Й╨╡ 40 ╤Б╨╕╤Б╤В╨╡╨╝╨╜╤Л╤Е ╨▓╤Л╨╖╨╛╨▓╨╛╨▓ ...
        __NR_vmsplice,
        __NR_perf_event_open,
};

int main(int argc, char **argv)
{
        scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ALLOW);

        for (size_t i = 0; i < sizeof(sys_numbers)/sizeof(sys_numbers[0]); i++)
                seccomp_rule_add(ctx, SCMP_ACT_TRAP, sys_numbers[i], 0);

        seccomp_load(ctx);

        execvp(argv[1], &argv[1]);
        err(1, "execlp: %s", argv[1]);
}

рдкреНрд░рдердо рдЖрдкрдг рдЕреЕрд░реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЛ sys_numbers рдмреНрд▓реЙрдХ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА 40+ рд╕рд┐рд╕реНрдЯреАрдо рдХреЙрд▓ рдирдВрдмрд░. рдирдВрддрд░, рд╕рдВрджрд░реНрдн рдЖрд░рдВрдн рдХрд░рд╛ ctx рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рдкрд░рд╡рд╛рдирдЧреА рджреНрдпрд╛рдпрдЪреА рдЖрд╣реЗ рддреЗ рд▓рд╛рдпрдмреНрд░рд░реАрд▓рд╛ рд╕рд╛рдВрдЧрд╛ (SCMP_ACT_ALLOW) рд╕рд░реНрд╡ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдмрд╛рдп рдбреАрдлреЙрд▓реНрдЯ (рдмреНрд▓реЕрдХрд▓рд┐рд╕реНрдЯ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ). рдордЧ, рдПрдХ рдПрдХ рдХрд░реВрди, рдЖрдореНрд╣реА рдмреНрд▓реЕрдХрд▓рд┐рд╕реНрдЯрдордзреВрди рд╕рд░реНрд╡ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЬреЛрдбрддреЛ. рд╕реВрдЪреАрдордзреВрди рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреА рдХрд░рддреЛ SCMP_ACT_TRAP, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд seccomp рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕ рд╕рд┐рдЧреНрдирд▓ рдкрд╛рдард╡реЗрд▓ SIGSYS рдХреЛрдгрддреНрдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдиреЗ рдирд┐рдпрдорд╛рдВрдЪреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗрд▓реЗ рдпрд╛рдЪреНрдпрд╛ рд╡рд░реНрдгрдирд╛рд╕рд╣. рд╢реЗрд╡рдЯреА, рдЖрдореНрд╣реА рд╡рд╛рдкрд░реВрди рдХрд░реНрдирд▓рдордзреНрдпреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЛрдб рдХрд░рддреЛ seccomp_load, рдЬреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрд▓ рдЖрдгрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рдкреНрд░рдХреНрд░рд┐рдпреЗрд╢реА рд╕рдВрд▓рдЧреНрди рдХрд░реЗрд▓ seccomp(2).

рдпрд╢рд╕реНрд╡реА рд╕рдВрдХрд▓рдирд╛рд╕рд╛рдареА, рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд╛рдпрдмреНрд░рд░реАрд╢реА рдЬреЛрдбрд▓реЗрд▓рд╛ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ libseccomp, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде:

cc -std=c17 -Wall -Wextra -c -o seccomp_lib.o seccomp_lib.c
cc -o seccomp_lib seccomp_lib.o -lseccomp

рдпрд╢рд╕реНрд╡реА рдкреНрд░рдХреНрд╖реЗрдкрдгрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг:

$ ./seccomp_lib echo ok
ok

рдмреНрд▓реЙрдХ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреЗ рдЙрджрд╛рд╣рд░рдг:

$ sudo ./seccomp_lib mount -t bpf bpf /tmp
Bad system call

рдЖрдореНрд╣реА рд╡рд╛рдкрд░рддреЛ straceрддрдкрд╢реАрд▓рд╛рдВрд╕рд╛рдареА:

$ sudo strace -e seccomp ./seccomp_lib mount -t bpf bpf /tmp
seccomp(SECCOMP_SET_MODE_FILTER, 0, {len=50, filter=0x55d8e78428e0}) = 0
--- SIGSYS {si_signo=SIGSYS, si_code=SYS_SECCOMP, si_call_addr=0xboobdeadbeef, si_syscall=__NR_mount, si_arch=AUDIT_ARCH_X86_64} ---
+++ killed by SIGSYS (core dumped) +++
Bad system call

рдмреЗрдХрд╛рдпрджреЗрд╢реАрд░ рд╕рд┐рд╕реНрдЯреАрдо рдХреЙрд▓рдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рдореБрд│реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдВрдж рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╕реЗ рдХрд│реЗрд▓ mount(2).

рддрд░, рдЖрдореНрд╣реА рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░реВрди рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣рд┐рд▓реЗ libseccomp, рдХреНрд╖реБрд▓реНрд▓рдХ рдирд╕рд▓реЗрд▓рд╛ рдХреЛрдб рдЪрд╛рд░ рдУрд│реАрдВрдордзреНрдпреЗ рдмрд╕рд╡рдгреЗ. рд╡рд░реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рдЬрд░ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЕрд╕рддреАрд▓ рддрд░, рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рд╡реЗрд│ рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдХрдореА рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ, рдХрд╛рд░рдг рддрдкрд╛рд╕рдгреА рд╣реА рдлрдХреНрдд рддреБрд▓рдирд╛рдВрдЪреА рд╕реВрдЪреА рдЖрд╣реЗ. рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирд╕рд╛рдареА, libseccomp рдЕрд▓реАрдХрдбреЗ рд╣реЛрддреЗ рдкреЕрдЪ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ, рдЬреЗ рдлрд┐рд▓реНрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рд╕рд╛рдареА рд╕рдорд░реНрдерди рдЬреЛрдбрддреЗ SCMP_FLTATR_CTL_OPTIMIZE. рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ 2 рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реНрдпрд╛рдиреЗ рдлрд┐рд▓реНрдЯрд░ рдмрд╛рдпрдирд░реА рд╢реЛрдз рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрдИрд▓.

рдмрд╛рдпрдирд░реА рд╢реЛрдз рдлрд┐рд▓реНрдЯрд░ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдкрд╣рд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдкрд╣рд╛ рд╕рд╛рдзреА рд▓рд┐рдкреА, рдЬреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рдбрд╛рдпрд▓ рдХрд░реВрди BPF рдЕрд╕реЗрдВрдмрд▓рд░рдордзреНрдпреЗ рдЕрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░рддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде:

$ echo 1 3 6 8 13 | ./generate_bin_search_bpf.py
ld [0]
jeq #6, bad
jgt #6, check8
jeq #1, bad
jeq #3, bad
ret #0x7fff0000
check8:
jeq #8, bad
jeq #13, bad
ret #0x7fff0000
bad: ret #0

рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рд╡реЗрдЧрд╛рдиреЗ рдХрд╛рд╣реАрд╣реА рд▓рд┐рд╣рд┐рдгреЗ рдЕрд╢рдХреНрдп рдЖрд╣реЗ, рдХрд╛рд░рдг BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдЬрдВрдк рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реАрдд (рдЖрдореНрд╣реА рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, jmp A рдХрд┐рдВрд╡рд╛ jmp [label+X]) рдЖрдгрд┐ рдореНрд╣рдгреВрди рд╕рд░реНрд╡ рд╕рдВрдХреНрд░рдордгреЗ рд╕реНрдерд┐рд░ рдЖрд╣реЗрдд.

seccomp рдЖрдгрд┐ strace

рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдЙрдкрдпреБрдХреНрддрддрд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ strace рд▓рд┐рдирдХреНрд╕рд╡рд░реАрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдЪреНрдпрд╛ рд╡рд░реНрддрдирд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдПрдХ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╕рд╛рдзрди рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рдЕрдиреЗрдХрд╛рдВрдиреА рдпрд╛рдмрджреНрджрд▓ рдРрдХрд▓реЗ рдЖрд╣реЗ рдХрд╛рдордЧрд┐рд░реА рд╕рдорд╕реНрдпрд╛ рд╣реА рдЙрдкрдпреБрдХреНрддрддрд╛ рд╡рд╛рдкрд░рддрд╛рдирд╛. рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ strace рд╡рд╛рдкрд░реВрди рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХреЗрд▓реА ptrace(2), рдЖрдгрд┐ рдпрд╛ рдпрдВрддреНрд░рдгреЗрдордзреНрдпреЗ рдЖрдореНрд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдерд╛рдВрдмрд╡рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛ рд╕реЗрдЯрд╡рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХрдорд╛рдВрдб

$ time strace du /usr/share/ >/dev/null 2>&1

real    0m3.081s
user    0m0.531s
sys     0m2.073s

╨╕

$ time strace -e open du /usr/share/ >/dev/null 2>&1

real    0m2.404s
user    0m0.193s
sys     0m1.800s

рдЕрдВрджрд╛рдЬреЗ рддреНрдпрд╛рдЪ рд╡реЗрд│реЗрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ, рдЬрд░реА рджреБрд╕рд▒реНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреНрд░реЗрд╕ рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗ.

рдирд╡реАрди рдкрд░реНрдпрд╛рдп --seccomp-bpf, рдордзреНрдпреЗ рдЬреЛрдбрд▓реЗ strace рдЖрд╡реГрддреНрддреА 5.3, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕ рдмрд░реНтАНрдпрд╛рдЪ рд╡реЗрд│рд╛ рд╡реЗрдЧрд╡рд╛рди рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ рдЖрдгрд┐ рдПрдХрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреНрдпрд╛ рдЯреНрд░реЗрд╕ рдЕрдВрддрд░реНрдЧрдд рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрдЪреА рд╡реЗрд│ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдирд┐рдпрдорд┐рдд рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрдЪреНрдпрд╛ рд╡реЗрд│реЗрд╢реА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рдпреЗрддреЗ:

$ time strace --seccomp-bpf -e open du /usr/share/ >/dev/null 2>&1

real    0m0.148s
user    0m0.017s
sys     0m0.131s

$ time du /usr/share/ >/dev/null 2>&1

real    0m0.140s
user    0m0.024s
sys     0m0.116s

(рдпреЗрдереЗ, рдЕрд░реНрдерд╛рддрдЪ, рдереЛрдбреАрд╢реА рдлрд╕рд╡рдгреВрдХ рдЖрд╣реЗ рдХреА рдЖрдореНрд╣реА рдпрд╛ рдХрдорд╛рдВрдбрдЪрд╛ рдореБрдЦреНрдп рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреНрд░реЗрд╕ рдХрд░рдд рдирд╛рд╣реА. рдЬрд░ рдЖрдореНрд╣реА рдЯреНрд░реЗрд╕ рдХрд░рдд рдЕрд╕реВ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, newfsstatрдордЧ strace рди рдХрд░рддрд╛ рддреЗрд╡рдврд╛рдЪ рдЬреЛрд░рд╛рдд рдмреНрд░реЗрдХ рд▓рд╛рд╡реЗрд▓ --seccomp-bpf.)

рд╣рд╛ рдкрд░реНрдпрд╛рдп рдХрд╕рд╛ рдХрд╛рдо рдХрд░рддреЛ? рддрд┐рдЪреНрдпрд╛рд╢рд┐рд╡рд╛рдп strace рдкреНрд░рдХреНрд░рд┐рдпреЗрд▓рд╛ рдЬреЛрдбрддреЗ рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ PTRACE_SYSCALL. рдЬреЗрд╡реНрд╣рд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдХреЛрдгрддрд╛рд╣реА) рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЬрд╛рд░реА рдХрд░рддреЗ, рддреЗрд╡реНрд╣рд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ strace, рдЬреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдЪреЗ рд╡рд┐рддрд░реНрдХ рдкрд╛рд╣рддреЗ рдЖрдгрд┐ рддреЗ рд╡рд╛рдкрд░реВрди рдЪрд╛рд▓рд╡рддреЗ PTRACE_SYSCALL. рдХрд╛рд╣реА рдХрд╛рд│рд╛рдирдВрддрд░, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкреВрд░реНрдг рдХрд░рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдмрд╛рд╣реЗрд░ рдкрдбрддрд╛рдирд╛, рдирд┐рдпрдВрддреНрд░рдг рдкреБрдиреНрд╣рд╛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ strace, рдЬреЗ рд░рд┐рдЯрд░реНрди рд╡реНрд╣реЕрд▓реНрдпреВрдЬ рдкрд╛рд╣рддреЗ рдЖрдгрд┐ рд╡рд╛рдкрд░реВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░реВ рдХрд░рддреЗ PTRACE_SYSCALL, рдЖрдгрд┐ рдЕрд╕реЗрдЪ.

рд▓рд╣рд╛рди рдореБрд▓рд╛рдВрд╕рд╛рдареА BPF, рднрд╛рдЧ рд╢реВрдиреНрдп: рдХреНрд▓рд╛рд╕рд┐рдХ BPF

seccomp рд╕рд╣, рддрдерд╛рдкрд┐, рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдордЪреНрдпрд╛ рдЗрдЪреНрдЫреЗрдиреБрд╕рд╛рд░ рдЕрдЪреВрдХрдкрдгреЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ. рдмрд╣реБрджрд╛, рдЖрдореНрд╣реА рдлрдХреНрдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рд╣реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕ X, рдордЧ рдЖрдкрдг рддреНрдпрд╛рд╕рд╛рдареА BPF рдлрд┐рд▓реНрдЯрд░ рд▓рд┐рд╣реВ рд╢рдХрддреЛ X рдореВрд▓реНрдп рдкрд░рдд рдХрд░рддреЗ SECCOMP_RET_TRACE, рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрд╡рд╛рд░рд╕реНрдп рдирд╕рд▓реЗрд▓реНрдпрд╛ рдХреЙрд▓рд╕рд╛рдареА - SECCOMP_RET_ALLOW:

ld [0]
jneq #X, ignore
trace: ret #0x7ff00000
ignore: ret #0x7fff0000

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд strace рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдореНрд╣рдгреВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░реВ рдХрд░рддреЗ PTRACE_CONT, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирд╕рд▓реНрдпрд╛рд╕, рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рд╕рд╛рдареА рдЖрдордЪреНрдпрд╛ рдлрд┐рд▓реНрдЯрд░рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ X, рдирдВрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд╛рд▓реВ рд░рд╛рд╣рддреЗ, рдкрд░рдВрддреБ рдЬрд░ рд╣реЗ X, рдирдВрддрд░ seccomp рдирд┐рдпрдВрддреНрд░рдг рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реЗрд▓ straceрдЬреЗ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдкрд╛рд╣рддреАрд▓ рдЖрдгрд┐ рд╕рд╛рд░рдЦреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░реВ рдХрд░реЗрд▓ PTRACE_SYSCALL (seccomp рдордзреНрдпреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓рдордзреВрди рдмрд╛рд╣реЗрд░ рдкрдбрд▓реНрдпрд╛рд╡рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдирд╛рд╣реА). рдЬреЗрд╡реНрд╣рд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд░рдд рдпреЗрддреЛ, strace рд╡рд╛рдкрд░реВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреБрдиреНрд╣рд╛ рд╕реБрд░реВ рдХрд░реЗрд▓ PTRACE_CONT рдЖрдгрд┐ seccomp рдХрдбреВрди рдирд╡реАрди рд╕рдВрджреЗрд╢рд╛рдВрдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрд▓.

рд▓рд╣рд╛рди рдореБрд▓рд╛рдВрд╕рд╛рдареА BPF, рднрд╛рдЧ рд╢реВрдиреНрдп: рдХреНрд▓рд╛рд╕рд┐рдХ BPF

рдкрд░реНрдпрд╛рдп рд╡рд╛рдкрд░рддрд╛рдирд╛ --seccomp-bpf рджреЛрди рдирд┐рд░реНрдмрдВрдз рдЖрд╣реЗрдд. рдкреНрд░рдердо, рдЖрдзреАрдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдд рд╕рд╛рдореАрд▓ рд╣реЛрдгреЗ рд╢рдХреНрдп рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА (рдкрд░реНрдпрд╛рдп -p рдХрд╛рд░реНрдпрдХреНрд░рдо strace), рдХрд╛рд░рдг рд╣реЗ seccomp рджреНрд╡рд╛рд░реЗ рд╕рдорд░реНрдерд┐рдд рдирд╛рд╣реА. рджреБрд╕рд░реЗ рдореНрд╣рдгрдЬреЗ, рдХреЛрдгрддреАрд╣реА рд╢рдХреНрдпрддрд╛ рдирд╛рд╣реА рдирд╛рд╣реА рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдкрд╣рд╛, рдХрд╛рд░рдг seccomp рдлрд┐рд▓реНрдЯрд░ рд╣реЗ рдЕрдХреНрд╖рдо рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдХреНрд╖рдорддреЗрд╢рд┐рд╡рд╛рдп рд╕рд░реНрд╡ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрджреНрд╡рд╛рд░реЗ рд╡рд╛рд░рд╢рд╛рдиреЗ рдорд┐рд│рддрд╛рдд.

рдирдХреНрдХреА рдХрд╕реЗ рдпрд╛рдмрджреНрджрд▓ рдереЛрдбреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓ strace рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рддреЗ seccomp рдкрд╛рд╕реВрди рд╢реЛрдзрддрд╛ рдпреЗрдИрд▓ рдЕрд▓реАрдХрдбреАрд▓ рдЕрд╣рд╡рд╛рд▓. рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА, рд╕рд░реНрд╡рд╛рдд рдордиреЛрд░рдВрдЬрдХ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА seccomp рджреНрд╡рд╛рд░реЗ рджрд░реНрд╢рд╡рд┐рд▓реЗрд▓реЗ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЖрдЬрд╣реА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ.

xt_bpf

рдЖрддрд╛ рдиреЗрдЯрд╡рд░реНрдХрдЪреНрдпрд╛ рдЬрдЧрд╛рдд рдкрд░рдд рдЬрд╛рдКрдпрд╛.

рдкрд╛рд░реНрд╢реНрд╡рднреВрдореА: рдЦреВрдк рдкреВрд░реНрд╡реА, 2007 рдордзреНрдпреЗ, рдХреЛрд░ рд╣реЛрддрд╛ рдЬреЛрдбрд▓реЗ рдореЙрдбреНрдпреВрд▓ xt_u32 рдиреЗрдЯрдлрд┐рд▓реНрдЯрд░рд╕рд╛рдареА. рд╣реЗ рдЖрдгрдЦреА рдкреНрд░рд╛рдЪреАрди рдЯреНрд░реЕрдлрд┐рдХ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░рдЪреНрдпрд╛ рд╕рд╛рджреГрд╢реНрдпрд╛рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЧреЗрд▓реЗ cls_u32 рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рд╕реЛрдкреНрдпрд╛ рдСрдкрд░реЗрд╢рдиреНрд╕рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди iptables рд╕рд╛рдареА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдмрд╛рдпрдирд░реА рдирд┐рдпрдо рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджрд┐рд▓реА: рдкреЕрдХреЗрдЬрдордзреВрди 32 рдмрд┐рдЯреНрд╕ рд▓реЛрдб рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рдЕрдВрдХрдЧрдгрд┐рдд рдСрдкрд░реЗрд╢рдиреНрд╕рдЪрд╛ рд╕рдВрдЪ рдХрд░рд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде,

sudo iptables -A INPUT -m u32 --u32 "6&0xFF=1" -j LOG --log-prefix "seen-by-xt_u32"

рдкреЕрдбрд┐рдВрдЧ 32 рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдгрд╛рд░реНтАНрдпрд╛, IP рд╣реЗрдбрд░рдЪреЗ 6 рдмрд┐рдЯреНрд╕ рд▓реЛрдб рдХрд░рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдорд╛рд╕реНрдХ рд▓рд╛рдЧреВ рдХрд░рддрд╛рдд 0xFF (рд▓реЛ рдмрд╛рдЗрдЯ рдШреНрдпрд╛). рд╣реЗ рдХреНрд╖реЗрддреНрд░ protocol IP рд╣реЗрдбрд░ рдЖрдгрд┐ рдЖрдореНрд╣реА рддреНрдпрд╛рдЪреА 1 (ICMP) рд╢реА рддреБрд▓рдирд╛ рдХрд░рддреЛ. рдЖрдкрдг рдПрдХрд╛ рдирд┐рдпрдорд╛рдд рдЕрдиреЗрдХ рдЪреЗрдХ рдПрдХрддреНрд░ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдЖрдкрдг рдСрдкрд░реЗрдЯрд░рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рджреЗрдЦреАрд▓ рдХрд░реВ рд╢рдХрддрд╛ @ тАФ X рдмрд╛рдЗрдЯреНрд╕ рдЙрдЬрд╡реАрдХрдбреЗ рд╣рд▓рд╡рд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдирд┐рдпрдо

iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"

TCP рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рди рдирд╛рд╣реА рдХрд╛ рддреЗ рддрдкрд╛рд╕рддреЗ 0x29. рдореА рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╛рдд рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА, рдХрд╛рд░рдг рд╣реЗ рдЖрдзреАрдЪ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдХреА рдЕрд╕реЗ рдирд┐рдпрдо рд╣рд╛рддрд╛рдиреЗ рд▓рд┐рд╣рд┐рдгреЗ рдлрд╛рд░ рд╕реЛрдпреАрдЪреЗ рдирд╛рд╣реА. рд▓реЗрдЦрд╛рдд рдмреАрдкреАрдПрдл - рд╡рд┐рд╕рд░рд▓реЗрд▓рд╛ рдмрд╛рдпрдХреЛрдб, рд╕рд╛рдареА рд╡рд╛рдкрд░ рдЖрдгрд┐ рдирд┐рдпрдо рдирд┐рд░реНрдорд┐рддреАрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╕рд╣ рдЕрдиреЗрдХ рджреБрд╡реЗ рдЖрд╣реЗрдд xt_u32. рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рд▓рд┐рдВрдХреНрд╕ рджреЗрдЦреАрд▓ рдкрд╣рд╛.

2013 рдкрд╛рд╕реВрди рдореЙрдбреНрдпреВрд▓ рдРрд╡рдЬреА рдореЙрдбреНрдпреВрд▓ xt_u32 рддреБрдореНрд╣реА BPF рдЖрдзрд╛рд░рд┐рдд рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ xt_bpf. рдЬреНрдпрд╛рдиреЗ рд╣реЗ рдЖрддрд╛рдкрд░реНрдпрдВрдд рд╡рд╛рдЪрд▓реЗ рдЖрд╣реЗ рддреНрдпрд╛рдВрдиреА рддреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреНрдпрд╛ рддрддреНрддреНрд╡рд╛рдмрджреНрджрд▓ рдЖрдзреАрдЪ рд╕реНрдкрд╖реНрдЯ рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ: iptables рдирд┐рдпрдо рдореНрд╣рдгреВрди BPF bytecode рдЪрд╛рд▓рд╡рд╛. рддреБрдореНрд╣реА рдПрдХ рдирд╡реАрди рдирд┐рдпрдо рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдпрд╛рдкреНрд░рдорд╛рдгреЗ:

iptables -A INPUT -m bpf --bytecode <╨▒╨░╨╣╤В╨║╨╛╨┤> -j LOG

рдпреЗрдереЗ <╨▒╨░╨╣╤В╨║╨╛╨┤> - рд╣рд╛ рдЕрд╕реЗрдВрдмрд▓рд░ рдЖрдЙрдЯрдкреБрдЯ рдлреЙрд░рдореЕрдЯрдордзреАрд▓ рдХреЛрдб рдЖрд╣реЗ bpf_asm рдбреАрдлреЙрд▓реНрдЯрдиреБрд╕рд╛рд░, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде,

$ cat /tmp/test.bpf
ldb [9]
jneq #17, ignore
ret #1
ignore: ret #0

$ bpf_asm /tmp/test.bpf
4,48 0 0 9,21 0 1 17,6 0 0 1,6 0 0 0,

# iptables -A INPUT -m bpf --bytecode "$(bpf_asm /tmp/test.bpf)" -j LOG

рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд рдЖрдкрдг рд╕рд░реНрд╡ UDP рдкреЕрдХреЗрдЯреНрд╕ рдлрд┐рд▓реНрдЯрд░ рдХрд░рдд рдЖрд╣реЛрдд. рдореЙрдбреНрдпреВрд▓рдордзреАрд▓ рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдорд╕рд╛рдареА рд╕рдВрджрд░реНрдн xt_bpf, рдЕрд░реНрдерд╛рддрдЪ, рдкреЕрдХреЗрдЯ рдбреЗрдЯрд╛рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд░рддреЗ, iptables рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, IPv4 рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рд╕реБрд░реВрд╡рд╛рддреАрд╕. рдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреВрди рдкрд░рддрд╛рд╡рд╛ рдореВрд▓реНрдп рдмреБрд▓рд┐рдпрдирдХреБрдареЗ false рдореНрд╣рдгрдЬреЗ рдкреЕрдХреЗрдЯ рдЬреБрд│рдд рдирд╛рд╣реА.

рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдХреА рдореЙрдбреНрдпреВрд▓ xt_bpf рд╡рд░реАрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдкреЗрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдлрд┐рд▓реНрдЯрд░рдЪреЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ. рдХреНрд▓рд╛рдЙрдбрдлреЗрдЕрд░рдордзреАрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ. рдЕрд▓реАрдХрдбреЗ рдкрд░реНрдпрдВрдд рддреНрдпрд╛рдВрдиреА рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдкрд░рд▓реЗ xt_bpf DDoS рд╣рд▓реНрд▓реНрдпрд╛рдВрдкрд╛рд╕реВрди рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА. рд▓реЗрдЦрд╛рдд BPF рдЯреВрд▓реНрд╕ рд╕рд╛рджрд░ рдХрд░рдд рдЖрд╣реЛрдд рддреЗ BPF рдлрд┐рд▓реНрдЯрд░ рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рддрд╛рдд (рдЖрдгрд┐ рдХрд╛) рддреЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛рдд рдЖрдгрд┐ рдЕрд╕реЗ рдлрд┐рд▓реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрддрддреЗрдЪреНрдпрд╛ рд╕рдВрдЪрд╛рдЪреНрдпрд╛ рд▓рд┐рдВрдХреНрд╕ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЙрдкрдпреБрдХреНрддрддрд╛ рд╡рд╛рдкрд░рдгреЗ bpfgen рддреБрдореНрд╣реА рдирд╛рд╡рд╛рд╕рд╛рдареА DNS рдХреНрд╡реЗрд░реАрд╢реА рдЬреБрд│рдгрд╛рд░рд╛ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛ habr.com:

$ ./bpfgen --assembly dns -- habr.com
ldx 4*([0]&0xf)
ld #20
add x
tax

lb_0:
    ld [x + 0]
    jneq #0x04686162, lb_1
    ld [x + 4]
    jneq #0x7203636f, lb_1
    ldh [x + 8]
    jneq #0x6d00, lb_1
    ret #65535

lb_1:
    ret #0

рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рдЖрдкрдг рдкреНрд░рдердо рд░рдЬрд┐рд╕реНрдЯрд░рдордзреНрдпреЗ рд▓реЛрдб рдХрд░рддреЛ X рдУрд│реАрдЪреНрдпрд╛ рдкрддреНрддреНрдпрд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд x04habrx03comx00 UDP рдбреЗрдЯрд╛рдЧреНрд░рд╛рдордордзреНрдпреЗ рдЖрдгрд┐ рдирдВрддрд░ рд╡рд┐рдирдВрддреА рддрдкрд╛рд╕рд╛: 0x04686162 <-> "x04hab" рдЖрдгрд┐ рдпрд╛рдкреНрд░рдорд╛рдгреЗ.

рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рдиреЗ, рдХреНрд▓рд╛рдЙрдбрдлреЗрдЕрд░рдиреЗ p0f -> BPF рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓рд╛. рд▓реЗрдЦрд╛рдд p0f BPF рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╛рджрд░ рдХрд░рдд рдЖрд╣реЗ рддреЗ p0f рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рдЖрдгрд┐ p0f рд╕реНрд╡рд╛рдХреНрд╖рд░реА BPF рдордзреНрдпреЗ рдХрд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рд╛рдпрдЪреЗ рдпрд╛рдмрджреНрджрд▓ рдмреЛрд▓рддрд╛рдд:

$ ./bpfgen p0f -- 4:64:0:0:*,0::ack+:0
39,0 0 0 0,48 0 0 8,37 35 0 64,37 0 34 29,48 0 0 0,
84 0 0 15,21 0 31 5,48 0 0 9,21 0 29 6,40 0 0 6,
...

рд╕рдзреНрдпрд╛ рдХреНрд▓рд╛рдЙрдбрдлреЗрдЕрд░ рд╡рд╛рдкрд░рдд рдирд╛рд╣реА xt_bpf, рддреЗ XDP рд╡рд░ рдЧреЗрд▓реЗ рдЕрд╕рд▓реНрдпрд╛рдиреЗ - BPF рдЪреА рдирд╡реАрди рдЖрд╡реГрддреНрддреА рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд░реНрдпрд╛рдпрд╛рдВрдкреИрдХреА рдПрдХ, рдкрд╣рд╛. L4Drop: XDP DDoS рд╢рдорди.

cls_bpf

рдХрд░реНрдирд▓рдордзреНрдпреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдл рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рд╢реЗрд╡рдЯрдЪреЗ рдЙрджрд╛рд╣рд░рдг рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░ рдЖрд╣реЗ cls_bpf рд▓рд┐рдирдХреНрд╕рдордзреАрд▓ рд╡рд╛рд╣рддреВрдХ рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдкреНрд░рдгрд╛рд▓реАрд╕рд╛рдареА, 2013 рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА рд▓рд┐рдирдХреНрд╕рдордзреНрдпреЗ рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ рдЖрдгрд┐ рд╕рдВрдХрд▓реНрдкрдирд╛рддреНрдордХрдкрдгреЗ рдкреНрд░рд╛рдЪреАрди cls_u32.

рддрдерд╛рдкрд┐, рдЖрдореНрд╣реА рдЖрддрд╛ рдХрд╛рдорд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░ рдирд╛рд╣реА cls_bpf, рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдмрджреНрджрд▓ рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реАрд╣реА рджреЗрдгрд╛рд░ рдирд╛рд╣реА - рдЖрдореНрд╣реА рдЖрдзреАрдЪ рд╕рд░реНрд╡ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╢реА рдкрд░рд┐рдЪрд┐рдд рдЭрд╛рд▓реЛ рдЖрд╣реЛрдд. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд BPF рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдВрдордзреНрдпреЗ, рдЖрдореНрд╣реА рдпрд╛ рд╡рд░реНрдЧреАрдХрд░рдгрдХрд░реНрддреНрдпрд╛рд▓рд╛ рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд╡реЗрд│рд╛ рднреЗрдЯреВ.

рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд╛рдкрд░рдгреНрдпрд╛рдмрджреНрджрд▓ рди рдмреЛрд▓рдгреНрдпрд╛рдЪреЗ рдЖрдгрдЦреА рдПрдХ рдХрд╛рд░рдг c cls_bpf рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдлрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд, рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд рд▓рд╛рдЧреВ рд╣реЛрдгреНрдпрд╛рдЪрд╛ рд╡реНрдпрд╛рдкреНрддреА рдкреВрд░реНрдгрдкрдгреЗ рд╕рдВрдХреБрдЪрд┐рдд рдЖрд╣реЗ: рд╢рд╛рд╕реНрддреНрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреЕрдХреЗрдЬрдордзреАрд▓ рд╕рд╛рдордЧреНрд░реА рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реАрдд рдЖрдгрд┐ рдХреЙрд▓ рджрд░рдореНрдпрд╛рди рд╕реНрдерд┐рддреА рд╡рд╛рдЪрд╡реВ рд╢рдХрдд рдирд╛рд╣реАрдд.

рддреНрдпрд╛рдореБрд│реЗ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд▓рд╛ рдирд┐рд░реЛрдк рдШреЗрдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рднрд╡рд┐рд╖реНрдпрд╛рдХрдбреЗ рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ.

рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд▓рд╛ рдирд┐рд░реЛрдк

рдирд╡реНрд╡рджрдЪреНрдпрд╛ рджрд╢рдХрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд╡рд┐рдХрд╕рд┐рдд рдЭрд╛рд▓реЗрд▓реЗ рдмреАрдкреАрдПрдл рддрдВрддреНрд░рдЬреНрдЮрд╛рди рдПрдХ рдЪрддреБрд░реНрдерд╛рдВрд╢ рд╢рддрдХ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдХрд╕реЗ рдЬрдЧрд▓реЗ рдЖрдгрд┐ рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрдд рдирд╡реАрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕реЗ рд╕рд╛рдкрдбрд▓реЗ рддреЗ рдЖрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реЗ. рддрдерд╛рдкрд┐, рд╕реНрдЯреЕрдХ рдорд╢реАрдиреНрд╕рдкрд╛рд╕реВрди RISC рдордзреАрд▓ рд╕рдВрдХреНрд░рдордгрд╛рдкреНрд░рдорд╛рдгреЗрдЪ, рдЬреНрдпрд╛рдиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рд╕рд╛рдареА рдкреНрд░реЗрд░рдгрд╛ рдореНрд╣рдгреВрди рдХрд╛рдо рдХреЗрд▓реЗ, 32 рдЪреНрдпрд╛ рджрд╢рдХрд╛рдд 64-рдмрд┐рдЯ рдордзреВрди XNUMX-рдмрд┐рдЯ рдорд╢реАрдирдордзреНрдпреЗ рд╕рдВрдХреНрд░рдордг рдЭрд╛рд▓реЗ рдЖрдгрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдК рд▓рд╛рдЧрд▓реЗ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдХреНрд▓рд╛рд╕рд┐рдХ BPF рдЪреНрдпрд╛ рдХреНрд╖рдорддрд╛ рдЦреВрдк рдорд░реНрдпрд╛рджрд┐рдд рдЖрд╣реЗрдд, рдЖрдгрд┐ рдХрд╛рд▓рдмрд╛рд╣реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд - рдЖрдордЪреНрдпрд╛рдХрдбреЗ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рд╡рд░ рдХреЙрд▓ рджрд░рдореНрдпрд╛рди рд╕реНрдерд┐рддреА рдЬрддрди рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдирд╛рд╣реА, рдереЗрдЯ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдирд╛рд╣реА, рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рдЪреА рдХреЛрдгрддреАрд╣реА рд╢рдХреНрдпрддрд╛ рдирд╛рд╣реА. рдХрд░реНрдирд▓рд╕рд╣, рдорд░реНрдпрд╛рджрд┐рдд рд╕рдВрдЦреНрдпреЗрдЪреНрдпрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлреАрд▓реНрдб рд╡рд╛рдЪрдгреНрдпрд╛рд╢рд┐рд╡рд╛рдп sk_buff рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреА рд╣реЗрд▓реНрдкрд░ рдлрдВрдХреНрд╢рдиреНрд╕ рд▓рд╛рдБрдЪ рдХреЗрд▓реНрдпрд╛рдиреЗ, рддреБрдореНрд╣реА рдкреЕрдХреЗрдЯреНрд╕рдЪреА рд╕рд╛рдордЧреНрд░реА рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА.

рдЦрд░реЗрддрд░, рд╕рдзреНрдпрд╛ рд▓рд┐рдирдХреНрд╕рдордзреАрд▓ рдХреНрд▓рд╛рд╕рд┐рдХ рдмреАрдкреАрдПрдлрдЪреЗ рдЬреЗ рдХрд╛рд╣реА рд╢рд┐рд▓реНрд▓рдХ рдЖрд╣реЗ рддреЗ рдПрдкреАрдЖрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдЖрд╣реЗ, рдЖрдгрд┐ рдХрд░реНрдирд▓рдЪреНрдпрд╛ рдЖрдд рд╕рд░реНрд╡ рдХреНрд▓рд╛рд╕рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕, рдордЧ рддреЗ рд╕реЙрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░реНрд╕ рдХрд┐рдВрд╡рд╛ рд╕реЗрдХрдХреЙрдореНрдк рдлрд┐рд▓реНрдЯрд░реНрд╕ рдЕрд╕реЛрдд, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдмреАрдкреАрдПрдл рдпрд╛ рдирд╡реАрди рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. (рд╣реЗ рдиреЗрдордХреЗ рдХрд╕реЗ рдШрдбрддреЗ рдпрд╛рдмрджреНрджрд▓ рдЖрдкрдг рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдд рдмреЛрд▓реВ.)

рдирд╡реАрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдордзреНрдпреЗ рд╕рдВрдХреНрд░рдордг 2013 рдордзреНрдпреЗ рд╕реБрд░реВ рдЭрд╛рд▓реЗ, рдЬреЗрд╡реНрд╣рд╛ рдЕреЕрд▓реЗрдХреНрд╕реА рд╕реНрдЯрд╛рд░реЛрд╡реЛрдЗрдЯреЛрд╡реНрд╣рдиреЗ рдмреАрдкреАрдПрдл рдЕрджреНрдпрддрди рдпреЛрдЬрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреЗрд▓реА. 2014 рдордзреНрдпреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреЕрдЪ рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реЗ рдХреЛрд░ рдордзреНрдпреЗ. рдЬреЛрдкрд░реНрдпрдВрдд рдорд▓рд╛ рд╕рдордЬрд▓реЗ рдЖрд╣реЗ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдпреЛрдЬрдирд╛ рдХреЗрд╡рд│ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ JIT рдХрдВрдкрд╛рдЗрд▓рд░рд▓рд╛ 64-рдмрд┐рдЯ рдорд╢реАрдирд╡рд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдиреЗ рдЪрд╛рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЛрддреА, рдкрд░рдВрддреБ рддреНрдпрд╛рдРрд╡рдЬреА рдпрд╛ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирдиреЗ рд▓рд┐рдирдХреНрд╕рдЪреНрдпрд╛ рд╡рд┐рдХрд╛рд╕рд╛рддреАрд▓ рдирд╡реАрди рдЕрдзреНрдпрд╛рдпрд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд рдХреЗрд▓реА.

рдпрд╛ рдорд╛рд▓рд┐рдХреЗрддреАрд▓ рдкреБрдвреАрд▓ рд▓реЗрдЦ рдирд╡реАрди рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪреНрдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХрд░рддреАрд▓, рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдЕрдВрддрд░реНрдЧрдд BPF, рдирдВрддрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд BPF рдЖрдгрд┐ рдЖрддрд╛ рдлрдХреНрдд BPF рдореНрд╣рдгреВрди рдУрд│рдЦрд▓реЗ рдЬрд╛рддреЗ.

рд╕рдВрджрд░реНрдн

  1. рд╕реНрдЯреАрд╡реНрд╣рди рдореЕрдХрдХреЗрди рдЖрдгрд┐ рд╡реНрд╣реЕрди рдЬреЗрдХрдмрд╕рди, "рдж рдмреАрдПрд╕рдбреА рдкреЕрдХреЗрдЯ рдлрд┐рд▓реНрдЯрд░: рдП рдиреНрдпреВ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдлреЙрд░ рдпреБрдЬрд░-рд▓реЗрд╡реНрд╣рд▓ рдкреЕрдХреЗрдЯ рдХреЕрдкреНрдЪрд░", https://www.tcpdump.org/papers/bpf-usenix93.pdf
  2. рд╕реНрдЯреАрд╡реНрд╣рди рдореЕрдХрдХреЗрди, "libpcap: рдкреЕрдХреЗрдЯ рдХреЕрдкреНрдЪрд░рд╕рд╛рдареА рдПрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрдгрд┐ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдкрджреНрдзрдд", https://sharkfestus.wireshark.org/sharkfest.11/presentations/McCanne-Sharkfest'11_Keynote_Address.pdf
  3. tcpdump, libpcap: https://www.tcpdump.org/
  4. IPtable U32 рдореЕрдЪ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓.
  5. BPF - рд╡рд┐рд╕рд░рд▓реЗрд▓рд╛ рдмрд╛рдпрдХреЛрдб: https://blog.cloudflare.com/bpf-the-forgotten-bytecode/
  6. BPF рдЯреВрд▓ рд╕рд╛рджрд░ рдХрд░рдд рдЖрд╣реЗ: https://blog.cloudflare.com/introducing-the-bpf-tools/
  7. bpf_cls: http://man7.org/linux/man-pages/man8/tc-bpf.8.html
  8. рдПрдХ seccomp рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди: https://lwn.net/Articles/656307/
  9. https://github.com/torvalds/linux/blob/master/Documentation/userspace-api/seccomp_filter.rst
  10. habr: рдХрдВрдЯреЗрдирд░ рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд╛: seccomp
  11. habr: systemd рд╕рд╣ рдбрд┐рдорди рд╡реЗрдЧрд│реЗ рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ "рдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдбреЙрдХрд░рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА!"
  12. рдкреЙрд▓ рдЪреИрдЧрдиреЙрди, "strace --seccomp-bpf: рдЕ рд▓реБрдХ рдЕрдВрдбрд░ рдж рд╣реБрдб", https://fosdem.org/2020/schedule/event/debugging_strace_bpf/
  13. netsniff-ng: http://netsniff-ng.org/

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛