рдкрд┐рдЫрд▓реА рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА!
рд╣рдордиреЗ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдЕрджреНрднреБрдд
рд▓рд┐рдирдХреНрд╕ рдкреНрд░рд╢рд╛рд╕рдХ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐рд╢реАрд▓ рдкрд╛рдареНрдпрдХреНрд░рдо, рдпрд╛рдиреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдФрд░ рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рддрджрдиреБрд╕рд╛рд░, рд╣рдо рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рдФрд░
рдПрдХ рдЦреБрд▓рд╛ рд╕рдмрдХ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдореИрдЯреЛ рдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛
рдореВрд▓ рд╢реАрд░реНрд╖рдХ: eBPF (RHEL 8 Beta) рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рдмрдЧрд┐рдВрдЧрдкрд░рд┐рдЪрдпрдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдПрдХ рд░реЛрдорд╛рдВрдЪрдХ рдЕрдиреБрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдЯрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ "рдХреНрд╖реЗрддреНрд░ рдореЗрдВ" рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдиреЗрдЯрд╡рд░реНрдХ рдиреЗрдорд╕реНрдкреЗрд╕, рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди,
tc
рдФрд░
netfilter
ред рдиреЗрдЯрд╡рд░реНрдХ рдиреЗрдорд╕реНрдкреЗрд╕ рдФрд░ рд╡реАрде рдбрд┐рд╡рд╛рдЗрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдмреНрд░рд┐рдЬ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдорд╛рдирдХ рдиреЗрдЯрд╡рд░реНрдХ рдЯреВрд▓, рдЬреИрд╕реЗ рдХрд┐
iptables
рдпрд╛
tc
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ SSH рд╕рд░реНрд╡рд░ рдХреЗ
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-unreachable
рд╣реЛрдиреЗ рдкрд░ рдЙрддреНрдкрдиреНрди ICMP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-unreachable
, рддреЛ
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-unreachable
рд╕рд╣реА рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ
iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-unreachable
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдЖрд▓реЗрдЦ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рдЙрдиреНрдирдд рд╕рдВрд╕реНрдХрд░рдг
eBPF (рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд BPF) рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдирд┐рд╡рд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВред eBPF рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдИ рддрдХрдиреАрдХ рд╣реИ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдПрд╕рдбреАрдХреЗ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЪрд▓реЛ рд╕реБрдзрд╛рд░ рдХреА рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ
Red Hat Enterprise Linux 8 рдмреАрдЯрд╛ рдХреЗ рд╕рд╛рде XDP (eXpress рдбреЗрдЯрд╛ рдкрд╛рде) рдЬрд╣рд╛рдЬ, рдЬрд┐рд╕реЗ рдЖрдк рдЕрднреА рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
eBPF рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЯреВрд▓ рд╣реИ рдЬреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧрд╛ред
рд╕рдорд╕реНрдпрд╛рдореИрдВрдиреЗ
рдУрдкрди vSwitch (OVS) рдиреЗрдЯрд╡рд░реНрдХ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рд╕реНрдерд╛рдкрдирд╛ рд╢рд╛рдорд┐рд▓ рдереА: рдХреБрдЫ рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯ рдмрд┐рдЦрд░реЗ рд╣реБрдП рдереЗ рдФрд░ рдЧрд▓рдд рдХреНрд░рдо рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рдФрд░ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреА рдмреИрдВрдбрд╡рд┐рдбреНрде рд╕реНрдерд┐рд░ 6 рдЬреАрдмреА / рдПрд╕ рд╕реЗ рдЧрд┐рд░рдХрд░ 2-4 рдЬреАрдмреА / рдПрд╕ рд╕реЗ рдмрд╣ рд░рд╣реА рдереАред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкреАрдПрд╕рдПрдЪ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯ рдЧрд▓рдд рдХреНрд░рдо рдореЗрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛: рдХреЗрд╡рд▓ рдкрд╣рд▓рд╛ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐ рдХрдиреЗрдХреНрд╢рдиред
рдореИрдВрдиреЗ рджреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рдХрдИ рдорджрдж рд▓реЗрдЦреЛрдВ рдФрд░ рдЦреЛрдЬ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рди рддреЛ
iptables
рдФрд░ рди рд╣реА
nftables
рдЯреАрд╕реАрдкреА рдЭрдВрдбреЗ рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐
tc
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЭрдВрдбреЗ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдХреЗ рдФрд░ рдирдП рдХрдиреЗрдХреНрд╢рди рдФрд░ рдЯреАрд╕реАрдкреА рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ред
рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ
iptables
, рд╕рдВрдпреЛрдЬрди рдФрд░
tc
рд╕рдВрдпреЛрдЬрди рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛
conntrack
, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ eBPF рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╣реИред
EBPF рдХреНрдпрд╛ рд╣реИ?eBPF рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдПрдХ рдЙрдиреНрдирдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рд╡рд╣ BPF рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рд▓рд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдЖрдкрдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рди рдХреЗрд╡рд▓ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдВрдкрд╛рджрд┐рдд рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдХреНрд╕рд░ рдИрдПрдХреНрд╕рдкреАрдПрдл рдХреЛ рдХреЗрд╡рд▓ рдмреАрдкреАрдПрдл рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмреАрдкреАрдПрдл рдХреЛ рд╕реАрдмреАрдкреАрдПрдл (рдХреНрд▓рд╛рд╕рд┐рдХ (рдХреНрд▓рд╛рд╕рд┐рдХ) рдмреАрдкреАрдПрдл) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП "рдмреАрдкреАрдПрдл" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЕрд░реНрде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░: рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╣рдореЗрд╢рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВред
"рд╣реБрдб рдХреЗ рддрд╣рдд" рдИрдПрдХреНрд╕рдкреАрдПрдл рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЖрднрд╛рд╕реА рдорд╢реАрди рд╣реИ рдЬреЛ рдмрд╛рдпреЛрдЯреЗрдХреНрд╕ рдХреЗ рдЫреЛрдЯреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдХреБрдЫ рдореЗрдореЛрд░реА рдмрдлрд╝рд░реНрд╕ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред EBPF рдореЗрдВ рдРрд╕реА рд╕реАрдорд╛рдПрдБ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрд╛рддреА рд╣реИрдВ:
- рдЪрдХреНрд░ рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВ рддрд╛рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордп рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП;
- рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдЯреИрдХ рдФрд░ рд╕реНрдХреНрд░реИрдЪ рдмрдлрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ;
- рдХреЗрд╡рд▓ рдЕрдиреБрдордд рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, eBPF рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИред EBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- рдПрдХ рднреМрддрд┐рдХ рдпрд╛ рдЖрднрд╛рд╕реА рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдХреЗ рдЖрд░рдПрдХреНрд╕ рдкрде рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдбреАрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ;
- рдЗрдирдкреБрдЯ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ
tc
рд╕реЗ qdisc рд╕реЗ рдЬреБрдбрд╝рд╛ред
рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ EBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ C рдХреЛрдб рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ bytecode рдореЗрдВ рдмрджрд▓реЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд XDP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
SEC("prog") int xdp_main(struct xdp_md *ctx) { void *data_end = (void *)(uintptr_t)ctx->data_end; void *data = (void *)(uintptr_t)ctx->data; struct ethhdr *eth = data; struct iphdr *iph = (struct iphdr *)(eth + 1); struct icmphdr *icmph = (struct icmphdr *)(iph + 1); if (icmph + 1 > data_end) return XDP_PASS; if (eth->h_proto != ntohs(ETH_P_IP) || iph->protocol != IPPROTO_ICMP || icmph->type != ICMP_ECHOREPLY) return XDP_PASS; if (iph->ttl) { uint16_t *ttlproto = (uint16_t *)&iph->ttl; uint16_t old_ttlproto = *ttlproto; iph->ttl = bpf_get_prandom_u32() % iph->ttl + 1; csum_replace2(&iph->check, old_ttlproto, *ttlproto); } return XDP_PASS; } char _license[] SEC("license") = "GPL";
рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕реНрдирд┐рдкреЗрдЯ
include
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ, рд╕рд╣рд╛рдпрдХреЛрдВ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЛрдб рдХреЛ
include
рдХрд┐рдП рдмрд┐рдирд╛, рдПрдХ XDP рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд ICMP рдЗрдХреЛ рд░рд┐рдкреНрд▓рд╛рдИ рдпрд╛рдиреА рдЯреАрдЯреАрдПрд▓ рдХреЗ TTL рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ
xdp_md
рд╕рдВрд░рдЪрдирд╛
xdp_md
рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреИрдХреЗрдЬ рдХреЗ рдЖрд░рдВрдн рдФрд░ рдЕрдВрдд рдореЗрдВ рджреЛ
xdp_md
рд╣реЛрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ eBPF рдмрд╛рдИрдЯреЗрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреБрдХреНрдд рд╕рдорд░реНрдерди рд╡рд╛рд▓реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрд▓реИрдВрдЧ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ bpf рдХреЛ рд▓рдХреНрд╖реНрдп рдмрдирд╛рдХрд░ eBPF рдмрд╛рдпрдЯреЗрдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИ:
$ clang -O2 -target bpf -c xdp_manglepong.c -o xdp_manglepong.o
рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХрдорд╛рдВрдб рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд░реАрдм рд╕реЗ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рд▓рд┐рдирдХреНрд╕ рдИрдПрдХреНрд╕рдкреАрдПрдл рд╣реИ, рди рдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдореВрд▓ рдкреНрд░рдХрд╛рд░:
$ readelf -h xdp_manglepong.o ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: REL (Relocatable file) Machine: Linux BPF <--- HERE [...]
рдПрдХ рдирд┐рдпрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрд╡рд░рдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, EBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо XDP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде
iproute2
рдкреИрдХреЗрдЬ рд╕реЗ
ip
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдпрд╣ рдХрдорд╛рдВрдб рд▓рдХреНрд╖реНрдп wlan0 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░, -force рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкрд╣рд▓реЗ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдИрдкреАрдкреАрдПрдл рдХреЛрдб рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИред EBPF рдмрд╛рдЗрдЯрдХреЛрдб рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:
$ ping -c10 192.168.85.1 PING 192.168.85.1 (192.168.85.1) 56(84) bytes of data. 64 bytes from 192.168.85.1: icmp_seq=1 ttl=41 time=0.929 ms 64 bytes from 192.168.85.1: icmp_seq=2 ttl=7 time=0.954 ms 64 bytes from 192.168.85.1: icmp_seq=3 ttl=17 time=0.944 ms 64 bytes from 192.168.85.1: icmp_seq=4 ttl=64 time=0.948 ms 64 bytes from 192.168.85.1: icmp_seq=5 ttl=9 time=0.803 ms 64 bytes from 192.168.85.1: icmp_seq=6 ttl=22 time=0.780 ms 64 bytes from 192.168.85.1: icmp_seq=7 ttl=32 time=0.847 ms 64 bytes from 192.168.85.1: icmp_seq=8 ttl=50 time=0.750 ms 64 bytes from 192.168.85.1: icmp_seq=9 ttl=24 time=0.744 ms 64 bytes from 192.168.85.1: icmp_seq=10 ttl=42 time=0.791 ms --- 192.168.85.1 ping statistics --- 10 packets transmitted, 10 received, 0% packet loss, time 125ms rtt min/avg/max/mdev = 0.744/0.849/0.954/0.082 ms
рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЯ рдИрдЬреАрдкреАрдПрдл рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реИ рдпрд╛ рдЫреЛрдбрд╝рдирд╛ рд╣реИред
рдХреИрд╕реЗ eBPF рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИрдореВрд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрдИ рдЯреАрд╕реАрдкреА рдЭрдВрдбреЗ, рдПрдХ рдкреНрд░рддрд┐ рдХрдиреЗрдХреНрд╢рди, рдФрд░ рди рддреЛ
iptables
рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдФрд░ рди рд╣реА
tc
рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рдПрдХ рдУрд╡реАрдПрд╕ рдмреНрд░рд┐рдЬ рд╕реЗ рдЬреБрдбрд╝реА рджреЛ рдЖрднрд╛рд╕реА рдорд╢реАрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рдФрд░ рдмрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рд╡реАрдПрдо рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдИрдкреАрдкреАрдПрдл рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред
рдпрд╣ рдПрдХ рдорд╣рд╛рди рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ XDP рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рдкреИрдХреЗрдЯреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ eBPF рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ
rx
рдкрде рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рд╕реНрд╡рд┐рдЪ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝реЗрдЧрд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, EBPF рдХреЛ
tc
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ VM рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрде рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐
tc
рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ qdisk рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣реЛрд╕реНрдЯ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, eBPF рдХреЛ рдЖрдЙрдЯрдкреБрдЯ qdisk рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
EBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп,
XDP
рдФрд░
tc
API рдХреЗ рдмреАрдЪ рдХреБрдЫ рдЕрдВрддрд░ рд╣реЛрддреЗ рд╣реИрдВ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рдирд╛рдо, рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рд░рд┐рдЯрд░реНрди рдорд╛рдиред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдиреАрдЪреЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ tc рдПрдХреНрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдкрд░ TCP рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ:
#define RATIO 10 SEC("action") int bpf_main(struct __sk_buff *skb) { void *data = (void *)(uintptr_t)skb->data; void *data_end = (void *)(uintptr_t)skb->data_end; struct ethhdr *eth = data; struct iphdr *iph = (struct iphdr *)(eth + 1); struct tcphdr *tcphdr = (struct tcphdr *)(iph + 1); if ((void *)(tcphdr + 1) > data_end) return TC_ACT_OK; if (eth->h_proto != __constant_htons(ETH_P_IP) || iph->protocol != IPPROTO_TCP) return TC_ACT_OK; if (tcphdr->syn || tcphdr->fin || tcphdr->rst || tcphdr->psh) return TC_ACT_OK; if (bpf_get_prandom_u32() % RATIO == 0) tcphdr->psh = 1; return TC_ACT_OK; } char _license[] SEC("license") = "GPL";
рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдКрдкрд░ XDP рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
clang -O2 -target bpf -c tcp_psh.c -o tcp_psh.o
рд▓реЗрдХрд┐рди рдбрд╛рдЙрдирд▓реЛрдб рдЕрд▓рдЧ рд╣реИ:
рдЕрдм eBPF рдХреЛ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ VM рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╡реАрдПрдо рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкреИрдХреЗрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:

tcpdump
рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирдпрд╛ eBPF рдХреЛрдб рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╣рд░ 10 TCP рдкреИрдХреЗрдЯ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 1 рдореЗрдВ PSS рдлрд╝реНрд▓реИрдЧ рд╕реЗрдЯ рд╣реИред рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реА-рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 20 рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЬреЛ "рдпреБрджреНрдз рдореЗрдВ" рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдкреБрди: рд╕реНрдерд╛рдкрд┐рдд рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛! рдЗрд╕рдиреЗ
рдУрдкрди рд╡реАрд╕реНрд╡рд┐рдЪ рдлрд┐рдХреНрд╕ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓
рдХрд░ рджрд┐рдпрд╛ , рдЬреЛ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖eBPF рдПрдХ рдХрд╛рдлреА рдирдИ рддрдХрдиреАрдХ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдореБрджрд╛рдп рдХреА рд╕реНрдкрд╖реНрдЯ рд░рд╛рдп рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдИрдПрдХреНрд╕рдкреАрдПрдл рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
bpfilter , рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рд░рд╣реА рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрдИ рдЙрдкрдХрд░рдг рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рд╕реАрдзреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдореЗрдВ eBPF рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд▓рдЧреЗ рд╣реИрдВред
eBPF рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ рдФрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧрд╛ред
рдЕрдВрддрд╣рдо рдпрд╣рд╛рдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ
рдЦреБрд▓реЗ рдкрд╛рда рдХреА рдпрд╛рддреНрд░рд╛ рдХреЗ рд▓рд┐рдП рднреА рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдпрджрд┐ рдЖрдк рдкреНрд░рд╢реНрди рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред