{"id":313558,"date":"2020-11-22T15:00:54","date_gmt":"2020-11-22T15:00:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=313558"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=313558","title":{"rendered":"BPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f: \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/post\/514736\/\">BPF<\/a> \u2014 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u044f\u0434\u0440\u0430 Linux \u2014\u00a0\u0438 \u0432 \u044d\u0442\u043e\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0447\u0438\u0441\u0442\u043e\u0433\u0430\u043d\u0430. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0441\u044b\u043b\u043e\u043a, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u0434\u0432\u0435 \u0441 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043e\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u043d\u0438\u0436\u043a\u0438 \u043f\u0440\u043e BPF.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044f\u0434\u0440\u0435 Linux \u0432\u0435\u0440\u0441\u0438\u0438 5.9 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, \u0438 \u043f\u0440\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u043f\u043e\u043d\u0435\u0432\u043e\u043b\u0435, \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439, \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435. \u041d\u043e, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e, \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u0437\u0430\u0447\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 BPF \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e BPF \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 DDoS \u0430\u0442\u0430\u043a, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 kubernetes, \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c \u043e\u0442 \u043d\u0430\u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c 24&#215;7 \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0434\u0435 \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435, \u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0q\/ch\/xj\/0qchxjfo0secpjjyh715v9jrxks.jpeg\" title=\"Edward Hicks - Noahs Ark 1846\"><a name=\"habracut\"><\/a>  <\/p>\n<h1>\u0422\u0438\u043f\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.9-rc4\/include\/uapi\/linux\/bpf.h#L168-L200\" rel=\"nofollow\"><code>include\/uapi\/linux\/bpf.h<\/code><\/a> \u044f\u0434\u0440\u0430 Linux. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0433\u0440\u0443\u043f\u043f\u0430\u043c (\u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430\u043c\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u044b \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043b\u0438\u043a\u0431\u0435\u0437-\u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044b):<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"#bpf_struct_ops\">\u041c\u0438\u043a\u0440\u043e\u044f\u0434\u0440\u043e Linux<\/a><\/li>\n<li><a href=\"#bpf_progs_tracing\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0434\u043b\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0441\u0431\u043e\u0440\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"#bpf_security\">Linux Security Modules<\/a><\/li>\n<li><a href=\"#bpf_prog_type_ext\">\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF<\/a><\/li>\n<li><a href=\"#bpf_lirc\">Linux Infrared Remote Control<\/a><\/li>\n<li><a href=\"#bpf_prog_networking\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><br \/> \n<ul>\n<li><a href=\"#linux_networking_stack\">* \u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a Linux: \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430<\/a><\/li>\n<li><a href=\"#bpf_prog_type_xdp\">\u0421\u0435\u0442\u0438 \u043d\u0430 \u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u0445 \u2014\u00a0Express Data Path<\/a><\/li>\n<li><a href=\"#struct__sk_buff\">* \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 struct __sk_buff<\/a><\/li>\n<li><a href=\"#bpf_prog_type_tc\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0432 Linux<\/a><\/li>\n<li><a href=\"#bpf_prog_type_socket_filter\">\u041e\u0442\u043a\u0443\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0448\u0435\u043b BPF<\/a><\/li>\n<li><a href=\"#bpf_flow_dissector\">\u00ab\u0420\u0430\u0441\u0441\u0435\u043a\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u00bb \u0438 flower<\/a><\/li>\n<li><a href=\"#bpf_cgroups\">BPF \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b<\/a><\/li>\n<li><a href=\"#bpf_sk\">BPF \u0438 \u0441\u043e\u043a\u0435\u0442\u044b<\/a><\/li>\n<li><a href=\"#bpf_lwt\">LWT: \u0442\u0443\u043d\u043d\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0438\u043a<\/a><\/li>\n<li><a href=\"#bpf_prog_type_unspec\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0430<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#the_end\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b <a href=\"https:\/\/habr.com\/ru\/post\/514736\/#introduction-to-bpf\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 BPF<\/a> \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u044b\u0445 \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0446\u0435\u043b\u044f\u0445, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435-\u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0434\u0430\u0442\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u044f\u0434\u0440\u0435, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u0432 \u044f\u0434\u0440\u0435, \u0430 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432\u0438\u0434\u0430 <code>BPF_PROG_*<\/code> \u0432\u0435\u0434\u0443\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u041a\u043e\u043c\u043c\u0438\u0442<\/th>\n<th>\u0410\u0432\u0442\u043e\u0440<\/th>\n<th>\u0414\u0430\u0442\u0430<\/th>\n<th>\u0422\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/09756af46893c\" rel=\"nofollow\"><code>0975<\/code><\/a><\/td>\n<td>Alexei\\ Starovoitov<\/td>\n<td>2014-09-26<\/td>\n<td><a href=\"#bpf_prog_type_unspec\"><code>BPF_PROG_TYPE_UNSPEC<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/ddd872bc3098f\" rel=\"nofollow\"><code>ddd8<\/code><\/a><\/td>\n<td>Alexei Starovoitov<\/td>\n<td>2014-12-01<\/td>\n<td><a href=\"#bpf_prog_type_socket_filter\"><code>BPF_PROG_TYPE_SOCKET_FILTER<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/2541517c32be2\" rel=\"nofollow\"><code>2541<\/code><\/a><\/td>\n<td>Alexei Starovoitov<\/td>\n<td>2015-03-25<\/td>\n<td><a href=\"#bpf_progs_tracing\"><code>BPF_PROG_TYPE_KPROBE<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/96be4325f443d\" rel=\"nofollow\"><code>96be<\/code><\/a><\/td>\n<td>Daniel Borkmann<\/td>\n<td>2015-03-01<\/td>\n<td><a href=\"#bpf_prog_type_tc\"><code>BPF_PROG_TYPE_SCHED_CLS<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/94caee8c312d9\" rel=\"nofollow\"><code>94ca<\/code><\/a><\/td>\n<td>Daniel Borkmann<\/td>\n<td>2015-03-20<\/td>\n<td><a href=\"#bpf_prog_type_tc\"><code>BPF_PROG_TYPE_SCHED_ACT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/98b5c2c65c295\" rel=\"nofollow\"><code>98b5<\/code><\/a><\/td>\n<td>Alexei Starovoitov<\/td>\n<td>2016-04-06<\/td>\n<td><a href=\"#bpf_progs_tracing\"><code>BPF_PROG_TYPE_TRACEPOINT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/6a773a15a1e88\" rel=\"nofollow\"><code>6a77<\/code><\/a><\/td>\n<td>Brenden Blanco<\/td>\n<td>2016-07-19<\/td>\n<td><a href=\"#bpf_prog_type_xdp\"><code>BPF_PROG_TYPE_XDP<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/0515e5999a466\" rel=\"nofollow\"><code>0515<\/code><\/a><\/td>\n<td>Alexei Starovoitov<\/td>\n<td>2016-09-01<\/td>\n<td><a href=\"#bpf_progs_tracing\"><code>BPF_PROG_TYPE_PERF_EVENT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/0e33661de493d\" rel=\"nofollow\"><code>0e33<\/code><\/a><\/td>\n<td>Daniel Mack<\/td>\n<td>2016-11-23<\/td>\n<td><a href=\"#bpf_cgroups\"><code>BPF_PROG_TYPE_CGROUP_SKB<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/6102365876003\" rel=\"nofollow\"><code>6102<\/code><\/a><\/td>\n<td>David Ahern<\/td>\n<td>2016-12-01<\/td>\n<td><a href=\"#bpf_cgroups\"><code>BPF_PROG_TYPE_CGROUP_SOCK<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/3a0af8fd61f90\" rel=\"nofollow\"><code>3a0a<\/code><\/a><\/td>\n<td>Thomas Graf<\/td>\n<td>2016-11-30<\/td>\n<td><a href=\"#bpf_lwt\"><code>BPF_PROG_TYPE_LWT_IN<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/3a0af8fd61f90\" rel=\"nofollow\"><code>3a0a<\/code><\/a><\/td>\n<td>Thomas Graf<\/td>\n<td>2016-11-30<\/td>\n<td><a href=\"#bpf_lwt\"><code>BPF_PROG_TYPE_LWT_OUT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/3a0af8fd61f90\" rel=\"nofollow\"><code>3a0a<\/code><\/a><\/td>\n<td>Thomas Graf<\/td>\n<td>2016-11-30<\/td>\n<td><a href=\"#bpf_lwt\"><code>BPF_PROG_TYPE_LWT_XMIT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/40304b2a1567f\" rel=\"nofollow\"><code>4030<\/code><\/a><\/td>\n<td>Lawrence Brakmo<\/td>\n<td>2017-06-30<\/td>\n<td><a href=\"#bpf_sk\"><code>BPF_PROG_TYPE_SOCK_OPS<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/b005fd189cec9\" rel=\"nofollow\"><code>b005<\/code><\/a><\/td>\n<td>John Fastabend<\/td>\n<td>2017-08-15<\/td>\n<td><a href=\"#bpf_sk\"><code>BPF_PROG_TYPE_SK_SKB<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/ebc614f687369\" rel=\"nofollow\"><code>ebc6<\/code><\/a><\/td>\n<td>Roman Gushchin<\/td>\n<td>2017-11-05<\/td>\n<td><a href=\"#bpf_cgroups\"><code>BPF_PROG_TYPE_CGROUP_DEVICE<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/4f738adba30a7\" rel=\"nofollow\"><code>4f73<\/code><\/a><\/td>\n<td>John Fastabend<\/td>\n<td>2018-03-18<\/td>\n<td><a href=\"#bpf_sk\"><code>BPF_PROG_TYPE_SK_MSG<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/c4f6699dfcb85\" rel=\"nofollow\"><code>c4f6<\/code><\/a><\/td>\n<td>Alexei Starovoitov<\/td>\n<td>2018-03-28<\/td>\n<td><a href=\"#bpf_progs_tracing\"><code>BPF_PROG_TYPE_RAW_TRACEPOINT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/4fbac77d2d092\" rel=\"nofollow\"><code>4fba<\/code><\/a><\/td>\n<td>Andrey Ignatov<\/td>\n<td>2018-03-30<\/td>\n<td><a href=\"#bpf_cgroups\"><code>BPF_PROG_TYPE_CGROUP_SOCK_ADDR<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/004d4b274e2a1\" rel=\"nofollow\"><code>004d<\/code><\/a><\/td>\n<td>Mathieu\\ Xhonneux<\/td>\n<td>2018-05-20<\/td>\n<td><a href=\"#bpf_lwt\"><code>BPF_PROG_TYPE_LWT_SEG6LOCAL<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/f4364dcfc86df\" rel=\"nofollow\"><code>f436<\/code><\/a><\/td>\n<td>Sean Young<\/td>\n<td>2018-05-27<\/td>\n<td><a href=\"#bpf_lirc\"><code>BPF_PROG_TYPE_LIRC_MODE2<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/2dbb9b9e6df67\" rel=\"nofollow\"><code>2dbb<\/code><\/a><\/td>\n<td>Martin KaFai Lau<\/td>\n<td>2018-08-08<\/td>\n<td><a href=\"#bpf_sk\"><code>BPF_PROG_TYPE_SK_REUSEPORT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/d58e468b1112d\" rel=\"nofollow\"><code>d58e<\/code><\/a><\/td>\n<td>Petar Penkov<\/td>\n<td>2018-09-14<\/td>\n<td><a href=\"#bpf_flow_dissector\"><code>BPF_PROG_TYPE_FLOW_DISSECTOR<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/7b146cebe30cb\" rel=\"nofollow\"><code>7b14<\/code><\/a><\/td>\n<td>Andrey Ignatov<\/td>\n<td>2019-02-27<\/td>\n<td><a href=\"#bpf_cgroups\"><code>BPF_PROG_TYPE_CGROUP_SYSCTL<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/9df1c28bb7521\" rel=\"nofollow\"><code>9df1<\/code><\/a><\/td>\n<td>Matt Mullins<\/td>\n<td>2019-04-26<\/td>\n<td><a href=\"#bpf_progs_tracing\"><code>BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/0d01da6afc540\" rel=\"nofollow\"><code>0d01<\/code><\/a><\/td>\n<td>Stanislav\\ Fomichev<\/td>\n<td>2019-06-27<\/td>\n<td><a href=\"#bpf_cgroups\"><code>BPF_PROG_TYPE_CGROUP_SOCKOPT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/f1b9509c2fb0e\" rel=\"nofollow\"><code>f1b9<\/code><\/a><\/td>\n<td>Alexei Starovoitov<\/td>\n<td>2019-10-30<\/td>\n<td><a href=\"#bpf_progs_tracing\"><code>BPF_PROG_TYPE_TRACING<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/27ae7997a6617\" rel=\"nofollow\"><code>27ae<\/code><\/a><\/td>\n<td>Martin KaFai Lau<\/td>\n<td>2020-01-08<\/td>\n<td><a href=\"#bpf_struct_ops\"><code>BPF_PROG_TYPE_STRUCT_OPS<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/be8704ff07d23\" rel=\"nofollow\"><code>be87<\/code><\/a><\/td>\n<td>Alexei Starovoitov<\/td>\n<td>2020-01-20<\/td>\n<td><a href=\"#bpf_prog_type_ext\"><code>BPF_PROG_TYPE_EXT<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/fc611f47f2188\" rel=\"nofollow\"><code>fc61<\/code><\/a><\/td>\n<td>KP Singh<\/td>\n<td>2020-03-29<\/td>\n<td><a href=\"#bpf_security\"><code>BPF_PROG_TYPE_LSM<\/code><\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/e9ddbb7707ff5\" rel=\"nofollow\"><code>e9dd<\/code><\/a><\/td>\n<td>Jakub Sitnicki<\/td>\n<td>2020-07-17<\/td>\n<td><a href=\"#bpf_sk\"><code>BPF_PROG_TYPE_SK_LOOKUP<\/code><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<h1 id=\"bpf_struct_ops\">\u041c\u0438\u043a\u0440\u043e\u044f\u0434\u0440\u043e Linux<\/h1>\n<p>  <\/p>\n<p>\u0412 1992 \u0433\u043e\u0434\u0443 \u0441\u043b\u0443\u0447\u0438\u043b\u0441\u044f <a href=\"https:\/\/groups.google.com\/g\/comp.os.minix\/c\/wlhw16QWltI\" rel=\"nofollow\">\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u00ab\u0441\u043f\u043e\u0440\u00bb<\/a> \u043c\u0435\u0436\u0434\u0443 \u042d\u043d\u0434\u0440\u044e \u0422\u0430\u043d\u043d\u0435\u043d\u0431\u0430\u0443\u043c\u043e\u043c (\u043f\u043e-\u0440\u0443\u0441\u0441\u043a\u0438 \u0435\u0433\u043e \u0431\u044b \u0437\u0432\u0430\u043b\u0438 \u0410\u043d\u0434\u0440\u0435\u0439 \u0415\u043b\u043e\u0447\u043a\u0430) \u0438 \u041b\u0438\u043d\u0443\u0441\u043e\u043c \u0411\u0435\u043d\u0435\u0434\u0438\u043a\u0442\u043e\u043c \u0422\u043e\u0440\u0432\u0430\u043b\u044c\u0434\u0441\u043e\u043c (\u043a\u0430\u043a \u043e\u043d \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0441\u044f). \u0422\u0430\u043d\u043d\u0435\u043d\u0431\u0430\u0443\u043c \u0437\u043d\u0430\u0442\u043d\u043e \u043d\u0430\u0431\u0440\u043e\u0441\u0438\u043b, \u043d\u0430\u0447\u0430\u0432 \u0442\u0440\u0435\u0434 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abLINUX is obsolete\u00bb \u043f\u0440\u043e \u0442\u043e, \u0447\u0442\u043e Linux \u0443\u0441\u0442\u0430\u0440\u0435\u043b (\u0432 1992 \u0433\u043e\u0434\u0443) \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u043c\u0438\u043a\u0440\u043e\u044f\u0434\u0440\u043e. \u042f \u0432\u0437\u044f\u043b \u0441\u043b\u043e\u0432\u043e \u00ab\u0441\u043f\u043e\u0440\u00bb \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e, \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u041b\u0438\u043d\u0443\u0441 \u0441\u0440\u0430\u0437\u0443 <a href=\"https:\/\/groups.google.com\/g\/comp.os.minix\/c\/wlhw16QWltI\/m\/P8isWhZ8PJ8J\" rel=\"nofollow\">\u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f<\/a> \u0441 \u0422\u0430\u043d\u043d\u0435\u043d\u0431\u0430\u0443\u043c\u043e\u043c:<\/p>\n<p>  <\/p>\n<p><em>\u00ab\u0414\u0430, linux \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u0435\u043d, \u0438 \u044f \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d, \u0447\u0442\u043e \u043c\u0438\u043a\u0440\u043e\u044f\u0434\u0440\u0430 \u043c\u0438\u043b\u0435\u0435. \u0411\u044b\u043b \u0431\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043c\u0435\u043d\u0435\u0435 \u0441\u043f\u043e\u0440\u043d\u044b\u043c, \u044f \u0431\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u043b\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u043c\u0438. \u0421 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0438 \u044d\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439) \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f linux \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u044f\u0434\u0440\u043e GNU \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e, \u0442\u043e \u044f \u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0440\u0443\u0434\u0438\u043b\u0441\u044f \u0434\u0430\u0436\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442: \u043d\u043e \u0444\u0430\u043a\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u043a \u043e\u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0433\u043e\u0442\u043e\u0432\u043e \u0442\u043e\u0433\u0434\u0430, \u0442\u0430\u043a \u0438 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440. Linux \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0435\u0440\u0435\u0434\u0438\u0432 \u044f\u0434\u0440\u043e GNU \u043f\u043e \u043e\u0447\u043a\u0430\u043c \u0432 \u0438\u0433\u0440\u0435 &quot;\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441&quot;\u00bb<\/em><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c \u0438 \u0435\u0449\u0435 \u0434\u0435\u0441\u044f\u0442\u044c \u043b\u0435\u0442 \u0441\u043f\u0443\u0441\u0442\u044f \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0442\u0435\u043e\u0440\u0438\u044f \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443 \u2014\u00a0BPF \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0440\u0430\u0449\u0438\u0432\u0430\u0435\u0442 \u0432 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u043c \u044f\u0434\u0440\u0435 Linux \u0440\u043e\u0441\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u044f\u0434\u0435\u0440. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 2020 \u0433\u043e\u0434\u0430 Martin KaFai Lau \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u044f\u0434\u0440\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0443. \u0422\u0430\u043a\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u2014\u00a0\u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432 \u044f\u0434\u0440\u0435, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u043d\u0430\u0431\u043e\u0440 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0434 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0438\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF: <code>BPF_PROG_TYPE_STRUCT_OPS<\/code>. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <a href=\"https:\/\/lwn.net\/Articles\/811631\/\" rel=\"nofollow\">\u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u0439<\/a>, Daniel Borkman \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u043b \u0435\u0433\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 BPF \u2014\u00a0\u043c\u043e\u0434\u0443\u043b\u0438, \u043d\u043e \u043d\u0435 \u0441\u0440\u043e\u0441\u043b\u043e\u0441\u044c.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043a\u043e\u0434 BPF. \u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u044f\u0434\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0430 BPF \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>tcp_congestion_ops<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f TCP congestion control. \u0411\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438 \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u2014 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00a0<a href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux.git\/commit\/?id=09903869f69f\" rel=\"nofollow\">DCTCP<\/a> \u0438 <a href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux.git\/commit\/?id=6de4a9c430b5\" rel=\"nofollow\">CUBIC<\/a> \u043d\u0430 BPF.<\/p>\n<p>  <\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u043e, \u043a \u0447\u0435\u043c\u0443 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f BPF, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, BPF \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 <a href=\"https:\/\/cve.mitre.org\/cgi-bin\/cvename.cgi?name=CVE-2013-4348\" rel=\"nofollow\">\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432<\/a> \u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0430\u043c\u044f\u0442\u0438) \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u044f\u0434\u0440\u0430. \u041a\u0440\u043e\u043c\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u0438 \u043c\u044b \u0435\u0449\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0438\u0436\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u0435\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0430\u043d\u0438\u043b\u044c\u043d\u044b\u0445 \u0438 \u043e\u0442\u0440\u0435\u0437\u0430\u0442\u044c \u043d\u0435\u043d\u0443\u0436\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0421\u043c. \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/www.youtube.com\/watch?v=jw8tEPP6jwQ&amp;t=630s\" rel=\"nofollow\">\u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0439 \u0434\u043e\u043a\u043b\u0430\u0434<\/a> \u0410\u043b\u0435\u043a\u0441\u0435\u044f \u0421\u0442\u0430\u0440\u043e\u0432\u043e\u0439\u0442\u043e\u0432\u0430 \u043d\u0430 BPF Summit.<\/p>\n<p>  <\/p>\n<h1 id=\"bpf_progs_tracing\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0434\u043b\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0441\u0431\u043e\u0440\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/h1>\n<p>  <\/p>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e BPF \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u043e\u0432\u0430\u0440\u0438\u0449 <a href=\"http:\/\/www.brendangregg.com\" rel=\"nofollow\">Brendan Gregg<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0411\u0413, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u043d\u0435\u043c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0434\u043b\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Linux \u0438 \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441 \u0441\u043e\u0442\u043d\u044e <a href=\"https:\/\/github.com\/iovisor\/bpftrace\" rel=\"nofollow\">\u0443\u0442\u0438\u043b\u0438\u0442 bcc<\/a>, \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/iovisor\/bpftrace\" rel=\"nofollow\">bpftrace<\/a>, \u043a\u043d\u0438\u0436\u043a\u0430 <a href=\"http:\/\/www.brendangregg.com\/bpf-performance-tools-book.html\" rel=\"nofollow\">\u00abBPF Performance Tools\u00bb<\/a>, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u043e\u0432, \u0431\u0438\u0437\u043d\u0435\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 BPF, \u0438 \u0442.\u043f. \u0412 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 Facebook \u0438 Netflix, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0411\u0413, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0431\u043e\u0435\u0432\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, 24&#215;7. BPF \u044d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0434 BPF \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u0448\u0435\u0432\u044b\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0411\u0413 \u0442\u0430\u043a \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043e\u043e\u0434\u0443\u0448\u0435\u0432\u0438\u043b\u0441\u044f? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c. BPF \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u044b\u0437\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 (\u043f\u043e\u0447\u0442\u0438) \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044f\u0434\u0440\u0430 Linux<\/li>\n<li>\u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u044f\u0434\u0440\u0435 \u0438\u043b\u0438 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0435<\/li>\n<li>\u043d\u0430 \u043b\u044e\u0431\u043e\u0439 <a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/trace\/tracepoints.txt\" rel=\"nofollow\">tracepoint<\/a> \u0432 \u044f\u0434\u0440\u0435<\/li>\n<li>\u043b\u044e\u0431\u043e\u043c\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044e <a href=\"http:\/\/www.brendangregg.com\/perf.html#Events\" rel=\"nofollow\">perf<\/a>, software \u0438 hardware<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 maps, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0418, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e BPF, \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043d\u0430 \u043b\u0435\u0442\u0443, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e, \u0438 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0442\u0447\u0438\u0442\u044c \u044f\u0434\u0440\u043e \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 (\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 <code>bpftrace<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#! \/usr\/bin\/env bpftrace  #include &lt;linux\/skbuff.h&gt; #include &lt;linux\/ip.h&gt;  k:icmp_echo { \u00a0 \u00a0 $skb = (struct sk_buff *) arg0; \u00a0 \u00a0 $iphdr = (struct iphdr *) ($skb-&gt;head + $skb-&gt;network_header); \u00a0 \u00a0 @pingstats[ntop($iphdr-&gt;saddr), ntop($iphdr-&gt;daddr)]++; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043e \u0442\u043e\u043c, \u043a\u0442\u043e \u043f\u0438\u043d\u0433\u0443\u0435\u0442 \u043d\u0430\u0448 \u0445\u043e\u0441\u0442. \u041c\u044b \u043f\u043e\u0434\u0446\u0435\u043f\u043b\u044f\u0435\u043c\u0441\u044f \u043a kprobe \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.9\/net\/ipv4\/icmp.c#L962-L980\" rel=\"nofollow\"><code>icmp_echo<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434 ICMPv4 \u043f\u0430\u043a\u0435\u0442\u0430 \u0442\u0438\u043f\u0430 echo request. \u0415\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, <code>arg0<\/code> \u0432 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u2014 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>sk_buff<\/code>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442. \u0418\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u044b \u0434\u043e\u0441\u0442\u0430\u0435\u043c IP \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 <code>@pingstats<\/code>. \u0412\u0441\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043e \u0442\u043e\u043c, \u043a\u0442\u043e \u0438 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u043d\u0433\u043e\u0432\u0430\u043b \u043d\u0430\u0448\u0438 IP \u0430\u0434\u0440\u0435\u0441\u0430! \u0420\u0430\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a kprobe, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 user space, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0434\u043b\u044f tracing:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>BPF_PROG_TYPE_KPROBE<\/code>: \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF \u043a kprobe, kretprobe, uprobe \u0438\u043b\u0438 uretprobe. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u0438\u043b\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0443 \u0438\u0437 \u043b\u044e\u0431\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0434\u0440\u0430, \u043b\u044e\u0431\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f\u0434\u0440\u0430 (\u0442.\u0435. \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043b\u044e\u0431\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u043b\u044e\u0431\u043e\u0439 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/li>\n<li><code>BPF_PROG_TYPE_PERF_EVENT<\/code>: \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044e perf.<\/li>\n<li><code>BPF_PROG_TYPE_TRACEPOINT<\/code>: \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF \u043a \u043b\u044e\u0431\u043e\u043c\u0443 tracepoint. \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 kprobes? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e tracepoints \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 API \u044f\u0434\u0440\u0430 (\u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\/\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f tracepoint \u043d\u0430 \u0430\u0432\u0442\u043e\u0440\u0430 \u043f\u0430\u0442\u0447\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435) \u0438 \u0437\u043d\u0430\u0447\u0438\u0442 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 tracepoints \u043c\u043e\u0433\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u0438 (\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c).<\/li>\n<li><code>BPF_PROG_TYPE_RAW_TRACEPOINT<\/code>: \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 tracepoints \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u043d\u0430 \u044d\u0442\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 raw tracepoints \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0431\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u00ab\u0443\u0434\u043e\u0431\u043d\u044b\u0445\u00bb \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e<\/li>\n<li><code>BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE<\/code>: tracepoints \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c (\u0441\u043c. <a href=\"https:\/\/lwn.net\/Articles\/786331\/\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>)<\/li>\n<li><code>BPF_PROG_TYPE_TRACING<\/code>: \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445: \u043a tracepoints, \u0432\u0445\u043e\u0434\u0430\u043c \u0438 \u0432\u044b\u0445\u043e\u0434\u0430\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a: <code>sudo cat \/sys\/kernel\/debug\/error_injection\/list<\/code>), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <a href=\"https:\/\/lore.kernel.org\/bpf\/20200509175859.2474608-1-yhs@fb.com\/\" rel=\"nofollow\">\u00ab\u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432\u00bb<\/a>. \u041e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 BTF \u043f\u0440\u0438 \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014\u00a0\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043a\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u2014\u00a0\u044d\u0442\u043e \u043d\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u0439 \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Linux \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 BPF, \u0438 \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.<\/p>\n<p>  <\/p>\n<h1 id=\"bpf_security\">Linux Security Modules<\/h1>\n<p>  <\/p>\n<p>\u0412 \u044f\u0434\u0440\u0435 Linux \u043f\u043e\u0432\u0441\u044e\u0434\u0443 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u043d\u044b \u0445\u0443\u043a\u0438 (security hooks), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438\u043d\u043e\u0434\u043e\u0432, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u0442.\u043f. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 Linux (Linux Security Modules \u0438\u043b\u0438 LSM) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 SELinux, AppArmor, \u0438 \u0442.\u0434., \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u0438 \u0445\u0443\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0432 \u0433\u0443\u0433\u043b\u0435 \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0430\u0442\u0430\u043a\u0438. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 API \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 <a href=\"https:\/\/www.youtube.com\/watch?v=2CZSSRfgAgQ\" rel=\"nofollow\">Kernel Runtime Security Instrumentation<\/a> \u0441 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 <a href=\"https:\/\/events19.linuxfoundation.org\/events\/linux-security-summit-north-america-2019\/\" rel=\"nofollow\">LSS-NA 2019<\/a>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, <code>BPF_PROG_TYPE_LSM<\/code>, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a \u043b\u044e\u0431\u043e\u043c\u0443 LSM \u0445\u0443\u043a\u0443. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430 \u0438 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438\u0447\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0432 \u043c\u0438\u0440\u0435 BPF, \u044d\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0438 \u0434\u0435\u0448\u0435\u0432\u043e \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0442.\u043f.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0444\u0438\u0447, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0441\u043e\u0431\u044b\u0439 \u043f\u043e\u0434\u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0441\u044b\u043f\u0430\u0442\u044c. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF. \u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b LSM \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c user mode helper, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f libbpf, \u0430 \u0442\u044f\u043d\u0443\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c libbpf \u0432 \u044f\u0434\u0440\u043e \u043c\u0430\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u043d\u0435 \u0445\u043e\u0442\u044f\u0442.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0430\u0442\u043a\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f KRSI \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u043c <a href=\"https:\/\/www.youtube.com\/watch?v=1GSgyvn4N7E&amp;t=5017s\" rel=\"nofollow\">\u0434\u043e\u043a\u043b\u0430\u0434\u0435<\/a> KP Singh, \u0430\u0432\u0442\u043e\u0440\u0430 KRSI, \u043d\u0430 BPF Summit.<\/p>\n<p>  <\/p>\n<h1 id=\"bpf_prog_type_ext\">\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF<\/h1>\n<p>  <\/p>\n<h2>Tail calls<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043d\u0435\u0437\u0430\u043f\u0430\u043c\u044f\u0442\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u0442\u043e\u043c\u0443 \u043d\u0430\u0437\u0430\u0434, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0431\u044b\u043b\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 BPF \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u0442\u044c \u0434\u043e 4096 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u2014\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0430\u0441\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 tail calls.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443 tail calls \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <code>\u042d<\/code> \u0445\u043e\u0447\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u2014\u00a0<code>\u042e<\/code> \u0438\u043b\u0438 <code>\u042b<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u043f \u0442\u0438\u043f\u0430 <code>BPF_MAP_TYPE_PROG_ARRAY<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF (\u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u044b \u043f\u0438\u0445\u0430\u0435\u043c \u0432 \u044d\u0442\u043e\u0442 \u043c\u0430\u043f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b):<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/px\/pe\/ab\/pxpeabh0-l-8syzcrjkrqzrnpno.png\" title=\"Tail Calls \u2014\u00a0\u0425\u0432\u043e\u0441\u0442\u043e\u0432\u044b\u0435 \u0412\u044b\u0437\u043e\u0432\u044b, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <code>\u042d<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a <code>bpf_tail_call<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 <code>\u042b<\/code>, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <code>\u042d<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043a\u0430\u0437\u0430\u0442\u044c <code>bpf_tail_call(&amp;map, ctx, 1)<\/code>, \u0433\u0434\u0435 <code>ctx<\/code> \u2014\u00a0\u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u044b\u0436\u043a\u0430, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u0430\u043a long jump, \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u0441\u0442\u0435\u043a\u043e\u043c. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u044b\u0436\u043a\u043e\u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e 32, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f \u0432 \u0446\u0438\u043a\u043b\u0435.<\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044f\u0434\u0440\u0430 5.1 \u043b\u0438\u043c\u0438\u0442 \u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0431\u044b\u043b \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0438, \u0435\u0441\u043b\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u042d\u0442\u043e \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c tail calls, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u0443 \u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043e\u0434\u043d\u0430\u043a\u043e, tail calls \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0431\u043e\u043b\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 <code>bpf_tail_call<\/code>, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014\u00a0\u043d\u0438\u0447\u0435\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">XDP Features<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0423\u0431\u0440\u0430\u043d\u043e \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e XDP \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043d\u0438\u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0434\u0435 tail calls \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044e\u0442 \u0436\u0438\u0437\u043d\u044c \u2014\u00a0\u044d\u0442\u043e XDP features. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 XDP, \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u00ab\u0444\u0438\u0447\u00bb XDP \u043e\u043d\u0430 \u0445\u043e\u0447\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0421\u0435\u0442\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0435\u0435 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c, \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u00ab\u0444\u0438\u0447\u00bb \u043e\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442. \u0412 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0444\u0438\u0447 \u043d\u0430\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0438\u043b\u0438 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 tail calls, \u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0438\u0447 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e. \u042d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u043a\u0443 \u0432 \u044f\u0434\u0440\u0435 \u043f\u043e\u043a\u0430 \u0442\u0430\u043a \u0438 \u043d\u0435 \u0440\u0435\u0448\u0438\u043b\u0438, \u043d\u043e, \u0441\u043a\u043e\u0440\u0435\u0435, \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u0438\u0437 \u0440\u0430\u0437\u0440\u044f\u0434\u0430 \u00ab\u043d\u0435\u0443\u043b\u043e\u0432\u0438\u043c\u044b\u0445 \u0414\u0436\u043e\u00bb \u2014 \u0414\u0436\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u0442\u0430\u043a\u043e\u0439 \u0445\u0438\u0442\u0440\u044b\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0435\u0433\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0438\u0449\u0435\u0442.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<h2>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0430 \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e tail calls \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, <code>BPF_PROG_TYPE_EXT<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c BPF trampoline \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0442\u0438\u043f\u0430 TRACING \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u043b\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0435\u043d\u0430 \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u2014\u00a0\u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0440\u044d\u0439\u0441\u0438\u0442\u0441\u044f, \u0442\u043e \u0435\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 xdp-dispatcher \u2014 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0446\u0435\u043f\u043b\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c <a href=\"#bpf_prog_type_xdp\">XDP<\/a> \u043d\u0430 \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u00ab\u0433\u043b\u0430\u0432\u043d\u0430\u044f\u00bb \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438-\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430\u043c\u0438, \u0430 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0446\u0435\u043f\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e XDP \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0421\u043c. \u0434\u043e\u043a\u043b\u0430\u0434 <a href=\"https:\/\/linuxplumbersconf.org\/event\/7\/contributions\/671\/\" rel=\"nofollow\">Multiple XDP programs on a single interface\u2014status and next steps<\/a> \u043e\u0442 Toke H\u00f8iland-J\u00f8rgensen \u043d\u0430 Linux Plumbers 2020.<\/p>\n<p>  <\/p>\n<h1 id=\"bpf_lirc\">LIRC: Linux Infrared Remote Control<\/h1>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_LIRC_MODE2<\/code> \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430. \u041d\u0430 lwn \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 <a href=\"https:\/\/lwn.net\/Articles\/759188\/\" rel=\"nofollow\">\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b<\/a> \u043e\u0442 Sean Young, \u0430\u0432\u0442\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412\u043a\u0440\u0430\u0442\u0446\u0435, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 BPF \u0441\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u043f\u0443\u043b\u044c\u0441 \u0438\/\u0438\u043b\u0438 \u043f\u043e\u043c\u0435\u0440\u0438\u043b \u0432\u0440\u0435\u043c\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043f\u0443\u043b\u044c\u0441\u0430\u043c\u0438. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 BPF \u0447\u0438\u0442\u0430\u0435\u0442 \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 <a href=\"https:\/\/habr.com\/ru\/post\/514736\/#introduction-to-bpf\">map<\/a>. \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438, \u0442\u043e \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>bpf_rc_keydown<\/code> \u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/a2\/su\/io\/a2suiow2l8qdqbjlksuc8altlks.png\" title=\"IR - BPF - input\"><\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441, \u0430 \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 lirc? \u041d\u043e Sean Young <a href=\"https:\/\/lwn.net\/Articles\/760035\/\" rel=\"nofollow\">\u0433\u043e\u0432\u043e\u0440\u0438\u0442<\/a>, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 BPF \u044d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435, \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c API: \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 IR \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437 userspace \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u044f\u0434\u0440\u043e \u0440\u0430\u0441\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0441\u0438\u0433\u043d\u0430\u043b (\u0438 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430).<\/p>\n<p>  <\/p>\n<h1 id=\"bpf_prog_networking\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h1>\n<p>  <\/p>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 BPF \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430\u043c\u0438 \u0438\u0437 Berkeley Labs, \u043d\u043e\u0432\u044b\u0439 BPF \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0430\u043c\u0438 Linux, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0442\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u0441 \u0434\u0432\u0443\u0445 \u0441\u0430\u043c\u044b\u0445 \u00ab\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0445\u00bb \u0442\u0438\u043f\u043e\u0432 \u2014\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c XDP \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c Linux \u2014\u00a0\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u043e-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443\/\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Linux.<\/p>\n<p>  <\/p>\n<h2 id=\"linux_networking_stack\">\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a Linux: \u043f\u0440\u0438\u0431\u044b\u0442\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430<\/h2>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0438, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u043e XDP, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a Linux. \u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u043b\u043e\u0436\u0438\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <s>\u043f\u0443\u0445\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0442\u043e\u043c\u043e\u0432<\/s> \u0430\u0431\u0437\u0430\u0446\u0435\u0432. (\u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u0439 XDP, \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0438 \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043d\u044b\u0445 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.)<\/p>\n<p>  <\/p>\n<p>\u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u0440\u0438\u0435\u0437\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0443 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Linux \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u041f\u0430\u043a\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0435\u0433\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 DMA \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e CPU. \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u043b\u043e\u0436\u0438\u0442\u044c CPU, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u0438\u0431\u044b\u043b \u0438 \u0433\u043e\u0442\u043e\u0432 \u043a \u0447\u0442\u0435\u043d\u0438\u044e \u0438\u0437 RAM.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hw\/jj\/wn\/hwjjwnytq7j2nfoigw4ez86ped8.png\" title=\"Packet Arival\"><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0432 Linux \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430 \u2014\u00a0top half \u0438 bottom half. \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u2014 \u044d\u0442\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f (top half), \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 (bottom half), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 softirq \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u044f\u0434\u0440\u0430. \u0418\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0432\u0441\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 bottom halves, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u0430\u043c, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 softirq \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>NET_RX<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412 softirq \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0430\u043c\u044f\u0442\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/include\/linux\/skbuff.h#L711-L921\" rel=\"nofollow\"><code>struct sk_buff<\/code><\/a>. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>sk_buff<\/code>, \u0430\u043a\u0440\u043e\u043d\u0438\u043c \u043e\u0442 socket buffer, \u2014\u00a0\u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0441\u0442\u0435\u043a\u0435 Linux. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443 \u0432 Linux \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>sk_buff<\/code>. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0435\u0439, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430, \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0442.\u0434., \u0438 \u0442.\u043f. \u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f <code>sk_buff<\/code> \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0441\u0442\u0435\u043a\u0443.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/et\/am\/9g\/etam9golpvqnjh1ig9sbf7gexrw.png\" title=\"sk_buff\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>head<\/code> \u0438 <code>end<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, <code>data<\/code> \u0438 <code>tail<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0434\u0430\u043d\u043d\u044b\u0445, <code>net_header<\/code> \u0438 <code>transport_hdr<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u0442.\u043f. \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <code>data<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u0440\u0430\u0432\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u2014\u00a0\u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0441\u0442\u0435\u043a\u0430 \u0441\u043b\u043e\u0432\u043e \u00ab\u0434\u0430\u043d\u043d\u044b\u0435\u00bb \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>netif_receive_skb<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0432\u043e\u0438\u043c \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043d\u044b\u043c \u0434\u0435\u043b\u0430\u043c. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0432 \u0441\u0442\u0435\u043a\u0435 \u0434\u0430\u043b\u044c\u0448\u0435? \u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0442 \u044d\u0442\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0438\u0437 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Netfilter\" rel=\"nofollow\">Netfilter wiki<\/a>:<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/37\/Netfilter-packet-flow.svg\" rel=\"nofollow\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/b6\/ho\/e5\/b6hoe5lupy-posett2vp8mwproa.png\" title=\"Linux Networking Stack\"><\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>sk_buff<\/code> \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u0432 \u0441\u0442\u0435\u043a, \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430 (ingress qdisc \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435), \u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0441\u0442\u0435\u043a\u0430, \u0434\u0435\u043b\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0443 \u0445\u0443\u043a\u043e\u0432 netfiler. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u043f\u0430\u043a\u0435\u0442 (<code>sk_buff<\/code>) \u0431\u0443\u0434\u0435\u0442 \u043b\u0438\u0431\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u043b\u0438\u0431\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043b\u0438 \u0432 \u043d\u0435\u0431\u044b\u0442\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u0430\u0434 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435 (\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u043b\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0430 \u043d\u0435\u0435). \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0443\u0437\u043b\u0435 \u043f\u043e\u0441\u043b\u0435 start, \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 softirq, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0441\u043b\u043e\u0432\u0430 eBPF \u0438 XDP \u0438 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438, \u0432\u0435\u0434\u0443\u0449\u0438\u0435 \u0432 \u043e\u0431\u0445\u043e\u0434 \u0441\u0442\u0435\u043a\u0430&#8230;<\/p>\n<p>  <\/p>\n<h2 id=\"bpf_prog_type_xdp\">\u0421\u0435\u0442\u0438 \u043d\u0430 \u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u0445 \u2014\u00a0Express Data Path<\/h2>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>sk_buff<\/code> \u2014 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0441\u0443\u0434\u044c\u0431\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438\u043b\u0438 \u043c\u0435\u0442\u043a\u0438 VLAN \u0438 \u0442.\u043f. \u0421 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u0442\u0438\u043f\u0430 XDP (Express Data Path) \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0440\u0435\u0448\u0430\u0442\u044c \u0441\u0443\u0434\u044c\u0431\u0443 \u043f\u0430\u043a\u0435\u0442\u0430 \u0431\u0435\u0437 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>sk_buff<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b XDP \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u0438, \u043a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432\u044b\u0448\u0435, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0430\u043a\u0435\u0442 \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 RAM \u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043e \u043d\u0435\u043c \u0443\u0437\u043d\u0430\u043b. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/include\/uapi\/linux\/bpf.h#L3754-L3763\" rel=\"nofollow\"><code>struct xdp_md<\/code><\/a>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043f\u0430\u043a\u0435\u0442\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430. \u041e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u2014 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u2014\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 XDP \u043c\u043e\u0436\u0435\u0442 \u0434\u0440\u043e\u043f\u043d\u0443\u0442\u044c \u043f\u0430\u043a\u0435\u0442 (<code>XDP_DROP<\/code>), \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0437\u0430\u0434 \u043d\u0430 \u0442\u043e \u0436\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u0438\u0448\u0435\u043b (<code>XDP_TX<\/code>), \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (<code>XDP_REDIRECT<\/code>), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0432\u0435\u0440\u0445 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 (<code>XDP_PASS<\/code>):<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/z0\/be\/pc\/z0bepcyuv2gvnzadqaxl0267q7q.png\" title=\"Express Data Path \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u0437\u0435\u043b\u0435\u043d\u0435\u043d\u044c\u043a\u0438\u043c\"><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\/\u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u0430\u043a\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u0435\u043b, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c MAC \u0430\u0434\u0440\u0435\u0441\u0430, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c XDP \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\/\u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0442\u0440\u0435\u0439\u043b\u0435\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 XDP \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 <code>AF_XDP<\/code>, \u043f\u0440\u0438\u0447\u0435\u043c, \u0435\u0441\u043b\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c zero copy. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, <a href=\"http:\/\/vger.kernel.org\/lpc_net2018_talks\/lpc18_paper_af_xdp_perf-v2.pdf\" rel=\"nofollow\">\u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0443\u044e<\/a> \u0441 DPDK, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0443\u044e\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044f\u0434\u0440\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wf\/-r\/sq\/wf-rsqlqjt2tj-a-ujyvx7cglt8.png\" title=\"AF_XDP \u2014 \u0432\u0430\u043d\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 DPDK\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043a\u0435\u0442\u0430 \u0442\u0438\u043f\u0430 <code>AF_XDP<\/code>: \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u043e\u043a\u0435\u0442\u0443 <code>AF_XDP<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (rx queue), \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0437\u0435\u043b\u0435\u043d\u0435\u043d\u044c\u043a\u0438\u043c. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 XDP, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u043e\u043a\u0435\u0442. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u0430\u043a \u0438\u0437 \u0437\u0435\u043b\u0435\u043d\u0435\u043d\u044c\u043a\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0442\u0430\u043a \u0438 \u0438\u0437 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0441\u0442\u0435\u043a. (\u0412\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c UDP \u043f\u0430\u043a\u0435\u0442\u044b \u0441 \u043f\u043e\u0440\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 65784 \u0432 \u0441\u043e\u043a\u0435\u0442 \u0442\u0438\u043f\u0430 <code>AF_XDP<\/code>, \u043f\u043e\u0441\u0430\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c 13, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443 \u0442\u0430\u043a: <code>ethtool -N flow-type udp4 dst-port 65784 action 13<\/code>.)<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b XDP \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435, \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0440\u043e\u043f\u0430\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0448\u0438\u043d\u044b \u043f\u0440\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 CPU \u0432 0%. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0442\u0430\u043a \u043c\u043e\u0433\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043e\u0442 Netronome, \u043d\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=wHM7RVk3-yk\" rel=\"nofollow\">\u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c<\/a>, \u0447\u0442\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0438 \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u00ab\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445\u00bb \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f XDP, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u043e: \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 DDoS \u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 Facebook, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 load balancer <a href=\"https:\/\/engineering.fb.com\/open-source\/open-sourcing-katran-a-scalable-network-load-balancer\/\" rel=\"nofollow\">katran<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 XDP, Cloudfare <a href=\"https:\/\/blog.cloudflare.com\/cloudflare-architecture-and-how-bpf-eats-the-world\/\" rel=\"nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442<\/a> XDP \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0443 \u0434\u043b\u044f \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 DDoS \u0438 \u0434\u043b\u044f <a href=\"https:\/\/blog.cloudflare.com\/unimog-cloudflares-edge-load-balancer\/\" rel=\"nofollow\">load balancing<\/a>, cilium \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 XDP \u0434\u043b\u044f \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0438 \u0442.\u043f. \u0422\u0430\u043a\u0436\u0435 \u0438\u0434\u0443\u0442 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u044b \u0438 R&amp;D \u043d\u0430 \u0442\u0435\u043c\u0443 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c XDP \u0438 P4 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0430\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f (\u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043c\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e NPU \u2014\u00a0Networking Processing Unit).<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e XDP \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c <em>\u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e,<\/em> \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043c\u043a\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u044d\u0442\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043c\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u0422\u0435\u043c, \u043a\u043e\u043c\u0443 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 XDP, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"https:\/\/github.com\/xdp-project\/xdp-tutorial\" rel=\"nofollow\">XDP Tutorial<\/a>, \u0430 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0432 \u0448\u043a\u043e\u043b\u0435 \u0443\u0447\u0438\u043b \u043d\u0435\u043c\u0435\u0446\u043a\u0438\u0439, \u2014 \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/473286\/\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/users\/kozlyuk\">kozlyuk<\/a> \u043d\u0430 \u0445\u0430\u0431\u0440\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"struct__sk_buff\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 struct __sk_buff<\/h2>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0435\u0442\u0430\u043b\u044c. \u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 Linux \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>sk_buff<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0438 \u0432\u044b\u0448\u0435. \u041e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043b\u044f \u0442\u0438\u043f\u0430 <code>len<\/code> \u2014 \u0434\u043b\u0438\u043d\u0430 \u043f\u0430\u043a\u0435\u0442\u0430, <code>network_header<\/code> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0443\u0440\u043e\u0432\u043d\u044f L3, <code>dev<\/code> \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0442\u0438\u043f\u0430 <code>struct net_device<\/code> \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0432\u043e\u0434\u0430 \u0438\u043b\u0438 \u0432\u044b\u0432\u043e\u0434\u0430, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438, \u0430 \u043f\u0430\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e <code>sk_buff<\/code> (\u043a\u0440\u043e\u043c\u0435 XDP, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <code>sk_buff<\/code> \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d), \u0431\u044b\u043b\u043e \u0431\u044b \u0440\u0430\u0437\u0443\u043c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>sk_buff<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432\u0441\u0435 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u2014\u00a0\u043f\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c BPF \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <em>\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e<\/em> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/include\/uapi\/linux\/bpf.h#L3563-L3600\" rel=\"nofollow\"><code>struct __sk_buff<\/code><\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">struct __sk_buff {     __u32 len;     __u32 pkt_type;     __u32 mark;     __u32 queue_mapping;     __u32 protocol;     __u32 vlan_present;     ... };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>__sk_buff<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u044f\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>sk_buff<\/code>, \u043d\u043e \u0438\u0445 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445 Verifier \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0445 \u043e\u0442\u0437\u0435\u0440\u043a\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>__sk_buff<\/code> \u043a\u0430\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">int bpf_prog(struct __sk_buf *ctx) {     __u32 len = ctx-&gt;len;     __u32 type = ctx-&gt;pkt_type;     ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u043d\u043e \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432 \u044f\u0434\u0440\u043e Verifier \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430) \u0438 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/kernel\/bpf\/verifier.c#L9615\" rel=\"nofollow\">\u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442<\/a> \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 <code>sk_buff<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/av\/kp\/wi\/avkpwiumqyrbm0qvzn-9ecepyxi.png\" title=\"\u0432\u0436\u0443\u0445, \u0438 \u0442\u044b \u0447\u0438\u0442\u0430\u0435\u0448\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 sk_buff\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e Verifier \u043f\u0440\u0438\u0432\u0435\u043b \u0442\u0438\u043f\u044b. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0434\u043b\u044f <code>pkt_type<\/code>, <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/include\/linux\/skbuff.h#L807\" rel=\"nofollow\">\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0434\u043b\u0438\u043d\u044b 3<\/a>, Verifier \u043f\u043e\u0434\u0447\u0438\u0441\u0442\u0438\u043b \u0432\u0441\u0435, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u0434\u0435\u043b\u0443 \u0431\u0438\u0442\u044b.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u0430\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u0438\/\u0438\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0437\u0435\u0440\u043a\u0430\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u043b\u044f. \u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u0431\u0440\u0430\u043d \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440, \u0442\u0430\u043a \u043a\u0430\u043a \u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u043f\u0440\u043e\u043c\u0435\u0442\u0447\u0438\u0432\u043e \u0430\u043d\u043e\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043b, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u043b\u0435\u043d\u044c.<\/p>\n<p>  <\/p>\n<p>\u0411\u0435\u0440\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>skbuff.c<\/code> \u0441 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 (\u043d\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044f \u043a\u0430\u043a-\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u0445 \u043d\u0435 \u043e\u0442\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#include &lt;linux\/bpf.h&gt;  __attribute__((section(&quot;socket\/test&quot;))) int bpf_prog(struct __sk_buff *ctx) {     __u32 len = ctx-&gt;len;     __u32 type = ctx-&gt;pkt_type;     return len + type; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">clang -target bpf -O2 skbuff.c -o skbuff.o -c<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c (\u0437\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u043a\u0441\u0442\u0430\u0442\u0438, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0431\u0435\u0437 \u0440\u0443\u0442\u0430):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">mkdir mnt sudo mount -t bpf none .\/mnt bpftool prog load .\/skbuff.o .\/mnt\/xxx<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ llvm-objdump -D .\/skbuff.o --section socket\/test   0:    61 12 00 00 00 00 00 00 r2 = *(u32 *)(r1 + 0)   1:    61 10 04 00 00 00 00 00 r0 = *(u32 *)(r1 + 4)   2:    0f 20 00 00 00 00 00 00 r0 += r2   3:    95 00 00 00 00 00 00 00 exit<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftool prog dump xlated pinned .\/mnt\/xxx    0: (61) r2 = *(u32 *)(r1 +104)    1: (71) r0 = *(u8 *)(r1 +120)    2: (54) w0 &amp;= 7    3: (0f) r0 += r2    4: (95) exit<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"bpf_prog_type_tc\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0432 Linux<\/h2>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a <a href=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/3\/37\/Netfilter-packet-flow.svg\" rel=\"nofollow\">\u0441\u0445\u0435\u043c\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 Linux<\/a>, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d <code>sk_buff<\/code>, \u043e\u043d \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0443\u0437\u0435\u043b ingress qdisc. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e egress qdisc \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <em>\u044d\u0442\u043e<\/em> \u0434\u043e\/\u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0445\u0443\u043a\u043e\u0432 netfilter.<\/p>\n<p>  <\/p>\n<p>Qdisc \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a <strong>q<\/strong>ueueing <strong>disc<\/strong>ipline \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0432 Linux \u2014 Traffic Control (TC). \u0414\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 egress qdisc \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u2014\u00a0\u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0434\u0440\u043e\u043f\u0430\u0435\u0442 \u043b\u0438\u0448\u043d\u0438\u0435. \u0414\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0438 \u0438\u0437-\u0437\u0430 \u0435\u0433\u043e \u043f\u0440\u0438\u0440\u043e\u0434\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a\u044c\u044e\u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u044b \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432 \u2014\u00a0classful \u0438 classless \u2014\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0438 \u043d\u0435\u0442. \u0412\u0442\u043e\u0440\u044b\u0435 \u2014 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 \u043d\u0438\u0445 \u0432\u0441\u0442\u0440\u043e\u0435\u043d. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 egress qdisc, <code>pfifo_fast<\/code>, \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u044f TOS \u043f\u0430\u043a\u0435\u0442\u043e\u0432 IPv4 \u0438 IPv6 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. <a href=\"https:\/\/lartc.org\/howto\/lartc.qdisc.classless.html\" rel=\"nofollow\">lartc 9.2<\/a>):<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ry\/67\/mk\/ry67mkxbf2zes4jxkpz7mp-ucma.png\" title=\"pfifo_fast: \u0441\u043c. https:\/\/lartc.org\/howto\/lartc.qdisc.classless.html\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 \u044d\u0442\u043e qdisc <code>noqueue<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0435 \u0437\u0430\u043d\u044f\u0442\u043e, \u0430 \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0440\u043e\u043f\u0430\u0435\u0442 \u0435\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>Classful qdiscs \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u043e\u0449\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 qdiscs. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0430\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0437\u0430\u0436\u0438\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0436\u0438\u0437\u043d\u044c\u044e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0435\u0449\u0435 \u0434\u0432\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430: \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b (classifiers) \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (actions). \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0430\u043a\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u0442 \u0438\u043b\u0438 \u043e\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441, \u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0435\u0441\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0430\u0448\u0435\u043b \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432: <a href=\"https:\/\/man7.org\/linux\/man-pages\/man8\/tc-u32.8.html\" rel=\"nofollow\"><code>u32<\/code><\/a>, <a href=\"https:\/\/man7.org\/linux\/man-pages\/man8\/tc-flower.8.html\" rel=\"nofollow\"><code>flower<\/code><\/a> \u0438 \u0442.\u043f. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: <code>drop<\/code> (\u0434\u0440\u043e\u043f\u043d\u0443\u0442\u044c \u043f\u0430\u043a\u0435\u0442), <code>reclassify<\/code> (\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u044b \u043e\u0442\u0440\u0435\u0437\u0430\u043b\u0438 VLAN tag), \u0438 \u0442.\u043f.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 qdiscs \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u044c\u044f, \u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432\u0434\u044b\u0445\u0430\u0442\u044c \u0432 \u043d\u0438\u0445 \u0436\u0438\u0437\u043d\u044c. \u041d\u043e \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 qdiscs \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0435\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043d\u0430 C \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u044f\u0434\u0440\u043e \u0431\u044b\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF,\u00a0<code>BPF_PROG_TYPE_SCHED_CLS<\/code> \u0438 <code>BPF_PROG_TYPE_SCHED_ACT<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 qdisc \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>clsact<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043d\u0430 egress, \u0442\u0430\u043a \u0438 \u043d\u0430 ingress, \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a \u043d\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SCHED_CLS<\/code> \u0441 \u0444\u043b\u0430\u0433\u043e\u043c direct action. \u042d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 BPF \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f actions, \u0442.\u0435. \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0441\u0443\u0434\u044c\u0431\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 BPF TC, \u0442\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u2014 \u044d\u0442\u043e <a href=\"https:\/\/docs.cilium.io\/en\/latest\/bpf\/\" rel=\"nofollow\">BPF Reference Guide<\/a> \u043e\u0442 Daniel Borkman \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 <a href=\"https:\/\/github.com\/cilium\/cilium\" rel=\"nofollow\"><code>cilium<\/code><\/a> \u2014\u00a0\u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e CNI \u0434\u043b\u044f kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 Alibaba \u0438 Google.<\/p>\n<p>  <\/p>\n<h2 id=\"bpf_prog_type_socket_filter\">\u041e\u0442\u043a\u0443\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0448\u0435\u043b BPF<\/h2>\n<p>  <\/p>\n<p>\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/post\/493880\/\">\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e BPF<\/a> \u0431\u044b\u043b\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 BPF \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u043b\u0430\u0441\u044c \u043a \u0441\u043e\u043a\u0435\u0442\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0430\u0441\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e. \u0422\u0430\u043a \u043a\u0430\u043a eBPF \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u043a\u0430\u043a \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f cBPF, \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c eBPF \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c cBPF. \u0410 \u0438\u043c\u0435\u043d\u043d\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SOCKET_FILTER<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u0441\u043e\u043a\u0435\u0442\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u043f\u0446\u0438\u0438 <code>SO_ATTACH_BPF<\/code>. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0435\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 <code>CAP_SYS_ADMIN<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0421 \u043d\u043e\u0432\u044b\u043c BPF \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SOCKET_FILTER<\/code> \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0441\u043e\u043a\u0435\u0442\u0430\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 BPF, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 BPF, \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u0430\u044f \u043a \u0441\u043e\u043a\u0435\u0442\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u0443\u0441\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u043d\u0430 \u0441\u043e\u043a\u0435\u0442 (\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e <code>sk_buff<\/code>) \u0438 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043e \u043d\u0443\u043b\u044f (\u0442\u0430\u043a, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d). \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043d\u0438\u0444\u0444\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 RAW \u0441\u043e\u043a\u0435\u0442 \u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u044b, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e \u0445\u0435\u0434\u0435\u0440\u043e\u0432. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SOCKET_FILTER<\/code> \u0441 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 <a href=\"https:\/\/infocondb.org\/con\/def-con\/def-con-27\/evil-ebpf-in-depth-practical-abuses-of-an-in-kernel-bytecode-runtime\" rel=\"nofollow\">Evil eBPF In-Depth<\/a> \u0441 DEFCONF 27.<\/p>\n<p>  <\/li>\n<li>\n<p>\u0423 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 <code>AF_PACKET<\/code> \u0435\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>PACKET_FANOUT<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u0442\u0438\u043f\u0430 DPI. \u041f\u0440\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/261161\/\">\u0417\u0430\u0445\u0432\u0430\u0442 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 Linux \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443<\/a>. \u0412 2015 \u043a fanout \u0431\u044b\u043b\u0430 <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/f2e520956a1ab\" rel=\"nofollow\">\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430<\/a> \u043e\u043f\u0446\u0438\u044f <code>PACKET_FANOUT_DATA<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF.<\/p>\n<p>  <\/li>\n<li>\n<p>\u0412 2007 \u0433\u043e\u0434\u0443 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/habr.com\/ru\/post\/493880\/#xt_bpf\"><code>xt_bpf<\/code><\/a> \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b netfilter. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0448\u0430\u043b\u0430 \u0441\u0443\u0434\u044c\u0431\u0443 \u043f\u0430\u043a\u0435\u0442\u0430. \u0412 2016 <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/2c16d60332643e90d4fa244f4a706c454b8c7569\" rel=\"nofollow\">\u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430<\/a> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 eBPF \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0443\u0434\u044c\u0431\u0443 \u043f\u0430\u043a\u0435\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0448\u0430\u0442\u044c \u0438 eBPF \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SOCKET_FILTER<\/code>.<\/p>\n<p>  <\/li>\n<li>\n<p>\u0424\u0438\u043b\u044c\u0442\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0441\u043e\u043a\u0435\u0442\u0430\u043c, \u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a tun \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c, \u0447\u0442\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0432 VM. \u0421\u043c. <a href=\"https:\/\/lists.openwall.net\/netdev\/2017\/12\/29\/6\" rel=\"nofollow\"><code>TUNSETFILTEREBPF<\/code><\/a>.<\/p>\n<p>  <\/li>\n<li>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445 \u0436\u0435 tun \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432 \u043a\u0430\u043a\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442. \u0421\u043c. <a href=\"https:\/\/lkml.org\/lkml\/2017\/12\/4\/125\" rel=\"nofollow\"><code>TUNSETSTEERINGEBPF<\/code><\/a>.<\/p>\n<p>  <\/li>\n<li>\n<p>Kernel Connection Multiplexor \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0443\u043b TCP \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438 \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0443\u043b \u0438\u0437 datagram \u0441\u043e\u043a\u0435\u0442\u043e\u0432 (\u0441\u043c. <a href=\"https:\/\/lwn.net\/Articles\/657970\/\" rel=\"nofollow\">lwn<\/a>, <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/Documentation\/networking\/kcm.rst\" rel=\"nofollow\">kcm<\/a>). \u041f\u043e\u0442\u043e\u043a \u0431\u0430\u0439\u0442\u043e\u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e TCP \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 BPF \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SOCKET_FILTER<\/code>, \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u043e\u0439 \u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u043a\u0435\u0442\u0443 \u0442\u0438\u043f\u0430 <code>AF_KCM<\/code> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>SIOCKCMATTACH<\/code> (\u0441\u043c. <a href=\"https:\/\/gist.github.com\/peo3\/fd0e266a3852d3422c08854aba96bff5\" rel=\"nofollow\">\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0437\u0430\u0433\u0443\u0433\u043b\u0438\u043b).<\/p>\n<p>  <\/li>\n<li>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SOCKET_FILTER<\/code> \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u043a \u0441\u043e\u043a\u0435\u0442\u0430\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>SO_ATTACH_REUSEPORT_EBPF<\/code>, \u0441\u043c. \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"https:\/\/blog.cloudflare.com\/perfect-locality-and-three-epic-systemtap-scripts\/\" rel=\"nofollow\">Perfect locality and three epic SystemTap scripts<\/a>.<\/p>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"bpf_flow_dissector\">\u00ab\u0420\u0430\u0441\u0441\u0435\u043a\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u00bb \u0438 flower<\/h2>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u044f\u0434\u0440\u0430 <code>__skb_flow_dissect<\/code>, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u0430\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432 \u044f\u0434\u0440\u0435 Linux flow dissector \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044e \u043c\u0435\u0442\u0430-\u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430. \u041e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u044f\u0434\u0440\u0430, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 ingress \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c Linux, <a href=\"https:\/\/man7.org\/linux\/man-pages\/man8\/tc-flower.8.html\" rel=\"nofollow\">flower<\/a>.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043e\u0434\u043d\u0430\u043a\u043e, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u043c\u043d\u0430\u044f, \u0438\u00a0\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439. \u0414\u043b\u044f \u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 \u0431\u044b\u043b <a href=\"https:\/\/lwn.net\/Articles\/763938\/\" rel=\"nofollow\">\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d<\/a> \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u2014\u00a0<code>BPF_PROG_TYPE_FLOW_DISSECTOR<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044f\u0434\u0440\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 namespace.<\/p>\n<p>  <\/p>\n<h2 id=\"bpf_cgroups\">BPF \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b<\/h2>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b (cgroups) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0438 \u043f\u0440\u0438\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0433\u0440\u0443\u043f\u043f\u0430\u043c \u0440\u0430\u0437\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0418 \u0432\u0441\u0435\u043c \u0434\u043e\u0447\u0438\u0442\u0430\u0432\u0448\u0438\u043c \u0434\u043e \u0441\u044e\u0434\u0430 \u0443\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u044f\u0441\u043d\u043e, \u043a\u0430\u043a BPF \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d: \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 cgroup. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 (\u0438 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439, \u0441\u043e\u043a\u0435\u0442\u043d\u043e\u0439) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0431\u0438\u0437\u043d\u0435\u0441-\u0437\u0430\u0434\u0430\u0447, \u043d\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b cgroups \u0438, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u0438\u0445 \u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0430\u043c\u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043d\u0443\u0436\u0434\u044b \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442. \u0418 \u0442\u0443\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 BPF. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e, \u0447\u0435\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_CGROUP_SKB<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b BPF \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u0442\u0440\u0430\u0444\u0438\u043a\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0435\u043c\u0443 (ingress) \u0438\u043b\u0438 \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0435\u043c\u0443 (egress) \u0438\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1, \u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 0, \u0442\u043e \u0434\u0440\u043e\u043f\u0430\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u0430 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e, \u0442\u043e \u043a \u043f\u0430\u043a\u0435\u0442\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043e\u043a, \u0438 \u0442.\u043f. \u041f\u0440\u0438\u043c\u0435\u0440: <a href=\"https:\/\/kailueke.gitlab.io\/systemd-custom-bpf-firewall\/\" rel=\"nofollow\">\u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0444\u0438\u043b\u044c\u0440\u044b BPF \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c systemd<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_CGROUP_SOCK<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>struct sock<\/code>. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u043c <code>sk_bound_dev_if<\/code> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u043e\u043a\u0435\u0442\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443. \u042d\u0442\u043e\u0442 \u0436\u0435 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 bind(2) \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c\/\u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u043b\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u043a\u0430\u0441\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_CGROUP_SOCK_ADDR<\/code>. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u043a <code>bind<\/code> \u0438 \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c IP \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u043f\u043e\u0440\u0442\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0430\u0439\u043d\u0434\u0438\u043b\u0430\u0441\u044c (\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 use case \u0431\u044b\u043b \u0442\u0430\u043a\u043e\u0439: \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0439 cgroup \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0441\u043c. <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/4fbac77d2d092\" rel=\"nofollow\">\u043a\u043e\u043c\u043c\u0438\u0442<\/a>). \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u0430\u043c <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/d74bad4e74ee3\" rel=\"nofollow\">connect<\/a>, <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/1b66d253610c7\" rel=\"nofollow\">getpeername<\/a>, <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/1b66d253610c7\" rel=\"nofollow\">getsockname<\/a>, <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/1cedee13d25ab\" rel=\"nofollow\">sendmsg<\/a> \u0438 <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/983695fa67656\" rel=\"nofollow\">recvmsg<\/a>. \u041a\u0430\u043a \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043e \u0442\u043e\u043c, <a href=\"https:\/\/www.youtube.com\/watch?v=bIRwSIwNHC0\" rel=\"nofollow\">\u043a\u0430\u043a cilium \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043e\u0442 iptables \u0432 k8s<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_CGROUP_SOCKOPT<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 setsockopt.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_CGROUP_DEVICE<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0434\u043b\u044f cgroupv2 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 <a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/cgroup-v1\/devices.txt\" rel=\"nofollow\"><code>device<\/code><\/a> \u0432 cgroupsv1.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_CGROUP_SYSCTL<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c sysctl \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c, \u0437\u0430\u043f\u0440\u0435\u0448\u0430\u0442\u044c, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 cgroup \u0438 \u043f\u044b\u0442\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043e \u0436\u0438\u0437\u043d\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<h2 id=\"bpf_sk\">BPF \u0438 \u0441\u043e\u043a\u0435\u0442\u044b<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SK_SKB<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c: \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u043f \u0442\u0438\u043f\u0430 SOCKMAP, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430. \u0414\u0430\u043b\u044c\u0448\u0435, \u0432 \u044d\u0442\u043e\u0442 \u043c\u0430\u043f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0438 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0443 \u044d\u0442\u0438\u0445 \u0441\u043e\u043a\u0435\u0442\u043e\u0432 \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f <code>recvmsg<\/code>, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 BPF, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 <code>sk_buff<\/code> \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043e\u043a\u0435\u0442. \u042d\u0442\u043e\u0442 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 Isovalent \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u0445 CNI cilium \u0434\u043b\u044f k8s, \u043d\u0430\u0448\u043b\u0438 \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Cloudfare, \u0441\u043c. \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"https:\/\/blog.cloudflare.com\/sockmap-tcp-splicing-of-the-future\/\" rel=\"nofollow\">SOCKMAP \u2014 TCP splicing of the future<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0441\u043a\u043e\u0440\u0435 \u043f\u043e\u0441\u043b\u0435 <code>BPF_PROG_TYPE_SK_SKB<\/code>, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_SK_MSG<\/code> \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 <code>sendmsg<\/code> \u0438\u043b\u0438 <code>sendpage<\/code> \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u043c\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043a\u0435\u0442 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u0435\u0440\u0432\u043e\u043b\u044b \u0443\u0440\u043e\u0432\u043d\u044f L7 \u2014 \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u044b \u0434\u0430\u043b\u044c\u0448\u0435, \u043b\u0438\u0431\u043e \u043e\u0442\u0431\u0440\u043e\u0448\u0435\u043d\u044b. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c <code>BPF_PROG_TYPE_SK_SKB<\/code>, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u043c\u0430\u043f\u0443 \u0442\u0438\u043f\u0430 <code>sockmap<\/code> \u0438 \u0441\u043e\u043a\u0435\u0442\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u044d\u0442\u043e\u0442 \u043c\u0430\u043f.<\/p>\n<p>  <\/p>\n<p>\u0422\u0438\u043f <code>BPF_PROG_TYPE_SK_REUSEPORT<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0434\u043b\u044f \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 <code>SO_REUSEPORT<\/code>. \u0421\u043e\u043a\u0435\u0442\u044b \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043c\u0430\u043f\u0430 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 BPF, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u0430\u043a\u0435\u0442, \u043c\u043e\u0436\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0432 \u043a\u0430\u043a\u043e\u0439 \u0441\u043e\u043a\u0435\u0442 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043f\u0440\u0430\u0432\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c <code>BPF_PROG_TYPE_SK_LOOKUP<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u043e\u043a\u0435\u0442 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0443\u0436\u0435 \u043f\u043e\u043f\u0430\u043b \u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u0414\u0432\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0441\u043e\u043a\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b, \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043d\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0442\u044c \u0432 \u043e\u0434\u0438\u043d \u0441\u043e\u043a\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b, \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u043e\u0440\u0442\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u0441\u0435\u0442\u0435\u0432\u044b\u043c namespaces.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b TCP \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e <code>BPF_PROG_TYPE_SOCK_OPS<\/code>. \u041e\u043d \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u043a cgroupv2, \u043d\u043e \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043a\u0430\u0436\u0443\u0449\u0435\u0433\u043e\u0441\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c <code>BPF_PROG_TYPE_CGROUP_SOCKOPT<\/code>, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442.\u0435., \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/netdevconf.info\/2.2\/papers\/brakmo-tcpbpf-talk.pdf\" rel=\"nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0438\u0447\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b TCP \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u0431\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0434\u0430\u0442\u0430\u0446\u0435\u043d\u0442\u0440\u0435.<\/p>\n<p>  <\/p>\n<h2 id=\"bpf_lwt\">LWT: \u0442\u0443\u043d\u043d\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0438\u043a<\/h2>\n<p>  <\/p>\n<p>\u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0442\u0443\u043d\u043d\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0435\u0442\u0438 \u0442\u0430\u043a, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0434\u0432\u0435 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c IPv4-\u0441\u0435\u0442\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 IPv6-\u0441\u0435\u0442\u0438, \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043a \u043e\u0444\u0438\u0441\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u043f\u043e VPN, \u043d\u0443 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0438\u0437 \u043b\u0435\u0432\u043e\u0439 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 \u0432 \u043f\u0440\u0430\u0432\u0443\u044e \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u0443\u044e \u0447\u0435\u0440\u0435\u0437 \u0440\u043e\u0437\u043e\u0432\u0435\u043d\u044c\u043a\u0443\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0445 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a \u043f\u0430\u043a\u0435\u0442\u0443 \u0441 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043d\u0430 \u043b\u0435\u0432\u043e\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u043e\u0437\u043e\u0432\u0435\u043d\u044c\u043a\u0438\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0430\u0432\u044b\u0439 \u0440\u043e\u0443\u0442\u0435\u0440, \u0433\u0434\u0435 \u0440\u043e\u0437\u043e\u0432\u0435\u043d\u044c\u043a\u0438\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u0438 \u043f\u0430\u043a\u0435\u0442, \u0441 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u043c \u0443\u0436\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c, \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0430\u0432\u0443\u044e \u0441\u0435\u0442\u044c.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nq\/am\/zu\/nqamzuxf9xaojhp-nmrah4mtvck.png\" title=\"\u0442\u0443\u043d\u043d\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 101\"><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0443\u043d\u043d\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0432 Linux, \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: <code>ip link add name ipip0 type ipip...<\/code> \u0438 \u0442.\u043f. \u0412 2015 \u0433\u043e\u0434\u0443 \u0432 Linux <a href=\"https:\/\/lwn.net\/Articles\/650778\/\" rel=\"nofollow\">\u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/a> \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u044f\u043c\u043e \u043a \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043c. \u042d\u0442\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/netdevconf.info\/1.1\/proceedings\/slides\/ahern-aleksandrov-prabhu-scaling-network-cumulus.pdf\" rel=\"nofollow\">\u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0435\u0448\u0435\u0432\u043b\u0435<\/a>, \u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u2014\u00a0\u0438\u043d\u043e\u0433\u0434\u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434, \u0432 2016 \u0433\u043e\u0434\u0443, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 <a href=\"https:\/\/github.com\/torvalds\/linux\/commit\/3a0af8fd61f90\" rel=\"nofollow\">\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443! \u0410 \u0438\u043c\u0435\u043d\u043d\u043e, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0442\u0430\u043b\u043e \u043c\u043e\u0436\u043d\u043e\u00a0\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF \u0442\u0440\u0435\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>BPF_PROG_TYPE_LWT_IN<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/net\/core\/lwtunnel.c#L383\" rel=\"nofollow\"><code>lwtunnel_input<\/code><\/a><\/li>\n<li><code>BPF_PROG_TYPE_LWT_OUT<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/net\/core\/lwtunnel.c#L314\" rel=\"nofollow\"><code>lwtunnel_output<\/code><\/a><\/li>\n<li><code>BPF_PROG_TYPE_LWT_XMIT<\/code>: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.8\/net\/core\/lwtunnel.c#L348\" rel=\"nofollow\"><code>lwtunnel_xmit<\/code><\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c input \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, output \u2014 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0438\u0445, \u0430 xmit \u2014\u00a0\u043f\u0440\u044f\u043c\u043e \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c \u0432\u044b\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>struct __sk_buff<\/code>, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c (<code>BPF_OK<\/code>), \u0434\u0440\u043e\u043f\u043d\u0443\u0442\u044c (<code>BPF_DROP<\/code>), \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 (<code>BPF_REDIRECT<\/code>) \u0438\u043b\u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u044b\u0432\u043e\u0434\u0430 (<code>BPF_DROP<\/code>). \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0442\u0438\u043f\u0430 xmit \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u2014\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u0434\u0440\u043e\u043f\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u044f\u0434\u0440\u043e \u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e <a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/rtnetlink.7.html\" rel=\"nofollow\">netlink \u0441\u043e\u043a\u0435\u0442\u0430\u043c<\/a> \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u0440\u0438\u043c\u0435\u0440-\u0448\u0430\u0431\u043b\u043e\u043d \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0430\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 BPF \u043d\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 iproute2, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0433\u0443\u0433\u043b\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ip route add 10.0.0.0\/24 encap bpf xmit obj &lt;prog.o&gt; section &lt;section&gt; dev &lt;dev&gt;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0433\u0434\u0435 <code>&lt;prog.o&gt;<\/code> \u2014 \u0432\u0430\u0448 BPF ELF, <code>&lt;section&gt;<\/code> \u2014\u00a0\u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u0432 \u044d\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u0438\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 2018 \u0433\u043e\u0434\u0443 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, <code>BPF_PROG_TYPE_LWT_SEG6LOCAL<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <a href=\"https:\/\/tools.ietf.org\/html\/draft-filsfils-spring-srv6-network-programming-01\" rel=\"nofollow\">\u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a> \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0442\u0438\u043f\u0430 <code>seg6local<\/code>, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c. <a href=\"https:\/\/segment-routing.org\/index.php\/Implementation\/AdvancedConf\" rel=\"nofollow\">Using SRv6<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"bpf_prog_type_unspec\">\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u0444\u0440\u043e\u043d\u0442\u0430<\/h1>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF: <code>BPF_PROG_TYPE_UNSPEC<\/code>. \u042d\u0442\u043e\u0442 \u0442\u0438\u043f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e\/\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u044f\u0434\u0440\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 bpf(2) \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c\u0438 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435! \u0418 \u0441 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e 99% \u0432\u044b \u0442\u043e\u0436\u0435 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438, \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0436\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 BPF \u0432 Linux \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0442\u0438\u043f\u0430 <code>BPF_PROG_TYPE_UNSPEC<\/code> \u043d\u0430 \u043d\u043e\u0432\u043e\u043c BPF, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 <code>tcpdump<\/code> \u0438\u043b\u0438 <code>wireshark<\/code> \u043d\u0430 Linux, \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u0442\u0430\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443.<\/p>\n<p>  <\/p>\n<h1 id=\"the_end\"><s>\u0410\u0440\u0435\u0441\u0442,<\/s> \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438<\/h1>\n<p>  <\/p>\n<p>BPF \u0437\u0430\u0432\u043e\u0435\u0432\u044b\u0432\u0430\u0435\u0442 \u043c\u0438\u0440 Linux, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043f\u043e\u0434-\u043c\u0438\u0440\u044b \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 BPF \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043a\u0430\u043a \u043e\u0431\u0449\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0441\u0442\u0435\u043a\u0430, \u0442\u0430\u043a \u0438 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0433\u043e Linux. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u0439, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 BPF \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u043f\u0443\u043d\u043a\u0442\u043e\u043c \u0440\u0435\u0437\u044e\u043c\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 Linux.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043d\u0430\u0447\u043d\u0435\u043c \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0438 (\u0438\u043b\u0438, \u0441\u043a\u043e\u0440\u0435\u0435, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445) \u043f\u0440\u043e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 Linux \u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 BPF \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 kprobes, tracepoints \u0438 perf events, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u2014\u00a0<code>libbpf<\/code>, <code>bcc<\/code> \u0438 <code>bpftrace<\/code>.<\/p>\n<p>  <\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p>  <\/p>\n<h3>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430<\/h3>\n<p>  <\/p>\n<ol>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/493880\/\">BPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0447\u0430\u0441\u0442\u044c \u043d\u0443\u043b\u0435\u0432\u0430\u044f: classic BPF<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/514736\/\">BPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0447\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u0430\u044f: extended BPF<\/a><\/li>\n<\/ol>\n<p>  <\/p>\n<h3>2,5 \u043a\u043d\u0438\u0436\u043a\u0438<\/h3>\n<p>  <\/p>\n<ul>\n<li>\n<p><a href=\"http:\/\/www.brendangregg.com\/bpf-performance-tools-book.html\" rel=\"nofollow\">Brendan Gregg, \u00abBPF Performance Tools\u00bb<\/a>. \u0411\u0413 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043b \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b BPF \u0432 \u0434\u0435\u043b\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Linux \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0430\u043d\u043d\u0430\u044f \u043a\u043d\u0438\u0436\u043a\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043f\u044f\u0442\u0438 \u043b\u0435\u0442 \u2014\u00a0\u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 BCC, \u043e\u043a\u043e\u043b\u043e \u0441\u043e\u0442\u043d\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0436\u043a\u0438. \u041a\u043d\u0438\u0436\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u044b\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e BPF \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439.<\/p>\n<p>  <\/li>\n<li>\n<p><a href=\"http:\/\/www.brendangregg.com\/systems-performance-2nd-edition-book.html\" rel=\"nofollow\">Brendan Gregg, \u00abSystems Performance: Enterprise and the Cloud, 2nd Edition (2020)\u00bb<\/a>. \u0415\u0449\u0435 \u043d\u0435 \u0432\u044b\u0448\u0435\u0434\u0448\u0435\u0435 \u0432\u0442\u043e\u0440\u043e\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u043e\u0439 \u00abSystems Performance\u00bb. \u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e BPF, \u0432\u044b\u043a\u0438\u043d\u0443\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e Solaris, \u0430 \u0441\u0430\u043c \u0411\u0413 \u0441\u0442\u0430\u043b \u043d\u0430 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043e\u043f\u044b\u0442\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043a\u043d\u0438\u0436\u043a\u0430 \u00abBPF Performance Tools\u00bb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a?\u00bb, \u0442\u043e \u044d\u0442\u0430 \u043a\u043d\u0438\u0436\u043a\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043f\u043e\u0447\u0435\u043c\u0443?\u00bb<\/p>\n<p>  <\/li>\n<li>\n<p><a href=\"https:\/\/www.oreilly.com\/library\/view\/linux-observability-with\/9781492050193\/\" rel=\"nofollow\">David Calavera and Lorenzo Fontana, \u00abLinux Observability with BPF\u00bb<\/a>. \u042d\u0442\u0430 \u043a\u043d\u0438\u0436\u043a\u0430 \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c. \u0410\u0432\u0442\u043e\u0440\u044b \u044f\u0432\u043d\u043e \u0442\u043e\u0440\u043e\u043f\u0438\u043b\u0438\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u041f\u0435\u0440\u0432\u0443\u044e \u041a\u043d\u0438\u0433\u0443 \u043f\u0440\u043e BPF, \u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u043b\u043e\u0433\u0430\u043c\u0438, \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438.<\/p>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<h3>Online-\u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0431\u043b\u043e\u0433\u0438<\/h3>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u0442\u0435\u0439 \u0438 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u043f\u0440\u043e BPF \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0435\u043b\u0438\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0430\u044f \u0432\u044b\u0448\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Isovalent \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u0435 \u0445\u0430\u0439\u043f\u043e\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0436\u0430\u044f \u0441 BPF \u0438, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u044d\u0442\u043e\u0442 <a href=\"https:\/\/ebpf.io\/\" rel=\"nofollow\">\u0441\u0430\u0439\u0442 \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439<\/a> \u0438 \u043f\u0440\u043e\u0432\u0435\u043b\u0430 <a href=\"https:\/\/ebpf.io\/summit-2020\/\" rel=\"nofollow\">BPF summit<\/a> \u2014 \u043c\u0438\u043d\u0438-\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e \u043f\u0440\u043e BPF. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u043a\u0442: \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e BPF Summit \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u043a\u043e\u0442 BPF, \u043f\u0447\u0435\u043b\u043a\u0443, \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u0435\u043c\u0443 \u0431\u043b\u0430\u0433\u043e\u0437\u0432\u0443\u0447\u043d\u043e\u0435 \u0438\u043c\u044f Ebee:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/td\/op\/na\/tdopnazjrd3vft41nt83ic_hafa.png\" title=\"Ebee\"><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/529316\/\"> https:\/\/habr.com\/ru\/post\/529316\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/post\/514736\/\">BPF<\/a> \u2014 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u044f\u0434\u0440\u0430 Linux \u2014\u00a0\u0438 \u0432 \u044d\u0442\u043e\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043a\u0430\u043f\u0438\u0442\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0447\u0438\u0441\u0442\u043e\u0433\u0430\u043d\u0430. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0441\u044b\u043b\u043e\u043a, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u0434\u0432\u0435 \u0441 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043e\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043a\u043d\u0438\u0436\u043a\u0438 \u043f\u0440\u043e BPF.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044f\u0434\u0440\u0435 Linux \u0432\u0435\u0440\u0441\u0438\u0438 5.9 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0438\u0434\u0446\u0430\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF, \u0438 \u043f\u0440\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0435\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u043f\u043e\u043d\u0435\u0432\u043e\u043b\u0435, \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439, \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435. \u041d\u043e, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e, \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u0437\u0430\u0447\u0435\u043c \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 BPF \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e BPF \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 DDoS \u0430\u0442\u0430\u043a, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 kubernetes, \u0437\u0430\u0449\u0438\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c \u043e\u0442 \u043d\u0430\u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c 24&#215;7 \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u0440\u043e\u0434\u0435 \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435, \u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0q\/ch\/xj\/0qchxjfo0secpjjyh715v9jrxks.jpeg\" title=\"Edward Hicks - Noahs Ark 1846\"><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-313558","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=313558"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313558\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=313558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=313558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=313558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}