{"id":337758,"date":"2022-09-01T09:00:25","date_gmt":"2022-09-01T09:00:25","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=337758"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=337758","title":{"rendered":"<span>\u041a\u0430\u043a \u043d\u0435 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c, \u0440\u0430\u0441\u043a\u0443\u0440\u0438\u0442\u044c eBPF \u0437\u0430 \u0441\u0443\u0442\u043a\u0438 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c DNS<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c: \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0435\u0433\u0438\u0442\u0438\u043c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u043e IP, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0445 \u0441\u043b\u0430\u0442\u044c, \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b. \u0412 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0442\u0430\u043a\u0438 \u0434\u0430, \u0438\u0434\u0443\u0442. \u041d\u043e \u043d\u0435 \u044f\u0441\u043d\u043e &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043b\u0435\u0433\u0438\u0442\u0438\u043c\u043d\u044b\u0435 \u0438\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0443\u0442\u0435\u043a\u0430\u0435\u0442 \u043a \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0430\u043c? \u0411\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0449\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u0431\u044b\u043b \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0434\u043e\u043c\u0435\u043d \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435. \u0423\u0432\u044b, \u043d\u043e PTR \u043d\u0435 \u0432 \u043c\u043e\u0434\u0435, \u0430 securitytrails \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e, \u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 IP.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c tcpdump. \u041d\u043e \u043a\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440? \u0410 \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0434\u0438\u043d? \u0415\u0441\u0442\u044c <a href=\"https:\/\/www.elastic.co\/beats\/packetbeat\" rel=\"noopener noreferrer nofollow\">packetbeat<\/a>. \u042d\u0442\u043e \u0447\u0443\u0434\u043e\u0432\u0438\u0449\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0436\u0440\u0430\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445. \u0411\u0440\u0440\u2026 \u041d\u0435 \u0445\u043e\u0447\u0443 \u043e \u043d\u0451\u043c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c. <a href=\"https:\/\/osquery.io\" rel=\"noopener noreferrer nofollow\">Osquery<\/a> &#8212; \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e &#8212; \u043e DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 <a href=\"https:\/\/github.com\/osquery\/osquery\/pull\/6254\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a> \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e. <a href=\"https:\/\/github.com\/zeek\/zeek\" rel=\"noopener noreferrer nofollow\">Zeek<\/a> &#8212; \u043e \u043d\u0451\u043c \u044f \u0443\u0437\u043d\u0430\u043b \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u043e\u0445\u043e\u0436\u0435 \u043e\u043d \u043d\u0435\u043f\u043b\u043e\u0445, \u043d\u043e \u043c\u0435\u043d\u044f \u0441\u043c\u0443\u0442\u0438\u043b\u043e \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430: \u043e\u043d \u0441\u043b\u0435\u0434\u0438\u0442 <a href=\"https:\/\/docs.zeek.org\/en\/lts\/logs\/index.html\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e<\/a> \u0437\u0430 DNS, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d (\u0445\u043e\u0442\u044f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b); \u0430 \u0435\u0449\u0451 \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e <a href=\"https:\/\/docs.zeek.org\/en\/lts\/logs\/dns.html\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u0437\u043d\u0430\u0435\u0442<\/a> \u043e \u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u043b\u0430\u043b \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u044d\u0442\u043e \u0432\u0441\u0451? \u042f \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u044b\u0448\u0430\u043b \u043f\u0440\u043e eBPF\u2026<\/p>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e \u0442\u043e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 eBPF. \u0422\u0435\u043e\u0440\u0438\u0438 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/493880\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/514736\/\" rel=\"noopener noreferrer nofollow\">\u0446\u0438\u043a\u043b<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/529316\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u0435\u0439<\/a> (\u0441\u043f\u0430\u0441\u0438\u0431\u043e, <a class=\"mention\" href=\"\/users\/aspsk\">@aspsk<\/a>, \u0442\u0432\u043e\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435!). \u0427\u0435\u0433\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0431\u043e\u043b\u044c\u0448\u0435 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435) &#8212; \u0442\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u044f \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438. \u0410 \u0438\u043d\u043e\u0433\u0434\u0430 &#8212; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0445\u043e\u0434\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041a\u0430\u043a \u0438\u0442\u043e\u0433 &#8212; \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 eBPF \u0437\u0430\u0442\u0440\u0430\u0442\u044f\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u044f\u0442 \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 packetbeat?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0443\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0438 \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0431\u043e\u043b\u0435\u0432\u0448\u0438\u043c \ud83d\ude42 \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043a\u0430\u0437\u0430\u043d\u043e: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e &#8212; \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0426\u041f. \u041d\u0443 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u044f \u0435\u043c\u0443 \u043f\u0430\u043c\u044f\u0442\u044c. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 &#8212; \u0434\u0430, \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c\u0441\u044f. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u2026 \u0442\u043e\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0441\u0442\u0430\u043b\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u0434\u043e\u043b\u0431\u0430\u043b\u0441\u044f \u0438 \u0441\u043d\u0451\u0441 packetbeat:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/66d\/138\/8fe\/66d1388fed542d0a57b62f782f13472f.png\" width=\"1920\" height=\"935\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/66d\/138\/8fe\/66d1388fed542d0a57b62f782f13472f.png\"\/><figcaption><\/figcaption><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e<\/h2>\n<p>\u041f\u0438\u0441\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u043d\u0430 Python \u0438 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e &#8212; \u043f\u043e\u0439\u043c\u0451\u043c \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 Python \u0438 eBPF. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0437\u044f\u0442\u044b\u0439 <a href=\"https:\/\/rdelfin.com\/blog\/post_ebpf_002\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u0436\u0430\u043b\u044c \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440 \u0442\u0430\u043a \u0438 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e). \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<pre><code>python3-bpfcc bpfcc-tools libbpfcc linux-headers-$(uname -r)<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0434\u043b\u044f Debian. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u043b\u0435\u0437\u0442\u044c \u0432 \u044f\u0434\u0440\u043e, \u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0434 \u0432\u0430\u0448 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 =). \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  from bcc import BPF  BPF_PROGRAM = r\"\"\" int hello(void *ctx) {   bpf_trace_printk(\"Hello world! clone() is calling\\n\");   return 0; } \"\"\"   bpf = BPF(text=BPF_PROGRAM) bpf.attach_kprobe(event=bpf.get_syscall_fnname(\"clone\"), fn_name=\"hello\")  while True:     try:         (_, _, _, _, _, msg_b) = bpf.trace_fields()         msg = msg_b.decode('utf8')         if 'Hello world' in msg:             print(msg)     except ValueError:         continue     except KeyboardInterrupt:         break<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u043c\u0438\u0440\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c, \u043e\u043d \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e, \u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442 \u043d\u0430\u0441 \u0441 \u0431\u0430\u0437\u043e\u0439. eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 \u044f\u0434\u0440\u0435. <code>attach_kprobe()<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u044f\u0434\u0440\u0430. \u041d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435 \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438, \u043a\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439? \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044f\u0434\u0440\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>get_syscall_fnname()<\/code>.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 eBPF &#8212; \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>bpf_trace_printk()<\/code>. \u041d\u043e \u044d\u0442\u043e &#8212; \u0432\u044b\u0432\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0412\u0441\u0451 \u0447\u0442\u043e \u0432\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u0442\u0435 \u0432 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8212; \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b <code>\/sys\/kernel\/debug\/tracing\/trace_pipe<\/code>. \u0418 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b &#8212; \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>trace_fields()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0430\u043c\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043d\u0430\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0430 &#8212; \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e <code>Ctrl-C<\/code>, \u043c\u044b \u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0438 \u0435\u0441\u043b\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f &#171;Hello world&#187; &#8212; \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0435\u0451 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<blockquote>\n<p><strong>NB<\/strong>: <code>bpf_trace_printk()<\/code> \u0443\u043c\u0435\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \u043f\u043e\u0434\u043e\u0431\u043d\u043e <code>printf()<\/code>, \u043d\u043e \u0441 \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 &#8212; \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d <code>%s<\/code>.<\/p>\n<\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u043d\u044f\u0432 \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 eBPF, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b DNS \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u043a\u0442\u043e \u0447\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b \u0438 \u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b.<\/p>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 eBPF. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 &#8212; \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u0442\u0441\u044f \u043a \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0441\u043e\u043a\u0435\u0442\u0443. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u043a\u0435\u0442. \u041a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f &#8212; \u043f\u043e\u043a\u0430\u0436\u0443 \u043f\u043e\u0437\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 &#8212; \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e\u0439\u043c\u0430\u0442\u044c UDP \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 53. \u0418 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b. \u041d\u0430 C. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Ethernet. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 <code>cursor_advance<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c) \u043f\u043e \u043f\u0430\u043a\u0435\u0442\u0443, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u044f \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 (\u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 <a href=\"https:\/\/stackoverflow.com\/q\/60249948\/6696500\" rel=\"noopener noreferrer nofollow\">StackOverflow<\/a>):<\/p>\n<pre><code class=\"cpp\">#include &lt;linux\/if_ether.h> #include &lt;linux\/in.h> #include &lt;bcc\/proto.h>  int dns_matching(struct __sk_buff *skb) {     u8 *cursor = 0;      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b IP:     struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));      if (ethernet->type == ETH_P_IP) {         \u2026<\/code><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>ethernet_t<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 <a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/src\/cc\/export\/proto.h\" rel=\"noopener noreferrer nofollow\">proto.h<\/a>:<\/p>\n<pre><code class=\"cpp\">struct ethernet_t {   unsigned long long  dst:48;   unsigned long long  src:48;   unsigned int        type:16; }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 Ethernet-\u043a\u0430\u0434\u0440\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Ethernet#%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D0%BA%D0%B0%D0%B4%D1%80%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0441\u0442\u043e\u0439<\/a> \u2013 \u044d\u0442\u043e 6 \u0431\u0430\u0439\u0442 (48 \u0431\u0438\u0442) \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 (16 \u0431\u0438\u0442) \u0442\u0438\u043f\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/p>\n<p>\u0422\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 <code>ETH_P_IP<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0432\u043d\u0430 <code>0x0800<\/code> \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>if_ether.h<\/code> &#8212; \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f IP (\u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043e\u043f\u0438\u0441\u0430\u043d \u0443 <a href=\"https:\/\/standards-oui.ieee.org\/ethertype\/eth.txt\" rel=\"noopener noreferrer nofollow\">IEEE<\/a>).<\/p>\n<p>\u0418\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0447\u0442\u043e \u0432 IP \u0432\u043b\u043e\u0436\u0435\u043d UDP \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 53:<\/p>\n<pre><code class=\"cpp\">        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b UDP:         struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));          if (ip->nextp == IPPROTO_UDP) {             \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0440\u0442 53:             struct udp_t *udp = cursor_advance(cursor, sizeof(*udp));              if (udp->dport == 53) {                 \/\/ \u0417\u0430\u043f\u0440\u043e\u0441                 return -1;             }              if (udp->sport == 53) {                 \/\/ \u041e\u0442\u0432\u0435\u0442                 return -1;             }         }<\/code><\/pre>\n<p><code>ip_t<\/code> \u0438 <code>udp_t<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432\u0441\u0451 \u0432 \u0442\u043e\u043c \u0436\u0435 <code>proto.h<\/code>. \u0410 \u0432\u043e\u0442 <code>IPPROTO_UDP<\/code> \u0443\u0436\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>in.h<\/code>. \u0412\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 IP \u0443\u0436\u0435 \u0447\u0443\u0442\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/IPv4#%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u043e\u0436\u043d\u0435\u0435<\/a> &#8212; \u0432 \u00a0\u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0411\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u044b, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u043d\u043e \u043c\u044b \u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b\u0438 &#8212; \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0445\u043e\u0434\u0443 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c.<\/p>\n<p>DNS-\u043f\u0430\u043a\u0435\u0442 \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0438 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043b\u0435\u0433\u0447\u0435 &#8212; \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043f\u0430\u043a\u0435\u0442 \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 (\u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <code>return -1<\/code> &#8212; \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 <code>0<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u043b \u0431\u044b \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e).<\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a Python. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u0441\u0451 \u0436\u0435 \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0441\u043e\u043a\u0435\u0442:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  import dnslib import sys  from bcc import BPF  bpf = BPF(text=BPF_PROGRAM) function_dns_matching = bpf.load_func(\"dns_matching\", BPF.SOCKET_FILTER) BPF.attach_raw_socket(function_dns_matching, '')<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u043a\u0435\u0442. \u041f\u0443\u0441\u0442\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 <code>attach_raw_socket<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 &#171;\u0432\u0441\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b&#187;. \u0415\u0441\u043b\u0438 \u0431\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 &#8212; \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0435\u0433\u043e \u0438\u043c\u044f.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043c \u0441\u043e\u043a\u0435\u0442 \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c:<\/p>\n<pre><code class=\"python\">import fcntl import os  socket_fd = function_dns_matching.sock fl = fcntl.fcntl(socket_fd, fcntl.F_GETFL) fcntl.fcntl(socket_fd, fcntl.F_SETFL, fl &amp; ~os.O_NONBLOCK)<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0430 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u0432 \u043d\u0451\u043c \u0447\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u0430, \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0434\u043e\u0431\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043e DNS-\u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  import dnslib import fcntl import os import sys  from bcc import BPF   BPF_PROGRAM = r''' #include &lt;linux\/if_ether.h> #include &lt;linux\/in.h> #include &lt;bcc\/proto.h>  int dns_matching(struct __sk_buff *skb) {     u8 *cursor = 0;      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b IP:     struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));      if (ethernet->type == ETH_P_IP) {         \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b UDP:         struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));          if (ip->nextp == IPPROTO_UDP) {             \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0440\u0442 53:             struct udp_t *udp = cursor_advance(cursor, sizeof(*udp));              if (udp->dport == 53 || udp->sport == 53) {                 return -1;             }         }     }     return 0; } '''   bpf = BPF(text=BPF_PROGRAM) function_dns_matching = bpf.load_func(\"dns_matching\", BPF.SOCKET_FILTER) BPF.attach_raw_socket(function_dns_matching, '')  socket_fd = function_dns_matching.sock fl = fcntl.fcntl(socket_fd, fcntl.F_GETFL) fcntl.fcntl(socket_fd, fcntl.F_SETFL, fl &amp; ~os.O_NONBLOCK)  while True:     try:         packet_str = os.read(socket_fd, 2048)     except KeyboardInterrupt:         sys.exit(0)      packet_bytearray = bytearray(packet_str)      ETH_HLEN = 14     UDP_HLEN = 8      # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP     ip_header_length = packet_bytearray[ETH_HLEN]     ip_header_length = ip_header_length &amp; 0x0F     ip_header_length = ip_header_length &lt;&lt; 2      # \u041d\u0430\u0447\u0430\u043b\u043e DNS-\u043f\u0430\u043a\u0435\u0442\u0430     payload_offset = ETH_HLEN + ip_header_length + UDP_HLEN      payload = packet_bytearray[payload_offset:]      dnsrec = dnslib.DNSRecord.parse(payload)      # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442:     if dnsrec.rr:         print(f'\u041e\u0422\u0412\u0415\u0422: {dnsrec.rr[0].rname} {dnslib.QTYPE.get(dnsrec.rr[0].rtype)} {\", \".join([repr(dnsrec.rr[i].rdata) for i in range(0, len(dnsrec.rr))])}')     # \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441:     else:         print(f'\u0417\u0410\u041f\u0420\u041e\u0421: {dnsrec.questions[0].qname} {dnslib.QTYPE.get(dnsrec.questions[0].qtype)}')<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 (\u0435\u0433\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/examples\/networking\/dns_matching\/dns_matching.py\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442<\/a>) \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043a\u0430\u043a\u0438\u0435 DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b\/\u043e\u0442\u0432\u0435\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u0430\u0448 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043d\u043e \u043c\u044b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0443\u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0422. \u0435. \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043b Zeek.<\/p>\n<h2>\u0412\u0441\u0451-\u0442\u0430\u043a\u0438 \u0442\u0435\u043e\u0440\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432 eBPF \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#8212; <code>bpf_get_current_pid_tgid()<\/code>, <code>bpf_get_current_uid_gid()<\/code>, <code>bpf_get_current_comm(char *buf, int size_of_buf)<\/code>. \u041e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0434\u0440\u0430 (\u043a\u0430\u043a \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435). \u0421 UID\/GID \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0410 \u0432\u043e\u0442 \u043f\u0435\u0440\u0432\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u044f\u0434\u0440\u0430. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u0432 \u044f\u0434\u0440\u0435 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a PID &#8212; \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 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0438\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0410 \u0442\u043e \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442 <code>thread group ID<\/code> &#8212; \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 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f PID&#8217;\u043e\u043c. \u0421\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438 \u0441 <code>bpf_get_current_comm()<\/code> &#8212; \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0435 \u0438\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>ps<\/code>, \u0430 \u0438\u043c\u044f \u043d\u0438\u0442\u0438.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c.  \u041a\u0430\u043a \u043d\u0430\u043c \u0438\u0445 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \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? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0421\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u043a\u0430\u043a <code>BPF_PERF_OUTPUT(event)<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>event.perf_submit(ctx, data, data_size)<\/code>, \u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u043f\u0443\u0442\u0451\u043c \u043e\u043f\u0440\u043e\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 <code>b.perf_buffer_poll()<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b, \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>callback()<\/code>, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <code>b[\"event\"].open_perf_buffer(callback)<\/code>.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u044f \u0440\u0430\u0441\u043f\u0438\u0448\u0443 \u043d\u0438\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0442\u0435\u043e\u0440\u0438\u044e \u0438 \u043f\u043e\u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0435\u043c \u0432\u043e\u0442 \u043d\u0430\u0434 \u0447\u0435\u043c. \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0430\u043c \u043f\u0430\u043a\u0435\u0442 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041a\u0430\u043a\u043e\u0439? \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 &#8212; 512 \u0431\u0430\u0439\u0442. \u041d\u043e \u043e\u043d \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 EDNS, \u0430 \u0435\u0449\u0451 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c (\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e!) DNS-\u043f\u0430\u043a\u0435\u0442\u044b \u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 TCP. \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0451\u043c &#171;\u043f\u0440\u043e \u0437\u0430\u043f\u0430\u0441&#187;, \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0451 \u0436\u0435 \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043a\u0440\u0443\u043f\u043d\u0435\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0434\u043e. \u041c\u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 &#8212; <code>perf_submit_skb()<\/code>. \u041f\u043e\u043c\u0438\u043c\u043e \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0442\u0430\u043a \u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430. \u041d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441 &#8212; \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c eBPF &#8212; \u0441\u043e\u043a\u0435\u0442, XDP. \u0422. \u0435. \u0442\u0435\u0445, \u0433\u0434\u0435 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 =)<\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u0434\u0430\u0436\u0435 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438! \u0418 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">BPF_TABLE_PUBLIC(\"hash\", key, val, name, max_elements);<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0451 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0410 \u0447\u0442\u043e\u0431\u044b \u043a \u043d\u0435\u0439 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">BPF_TABLE(\"extern\", key, val, name, max_elements);<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u0448 \u043f\u0430\u043a\u0435\u0442 \u0441\u0440\u0435\u0434\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 &#8212; \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e 5 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432: \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u0430\u0434\u0440\u0435\u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u043f\u043e\u0440\u0442 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0430\u0434\u0440\u0435\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u0440\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">struct port_key {     u8 proto;     u32 saddr;     u32 daddr;     u16 sport;     u16 dport; };<\/code><\/pre>\n<p>\u0410 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c &#8212; \u0432\u0441\u0451 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435:<\/p>\n<pre><code class=\"cpp\">struct port_val {     u32 ifindex;     u32 pid;     u32 tgid;     u32 uid;     u32 gid;     char comm[64]; };<\/code><\/pre>\n<p><code>ifindex<\/code> &#8212; \u044d\u0442\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0435. \u0410 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0447\u0442\u043e\u0431\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u0441\u044e \u044d\u0442\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \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.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e: \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 &#8212; \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u044d\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u0448\u0430\u043d. \u0410 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0430\u043a\u0435\u0442 (\u043f\u0440\u0438\u0447\u0451\u043c \u043d\u0435 \u0432\u0430\u0436\u043d\u043e &#8212; \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0438\u043b\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439) \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c &#8212; \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0442\u0430\u043c\u0438 \u043f\u043e \u0442\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443. \u0415\u0441\u043b\u0438 \u043e\u043d\u0430 \u0435\u0441\u0442\u044c &#8212; \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u0430\u043c\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0435\u0451 \u0432 Python, \u0433\u0434\u0435 \u0443\u0436\u0435 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0443.<\/p>\n<p>\u0427\u0442\u043e \u0436, \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u0440\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 &#8212; \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0436\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c!<\/p>\n<h2>\u0410 \u043a\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b?!<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/net\/ipv4\/udp.c#L1043\" rel=\"noopener noreferrer nofollow\">udp_sendmsg()<\/a> \u0438 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/net\/ipv4\/tcp.c#L1478\" rel=\"noopener noreferrer nofollow\">tcp_sendmsg()<\/a>. \u041e\u0431\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/master\/include\/net\/sock.h#L352\" rel=\"noopener noreferrer nofollow\">sock<\/a> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430. \u0412 eBPF \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430\u0448\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043b\u0438\u0431\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <code>PT_REGS_PARMx<\/code>, \u0433\u0434\u0435 <code>x<\/code> &#8212; \u043d\u043e\u043c\u0435\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u041d\u0438\u0436\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043e\u0431\u0430 \u044d\u0442\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u0418 \u0432\u043e\u0442 \u043d\u0430\u0448\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, <code>BPF_KPROBE_TEXT<\/code>:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0434\u043b\u044f \/\/ eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u044b 'proc_ports': struct port_key {     u8 proto;     u32 saddr;     u32 daddr;     u16 sport;     u16 dport; };  \/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 'proc_ports', \/\/ \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435: struct port_val {     u32 ifindex;     u32 pid;     u32 tgid;     u32 uid;     u32 gid;     char comm[64]; };  \/\/ \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c) eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \/\/ \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \/\/ \u0427\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0435: BPF_TABLE_PUBLIC(\"hash\", struct port_key, struct port_val, proc_ports, 20480);   \/\/ \u042d\u0442\u043e \u0434\u0432\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \/\/int trace_udp_sendmsg(struct pt_regs *ctx) { \/\/    struct sock *sk = (struct sock *)PT_REGS_PARM1(ctx); int trace_udp_sendmsg(struct pt_regs *ctx, struct sock *sk) {     u16 sport = sk->sk_num;     u16 dport = sk->sk_dport;        \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 53.     \/\/ 13568 = ntohs(53);     if (sport == 13568 || dport == 13568) {         \/\/ \u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435:         u32 saddr = sk->sk_rcv_saddr;         u32 daddr = sk->sk_daddr;         u64 pid_tgid = bpf_get_current_pid_tgid();         u64 uid_gid  = bpf_get_current_uid_gid();          \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u043a\u043b\u044e\u0447.         \/\/ \u042d\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u044b \u043d\u0438\u0436\u0435.         struct port_key key = {.proto = 17};         key.saddr = htonl(saddr);         key.daddr = htonl(daddr);         key.sport = sport;         key.dport = htons(dport);          \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:         struct port_val val = {};         val.pid = pid_tgid >> 32;         val.tgid = (u32)pid_tgid;         val.uid = (u32)uid_gid;         val.gid = uid_gid >> 32;         bpf_get_current_comm(val.comm, 64);          \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 eBPF:         proc_ports.update(&amp;key, &amp;val);     }     return 0; }<\/code><\/pre>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 <code>tcp_sendmsg<\/code> \u0431\u0443\u0434\u0435\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0439 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 &#8212; \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>port_key<\/code> \u043f\u043e\u043b\u0435 <code>proto<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 6. \u0414\u0432\u0430 \u044d\u0442\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (<code>17<\/code> \u0438 <code>6<\/code>) \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u043e\u0434\u0430\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 UDP \u0438 TCP \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u042d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 <code>\/etc\/protocols<\/code>.<\/p>\n<p>\u041e\u0431\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>bpf_get_current_*<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 64 \u0431\u0438\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u043d\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u043d\u0438\u0435 \u0438 \u0432\u0435\u0440\u0445\u043d\u0438\u0435 32 \u0431\u0438\u0442\u0430. \u041f\u0440\u0438\u0447\u0451\u043c \u0434\u043b\u044f PID\/TGID \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0431\u0435\u0440\u0451\u043c \u0438\u0445 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0438\u0434\u0435 (\u0442. \u0435. \u0432 \u043f\u043e\u043b\u0435 <code>pid<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u0445\u043d\u0438\u0435 32 \u0431\u0438\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442 TGID).<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u0441\u0447\u0451\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u0440\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b-\u043a\u043b\u044e\u0447\u0430. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u043c \u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0438\u0437 \u044f\u0434\u0435\u0440\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>sock<\/code>, \u0430 \u0438\u0437 eBPF&#8217;\u043d\u043e\u0439 <a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/src\/cc\/compat\/linux\/virtual_bpf.h#L5746\" rel=\"noopener noreferrer nofollow\">__sk_buff<\/a>, \u0430 \u0432 \u043d\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"cpp\">__u32 remote_ip4;\/* Stored in network byte order *\/ __u32 local_ip4;\/* Stored in network byte order *\/ __u32 remote_port;\/* Stored in network byte order *\/ __u32 local_port;\/* stored in host byte order *\/<\/code><\/pre>\n<h2>\u041b\u043e\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u044b<\/h2>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, <code>BPF_SOCK_TEXT<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 &#171;\u0432\u0438\u0441\u0435\u0442\u044c&#187; \u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0435, \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0451, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u0430\u043c\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c, \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0434\u043b\u044f \/\/ eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u044b 'proc_ports': struct port_key {     u8 proto;     u32 saddr;     u32 daddr;     u16 sport;     u16 dport; };  \/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 'proc_ports', \/\/ \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435: struct port_val {     u32 ifindex;     u32 pid;     u32 tgid;     u32 uid;     u32 gid;     char comm[64]; };  \/\/ eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \/\/ \u041d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044f\u0434\u0440\u0430 udp_sendmsg()\/tcp_sendmsg(): BPF_TABLE(\"extern\", struct port_key, struct port_val, proc_ports, 20480);  \/\/ \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: BPF_PERF_OUTPUT(dns_events);   \/\/ \u0421\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043a\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0449\u0435\u043c DNS-\u043f\u0430\u043a\u0435\u0442\u044b \/\/ \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435: int dns_matching(struct __sk_buff *skb) {     u8 *cursor = 0;      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b IP:     struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));      if (ethernet->type == ETH_P_IP) {         struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));          u8 proto;         u16 sport;         u16 dport;          \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f:         if (ip->nextp == IPPROTO_UDP) {             struct udp_t *udp = cursor_advance(cursor, sizeof(*udp));              proto = 17;              \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0440\u0442\u0430\u0445:             sport = udp->sport;             dport = udp->dport;         } else if (ip->nextp == IPPROTO_TCP) {             struct tcp_t *tcp = cursor_advance(cursor, sizeof(*tcp));              \/\/ \u041d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043f\u0430\u043a\u0435\u0442\u044b \u0433\u0434\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435:             if (!tcp->flag_psh) {                 return 0;             }              proto = 6;              \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0440\u0442\u0430\u0445:             sport = tcp->src_port;             dport = tcp->dst_port;         } else {             return 0;         }          \/\/ \u0415\u0441\u043b\u0438 \u044d\u0442\u043e DNS-\u0437\u0430\u043f\u0440\u043e\u0441:         if (dport == 53 || sport == 53) {             \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u043a\u043b\u044e\u0447:             struct port_key key = {};             key.proto = proto;             if (skb->ingress_ifindex == 0) {                 key.saddr = ip->src;                 key.daddr = ip->dst;                 key.sport = sport;                 key.dport = dport;             } else {                 key.saddr = ip->dst;                 key.daddr = ip->src;                 key.sport = dport;                 key.dport = sport;             }              \/\/ \u041f\u043e \u043a\u043b\u044e\u0447\u0443 \u0438\u0449\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 eBPF:             struct port_val *p_val;             p_val = proc_ports.lookup(&amp;key);              \/\/ \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e - \u0437\u043d\u0430\u0447\u0438\u0442 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e             \/\/ \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043b\u0436\u0430\u0442\u044c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430:             if (!p_val) {                 return 0;             }              \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:             p_val->ifindex = skb->ifindex;              \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441             \/\/ skb->len \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u043e\u043a\u0435\u0442:             dns_events.perf_submit_skb(skb, skb->len, p_val,                                        sizeof(struct port_val));             return 0;         } \/\/dport == 53 || sport == 53     } \/\/ethernet->type == ETH_P_IP      return 0; }<\/code><\/pre>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u041c\u044b \u0441\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u043f\u0430\u043a\u0435\u0442\u0443 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439. \u041f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0432 \u0441\u0438\u043b\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP. \u041d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0438 \u043a\u043e\u0435-\u0447\u0442\u043e \u043d\u043e\u0432\u043e\u0435 &#8212; \u0434\u043b\u044f TCP-\u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0444\u043b\u0430\u0433 &#8212; \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043f\u0430\u043a\u0435\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0435\u0441\u0443\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (SYN, ACK \u0438 \u0442. \u043f.).<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b <code>proc_ports<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 &#8212; \u0432\u0435\u0434\u044c \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043d\u043e\u0441\u0438\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0434\u0430\u043d\u043d\u044b\u0435, \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u0438 \u0447\u0442\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043c\u044b. \u041d\u043e \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 &#8212; \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u043e\u043b\u0435 <code>ingress_ifindex<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043b\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0440\u0430\u0432\u043d\u043e 0.<\/p>\n<h2>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>\u041e\u0442 Python&#8217;\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u0440\u0438 \u0432\u0435\u0449\u0438: \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432 \u044f\u0434\u0440\u043e \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442 \u043d\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0445.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0435. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 eBPF \u043c\u044b \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445:<\/p>\n<pre><code class=\"python\"># \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f BPF: bpf_kprobe = BPF(text=BPF_KPROBE_TEXT) bpf_sock = BPF(text=BPF_SOCK_TEXT)  # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 UDP: bpf_kprobe.attach_kprobe(event=\"udp_sendmsg\", fn_name=\"trace_udp_sendmsg\")  # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 TCP: bpf_kprobe.attach_kprobe(event=\"tcp_sendmsg\", fn_name=\"trace_tcp_sendmsg\")  # \u0421\u043e\u043a\u0435\u0442: function_dns_matching = bpf_sock.load_func(\"dns_matching\", BPF.SOCKET_FILTER) BPF.attach_raw_socket(function_dns_matching, '')<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0449\u0451 \u043a\u043e\u0440\u043e\u0447\u0435:<\/p>\n<pre><code class=\"python\">bpf_sock[\"dns_events\"].open_perf_buffer(print_dns)  while True:     try:         bpf_sock.perf_buffer_poll()     except KeyboardInterrupt:         exit()<\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0439. \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 &#8212; \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0430\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445 \u044f \u0445\u043e\u0442\u0435\u043b \u0441\u0430\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 (\u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP \u043f\u0430\u043a\u0435\u0442\u0430, \u0445\u043e\u0442\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0438 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e, \u0432\u0435\u0434\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043e\u0442\u0431\u0440\u043e\u0441\u044f\u0442\u0441\u044f \u0435\u0449\u0451 \u0432 eBPF), \u0430 \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 &#8212; \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u041f\u0440\u0430\u0432\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e DNS \u044f \u0432\u0441\u0451 \u0436\u0435 (\u043f\u043e\u043a\u0430 \u0447\u0442\u043e) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u0434\u0443\u043b\u044c &#8212; \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 DNS \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0443 IP\/TCP. \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c (<code>ctypes<\/code>) \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 C-\u0448\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\">def print_dns(cpu, data, size):     import ctypes as ct     class SkbEvent(ct.Structure):         _fields_ =  [             (\"ifindex\", ct.c_uint32),             (\"pid\", ct.c_uint32),             (\"tgid\", ct.c_uint32),             (\"uid\", ct.c_uint32),             (\"gid\", ct.c_uint32),             (\"comm\", ct.c_char * 64),             (\"raw\", ct.c_ubyte * (size - ct.sizeof(ct.c_uint32 * 5) - ct.sizeof(ct.c_char * 64)))         ]     # \u041f\u043e\u043b\u0443\u0447\u0430\u043c \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 'port_val', \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u0430\u043c \u043f\u0430\u043a\u0435\u0442 \u0432 \u043f\u043e\u043b\u0435 'raw':     sk = ct.cast(data, ct.POINTER(SkbEvent)).contents      # \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b:     NET_PROTO = {6: \"TCP\", 17: \"UDP\"}      # eBPF \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043d\u0438\u0442\u0435\u0439.     # \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043d\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e - \u043d\u0435\u0442.     # \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e \u0435\u0433\u043e PID'\u0443:     try:         with open(f'\/proc\/{sk.pid}\/comm', 'r') as proc_comm:             proc_name = proc_comm.read().rstrip()     except:         proc_name = sk.comm.decode()      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443:     ifname = if_indextoname(sk.ifindex)      # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 Ethernet-\u043a\u0430\u0434\u0440\u0430 - 14 \u0431\u0430\u0439\u0442:     ip_packet = bytes(sk.raw[14:])      # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP-\u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430 \u0438\u0437-\u0437\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e     # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.     # \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 20 \u0431\u0430\u0439\u0442:     (length, _, _, _, _, proto, _, saddr, daddr) = unpack('!BBHLBBHLL', ip_packet[:20])     # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 (0b00001111 = 15):     len_iph = length &amp; 15     # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0438\u0445 \u0432 \u0431\u0430\u0439\u0442\u044b:     len_iph = len_iph * 4     # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u0437 \u0447\u0438\u0441\u0435\u043b \u0432 IP, \u0441\u043e\u0431\u0438\u0440\u0430\u044f \u0435\u0433\u043e \u043f\u043e \u043e\u043a\u0442\u0435\u0442\u0430\u043c:     saddr = \".\".join(map(str, [saddr >> 24 &amp; 0xff, saddr >> 16 &amp; 0xff, saddr >> 8 &amp; 0xff, saddr &amp; 0xff]))     daddr = \".\".join(map(str, [daddr >> 24 &amp; 0xff, daddr >> 16 &amp; 0xff, daddr >> 8 &amp; 0xff, daddr &amp; 0xff]))      # \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f - UDP:     if proto == 17:         udp_packet = ip_packet[len_iph:]         (sport, dport) = unpack('!HH', udp_packet[:4])         # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 UDP-\u0434\u0430\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b - 8 \u0431\u0430\u0439\u0442:         dns_packet = udp_packet[8:]     # \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f - TCP:     elif proto == 6:         tcp_packet = ip_packet[len_iph:]         # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 TCP-\u043f\u0430\u043a\u0435\u0442\u0430 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438         # \u043e\u043f\u0446\u0438\u0439. \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 TCP \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e 13-\u0439         # \u0431\u0430\u0439\u0442 (\u0434\u043b\u0438\u043d\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430):         (sport, dport, _, length) = unpack('!HHQB', tcp_packet[:13])         # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 (4-\u0445 \u0431\u0438\u0442\u0430\u0445):         len_tcph = length >> 4         # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u0431\u0430\u0439\u0442\u044b:         len_tcph = len_tcph * 4         # \u0421\u0430\u043c\u0430\u044f \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c.         # \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0433\u0434\u0435 \u044f \u043e\u0448\u0438\u0431\u0441\u044f \u0438 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 2 \u0431\u0430\u0439\u0442\u0430,         # \u043d\u043e \u043e\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0442. \u043a. DNS-\u043f\u0430\u043a\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e:         dns_packet = tcp_packet[len_tcph + 2:]     # \u041f\u0440\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c:     else:         return      # \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 DNS-\u0434\u0430\u043d\u043d\u044b\u0445:     dns_data = dnslib.DNSRecord.parse(dns_packet)      # \u0422\u0438\u043f\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439:     DNS_QTYPE = {1: \"A\", 28: \"AAAA\"}      # \u0417\u0430\u043f\u0440\u043e\u0441:     if dns_data.header.qr == 0:         # \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e A (1) \u0438 AAAA (28) \u0437\u0430\u043f\u0438\u0441\u0438:         for q in dns_data.questions:             if q.qtype == 1 or q.qtype == 28:                 print(f'COMM={proc_name} PID={sk.pid} TGID={sk.tgid} DEV={ifname} PROTO={NET_PROTO[proto]} SRC={saddr} DST={daddr} SPT={sport} DPT={dport} UID={sk.uid} GID={sk.gid} DNS_QR=0 DNS_NAME={q.qname} DNS_TYPE={DNS_QTYPE[q.qtype]}')     # \u041e\u0442\u0432\u0435\u0442:     elif dns_data.header.qr == 1:         # \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e A (1) \u0438 AAAA (28) \u0437\u0430\u043f\u0438\u0441\u0438:         for rr in dns_data.rr:             if rr.rtype == 1 or rr.rtype == 28:                 print(f'COMM={proc_name} PID={sk.pid} TGID={sk.tgid} DEV={ifname} PROTO={NET_PROTO[proto]} SRC={saddr} DST={daddr} SPT={sport} DPT={dport} UID={sk.uid} GID={sk.gid} DNS_QR=1 DNS_NAME={rr.rname} DNS_TYPE={DNS_QTYPE[rr.rtype]} DNS_DATA={rr.rdata}')     else:         print('\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 DNS.')<\/code><\/pre>\n<h2>\u0424\u0438\u043d\u0430\u043b<\/h2>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441:<\/p>\n<pre><code class=\"bash\">$ dig @dns3.p08.nsone.net. api.github.com +tcp<\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<pre><code class=\"bash\">$ sudo python ~\/eBPF-habr.py \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 Ctrl-C \u0434\u043b\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f. COMM=dig PID=1030124 TGID=1030124 DEV=tap0 PROTO=UDP SRC=10.x.x.x DST=10.y.y.y SPT=52383 DPT=53 UID=1000 GID=1000 DNS_QR=0 DNS_NAME=dns3.p08.nsone.net. DNS_TYPE=A COMM=dig PID=1030124 TGID=1030124 DEV=tap0 PROTO=UDP SRC=10.x.x.x DST=10.y.y.y SPT=52383 DPT=53 UID=1000 GID=1000 DNS_QR=0 DNS_NAME=dns3.p08.nsone.net. DNS_TYPE=AAAA COMM=dig PID=1030124 TGID=1030124 DEV=tap0 PROTO=UDP SRC=10.y.y.y DST=10.x.x.x SPT=53 DPT=52383 UID=1000 GID=1000 DNS_QR=1 DNS_NAME=dns3.p08.nsone.net. DNS_TYPE=A DNS_DATA=198.51.44.72 COMM=dig PID=1030124 TGID=1030124 DEV=tap0 PROTO=UDP SRC=10.y.y.y DST=10.x.x.x SPT=53 DPT=52383 UID=1000 GID=1000 DNS_QR=1 DNS_NAME=dns3.p08.nsone.net. DNS_TYPE=AAAA DNS_DATA=2620:4d:4000:6259:7:8:0:3 COMM=dig PID=1030124 TGID=1030125 DEV=wlp1s0 PROTO=TCP SRC=192.x.x.x DST=198.51.44.72 SPT=38085 DPT=53 UID=1000 GID=1000 DNS_QR=0 DNS_NAME=api.github.com. DNS_TYPE=A COMM=dig PID=1030124 TGID=1030125 DEV=wlp1s0 PROTO=TCP SRC=198.51.44.72 DST=192.x.x.x SPT=53 DPT=38085 UID=1000 GID=1000 DNS_QR=1 DNS_NAME=api.github.com. DNS_TYPE=A DNS_DATA=140.82.121.6<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043c\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043c\u043e\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u0438, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u043d\u0430\u0447\u0430\u0442\u044c. \u041b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u044d\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445. \u041d\u0438\u0436\u0435 \u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435? \u041a\u043e\u043d\u0435\u0447\u043d\u043e! \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 IPv6. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 &#8212; \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP \u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0435\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c. \u042f \u043d\u0435 \u0437\u0440\u044f \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 Python&#8217;\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 &#8212; \u0432 C \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445 &#8212; \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 C, \u043e\u0442\u043a\u0430\u0437\u0430\u0432\u0448\u0438\u0441\u044c \u043e\u0442 Python&#8217;\u0430. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0447\u0435\u0442\u0432\u0451\u0440\u0442\u043e\u043c\u0443 \u043f\u0443\u043d\u043a\u0442\u0443 &#8212; \u0440\u0443\u0447\u043d\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 DNS-\u043f\u0430\u043a\u0435\u0442\u0430. \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0441\u0430\u043c\u044b\u0439 \u0437\u0430\u043c\u0430\u043d\u0447\u0438\u0432\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 &#8212; \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u0442\u044b, \u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043f\u043e\u0434 \u0444\u043e\u0440\u043c\u0430\u0442 DNS. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0437\u0430\u0441\u0435\u043a\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u0430\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  from bcc import BPF from socket import if_indextoname from struct import unpack   BPF_KPROBE_TEXT = \"\"\" #include &lt;net\/sock.h>  \/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0434\u043b\u044f \/\/ eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u044b 'proc_ports': struct port_key {     u8 proto;     u32 saddr;     u32 daddr;     u16 sport;     u16 dport; };  \/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 'proc_ports', \/\/ \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435: struct port_val {     u32 ifindex;     u32 pid;     u32 tgid;     u32 uid;     u32 gid;     char comm[64]; };  \/\/ \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c) eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \/\/ \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \/\/ \u0427\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0430 \u0441\u043e\u043a\u0435\u0442\u0435: BPF_TABLE_PUBLIC(\"hash\", struct port_key, struct port_val, proc_ports, 20480);   int trace_udp_sendmsg(struct pt_regs *ctx) {     struct sock *sk = (struct sock *)PT_REGS_PARM1(ctx);      u16 sport = sk->sk_num;     u16 dport = sk->sk_dport;        \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 53.     \/\/ 13568 = ntohs(53);     if (sport == 13568 || dport == 13568) {         \/\/ \u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435:         u32 saddr = sk->sk_rcv_saddr;         u32 daddr = sk->sk_daddr;         u64 pid_tgid = bpf_get_current_pid_tgid();         u64 uid_gid  = bpf_get_current_uid_gid();          \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u043a\u043b\u044e\u0447.         struct port_key key = {.proto = 17};         key.saddr = htonl(saddr);         key.daddr = htonl(daddr);         key.sport = sport;         key.dport = htons(dport);          \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0441\u043e\u043a\u0435\u0442\u0430:         struct port_val val = {};         val.pid = pid_tgid >> 32;         val.tgid = (u32)pid_tgid;         val.uid = (u32)uid_gid;         val.gid = uid_gid >> 32;         bpf_get_current_comm(val.comm, 64);          \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 eBPF:         proc_ports.update(&amp;key, &amp;val);     }     return 0; }  int trace_tcp_sendmsg(struct pt_regs *ctx, struct sock *sk) {     u16 sport = sk->sk_num;     u16 dport = sk->sk_dport;        \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 53.     \/\/ 13568 = ntohs(53);     if (sport == 13568 || dport == 13568) {         \/\/ \u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435:         u32 saddr = sk->sk_rcv_saddr;         u32 daddr = sk->sk_daddr;         u64 pid_tgid = bpf_get_current_pid_tgid();         u64 uid_gid  = bpf_get_current_uid_gid();          \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u043a\u043b\u044e\u0447.         struct port_key key = {.proto = 6};         key.saddr = htonl(saddr);         key.daddr = htonl(daddr);         key.sport = sport;         key.dport = htons(dport);          \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0441\u043e\u043a\u0435\u0442\u0430:         struct port_val val = {};         val.pid = pid_tgid >> 32;         val.tgid = (u32)pid_tgid;         val.uid = (u32)uid_gid;         val.gid = uid_gid >> 32;         bpf_get_current_comm(val.comm, 64);          \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 eBPF:         proc_ports.update(&amp;key, &amp;val);     }     return 0; } \"\"\"   BPF_SOCK_TEXT = r''' #include &lt;net\/sock.h> #include &lt;bcc\/proto.h>  \/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0434\u043b\u044f \/\/ eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u044b 'proc_ports': struct port_key {     u8 proto;     u32 saddr;     u32 daddr;     u16 sport;     u16 dport; };  \/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0435 'proc_ports', \/\/ \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435: struct port_val {     u32 ifindex;     u32 pid;     u32 tgid;     u32 uid;     u32 gid;     char comm[64]; };  \/\/ eBPF-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \/\/ \u041d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044f\u0434\u0440\u0430 udp_sendmsg()\/tcp_sendmsg(): BPF_TABLE(\"extern\", struct port_key, struct port_val, proc_ports, 20480);  \/\/ \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: BPF_PERF_OUTPUT(dns_events);   \/\/ \u0421\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043a\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0449\u0435\u043c DNS-\u043f\u0430\u043a\u0435\u0442\u044b \/\/ \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435: int dns_matching(struct __sk_buff *skb) {     u8 *cursor = 0;      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b IP:     struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));      if (ethernet->type == ETH_P_IP) {         struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));          u8 proto;         u16 sport;         u16 dport;          \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f:         if (ip->nextp == IPPROTO_UDP) {             struct udp_t *udp = cursor_advance(cursor, sizeof(*udp));              proto = 17;              \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0440\u0442\u0430\u0445:             sport = udp->sport;             dport = udp->dport;         } else if (ip->nextp == IPPROTO_TCP) {             struct tcp_t *tcp = cursor_advance(cursor, sizeof(*tcp));              \/\/ \u041d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u043f\u0430\u043a\u0435\u0442\u044b \u0433\u0434\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435:             if (!tcp->flag_psh) {                 return 0;             }              proto = 6;              \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0440\u0442\u0430\u0445:             sport = tcp->src_port;             dport = tcp->dst_port;         } else {             return 0;         }          \/\/ \u0415\u0441\u043b\u0438 \u044d\u0442\u043e DNS-\u0437\u0430\u043f\u0440\u043e\u0441:         if (dport == 53 || sport == 53) {             \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443-\u043a\u043b\u044e\u0447:             struct port_key key = {};             key.proto = proto;             if (skb->ingress_ifindex == 0) {                 key.saddr = ip->src;                 key.daddr = ip->dst;                 key.sport = sport;                 key.dport = dport;             } else {                 key.saddr = ip->dst;                 key.daddr = ip->src;                 key.sport = dport;                 key.dport = sport;             }              \/\/ \u041f\u043e \u043a\u043b\u044e\u0447\u0443 \u0438\u0449\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 eBPF:             struct port_val *p_val;             p_val = proc_ports.lookup(&amp;key);              \/\/ \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e - \u0437\u043d\u0430\u0447\u0438\u0442 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e             \/\/ \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043b\u0436\u0430\u0442\u044c \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430:             if (!p_val) {                 return 0;             }              \/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430:             p_val->ifindex = skb->ifindex;              \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441             \/\/ skb->len \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 \u0441\u043e\u043a\u0435\u0442:             dns_events.perf_submit_skb(skb, skb->len, p_val,                                        sizeof(struct port_val));             return 0;         } \/\/dport == 53 || sport == 53     } \/\/ethernet->type == ETH_P_IP      return 0; } '''   try:     import dnslib except ImportError:     print(\"\u041e\u0448\u0438\u0431\u043a\u0430: \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c Python dnslib.\")     print(\"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0435\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:\")     print(\"\\t$ pip3 install dnslib\")     print(\"   \u0438\u043b\u0438\")     print(\"\\t$ sudo apt-get install python3-dnslib\"           \"(\u043d\u0430 Ubuntu 18.04+)\")     exit(1)   def print_dns(cpu, data, size):     import ctypes as ct     class SkbEvent(ct.Structure):         _fields_ =  [             (\"ifindex\", ct.c_uint32),             (\"pid\", ct.c_uint32),             (\"tgid\", ct.c_uint32),             (\"uid\", ct.c_uint32),             (\"gid\", ct.c_uint32),             (\"comm\", ct.c_char * 64),             (\"raw\", ct.c_ubyte * (size - ct.sizeof(ct.c_uint32 * 5) - ct.sizeof(ct.c_char * 64)))         ]     # \u041f\u043e\u043b\u0443\u0447\u0430\u043c \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 'port_val', \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u0430\u043c \u043f\u0430\u043a\u0435\u0442 \u0432 \u043f\u043e\u043b\u0435 'raw':     sk = ct.cast(data, ct.POINTER(SkbEvent)).contents      # \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b:     NET_PROTO = {6: \"TCP\", 17: \"UDP\"}      # eBPF \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043d\u0438\u0442\u0435\u0439.     # \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043d\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e - \u043d\u0435\u0442.     # \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e \u0435\u0433\u043e PID'\u0443:     try:         with open(f'\/proc\/{sk.pid}\/comm', 'r') as proc_comm:             proc_name = proc_comm.read().rstrip()     except:         proc_name = sk.comm.decode()      # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443:     ifname = if_indextoname(sk.ifindex)      # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 Ethernet-\u043a\u0430\u0434\u0440\u0430 - 14 \u0431\u0430\u0439\u0442:     ip_packet = bytes(sk.raw[14:])      # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP-\u043f\u0430\u043a\u0435\u0442\u0430 \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430 \u0438\u0437-\u0437\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e     # \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.     # \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 20 \u0431\u0430\u0439\u0442:     (length, _, _, _, _, proto, _, saddr, daddr) = unpack('!BBHLBBHLL', ip_packet[:20])     # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 (0b00001111 = 15):     len_iph = length &amp; 15     # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u0431\u0430\u0439\u0442\u044b:     len_iph = len_iph * 4     # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u0437 \u0447\u0438\u0441\u0435\u043b \u0432 IP:     saddr = \".\".join(map(str, [saddr >> 24 &amp; 0xff, saddr >> 16 &amp; 0xff, saddr >> 8 &amp; 0xff, saddr &amp; 0xff]))     daddr = \".\".join(map(str, [daddr >> 24 &amp; 0xff, daddr >> 16 &amp; 0xff, daddr >> 8 &amp; 0xff, daddr &amp; 0xff]))      # \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f - UDP:     if proto == 17:         udp_packet = ip_packet[len_iph:]         (sport, dport) = unpack('!HH', udp_packet[:4])         # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 UDP-\u0434\u0430\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b - 8 \u0431\u0430\u0439\u0442:         dns_packet = udp_packet[8:]     # \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f - TCP:     elif proto == 6:         tcp_packet = ip_packet[len_iph:]         # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 TCP-\u043f\u0430\u043a\u0435\u0442\u0430 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0446\u0438\u0439.         # \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 TCP \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e 13-\u0439 \u0431\u0430\u0439\u0442         # (\u0434\u043b\u0438\u043d\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430):         (sport, dport, _, length) = unpack('!HHQB', tcp_packet[:13])         # \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 (4-\u0445 \u0431\u0438\u0442\u0430\u0445):         len_tcph = length >> 4         # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432\u0430\u0445, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u0431\u0430\u0439\u0442\u044b:         len_tcph = len_tcph * 4         # \u0421\u0430\u043c\u0430\u044f \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c.         # \u041d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0433\u0434\u0435 \u044f \u043e\u0448\u0438\u0431\u0441\u044f \u0438 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 2 \u0431\u0430\u0439\u0442\u0430,         # \u043d\u043e \u043e\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0442. \u043a. DNS-\u043f\u0430\u043a\u0435\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e:         dns_packet = tcp_packet[len_tcph + 2:]     # \u041f\u0440\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c:     else:         return      # \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 DNS-\u0434\u0430\u043d\u043d\u044b\u0445:     dns_data = dnslib.DNSRecord.parse(dns_packet)      # \u0422\u0438\u043f\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439:     DNS_QTYPE = {1: \"A\", 28: \"AAAA\"}      # \u0417\u0430\u043f\u0440\u043e\u0441:     if dns_data.header.qr == 0:         # \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e A (1) \u0438 AAAA (28) \u0437\u0430\u043f\u0438\u0441\u0438:         for q in dns_data.questions:             if q.qtype == 1 or q.qtype == 28:                 print(f'COMM={proc_name} PID={sk.pid} TGID={sk.tgid} DEV={ifname} PROTO={NET_PROTO[proto]} SRC={saddr} DST={daddr} SPT={sport} DPT={dport} UID={sk.uid} GID={sk.gid} DNS_QR=0 DNS_NAME={q.qname} DNS_TYPE={DNS_QTYPE[q.qtype]}')     # \u041e\u0442\u0432\u0435\u0442:     elif dns_data.header.qr == 1:         # \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e A (1) \u0438 AAAA (28) \u0437\u0430\u043f\u0438\u0441\u0438:         for rr in dns_data.rr:             if rr.rtype == 1 or rr.rtype == 28:                 print(f'COMM={proc_name} PID={sk.pid} TGID={sk.tgid} DEV={ifname} PROTO={NET_PROTO[proto]} SRC={saddr} DST={daddr} SPT={sport} DPT={dport} UID={sk.uid} GID={sk.gid} DNS_QR=1 DNS_NAME={rr.rname} DNS_TYPE={DNS_QTYPE[rr.rtype]} DNS_DATA={rr.rdata}')     else:         print('\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0442\u0438\u043f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 DNS.')  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f BPF: bpf_kprobe = BPF(text=BPF_KPROBE_TEXT) bpf_sock = BPF(text=BPF_SOCK_TEXT)  # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 UDP: bpf_kprobe.attach_kprobe(event=\"udp_sendmsg\", fn_name=\"trace_udp_sendmsg\")  # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 TCP: bpf_kprobe.attach_kprobe(event=\"tcp_sendmsg\", fn_name=\"trace_tcp_sendmsg\")  # \u0421\u043e\u043a\u0435\u0442: function_dns_matching = bpf_sock.load_func(\"dns_matching\", BPF.SOCKET_FILTER) BPF.attach_raw_socket(function_dns_matching, '')  print('\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 Ctrl-C \u0434\u043b\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f.')  bpf_sock[\"dns_events\"].open_perf_buffer(print_dns)  while True:     try:         bpf_sock.perf_buffer_poll()     except KeyboardInterrupt:         exit()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p> \u042f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0446\u0438\u043a\u043b \u043e\u0442 <a class=\"mention\" href=\"\/users\/aspsk\">@aspsk<\/a>. \u041d\u043e \u043a\u0440\u043e\u043c\u0435 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a:<\/p>\n<ul>\n<li>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0442\u043e\u0438\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e <a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/docs\/reference_guide.md#1-bpf_table\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/iovisor\/bcc\/blob\/master\/docs\/reference_guide.md<\/a> &#8212; \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a \u043f\u043e eBPF, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u043e\u0434\u0443\u043b\u044c Python&#8217;\u0430. \u041a\u0430\u0436\u0434\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043c\u0435\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/blogs.oracle.com\/linux\/post\/bpf-in-depth-bpf-helper-functions\" rel=\"noopener noreferrer nofollow\">https:\/\/blogs.oracle.com\/linux\/post\/bpf-in-depth-bpf-helper-functions<\/a> &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u0438 eBPF. \u0423\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043e\u043d\u0438 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/docs\/tutorial_bcc_python_developer.md\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/iovisor\/bcc\/blob\/master\/docs\/tutorial_bcc_python_developer.md<\/a> &#8212; \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043d\u0430 Python \u0441 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b \u043f\u0440\u043e \u0441\u0435\u0442\u044c \u043f\u043e\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/xdp-project\/xdp-tutorial\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/xdp-project\/xdp-tutorial<\/a> &#8212; \u0443\u0440\u043e\u043a\u0438 \u043f\u043e XDP, \u0440\u0430\u0437\u0431\u0438\u0442\u044b\u0435 \u043f\u043e \u0443\u0440\u043e\u0432\u043d\u044f\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0433\u043b\u0443\u0431\u0436\u0435.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/dev.to\/satrobit\/absolute-beginner-s-guide-to-bcc-xdp-and-ebpf-47oi\" rel=\"noopener noreferrer nofollow\">https:\/\/dev.to\/satrobit\/absolute-beginner-s-guide-to-bcc-xdp-and-ebpf-47oi<\/a> &#8212; XDP \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445. \u041d\u0435 \u0442\u0430\u043a \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u043e \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430, \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e, \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043b\u0435\u0433\u0447\u0435 \u0434\u043b\u044f \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>&#171;Linux Network Architecture&#187; &#8212; \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u044f\u0434\u0440\u0430 \u043f\u043e \u043a\u043d\u0438\u0433\u0435, \u0430 \u043d\u0435 \u043f\u043e \u0447\u0442\u0435\u043d\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0425\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 <a href=\"https:\/\/flylib.com\/books\/en\/3.475.1.128\/1\/\" rel=\"noopener noreferrer nofollow\">udp_sendmsg()<\/a> \u0438 <a href=\"https:\/\/flylib.com\/books\/en\/3.475.1.121\/1\/\" rel=\"noopener noreferrer nofollow\">tcp_sendmsg()<\/a>.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/683566\/\"> https:\/\/habr.com\/ru\/post\/683566\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c: \u0441\u0435\u0440\u0432\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0435\u0433\u0438\u0442\u0438\u043c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u043e IP, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0445 \u0441\u043b\u0430\u0442\u044c, \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b. \u0412 \u0436\u0443\u0440\u043d\u0430\u043b\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0442\u0430\u043a\u0438 \u0434\u0430, \u0438\u0434\u0443\u0442. \u041d\u043e \u043d\u0435 \u044f\u0441\u043d\u043e &#8212; \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u043b\u0435\u0433\u0438\u0442\u0438\u043c\u043d\u044b\u0435 \u0438\u043b\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0443\u0442\u0435\u043a\u0430\u0435\u0442 \u043a \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a\u0430\u043c? \u0411\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0449\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u0431\u044b\u043b \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0434\u043e\u043c\u0435\u043d \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435. \u0423\u0432\u044b, \u043d\u043e PTR \u043d\u0435 \u0432 \u043c\u043e\u0434\u0435, \u0430 securitytrails \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e, \u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 IP.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c tcpdump. \u041d\u043e \u043a\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440? \u0410 \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0434\u0438\u043d? \u0415\u0441\u0442\u044c <a href=\"https:\/\/www.elastic.co\/beats\/packetbeat\" rel=\"noopener noreferrer nofollow\">packetbeat<\/a>. \u042d\u0442\u043e \u0447\u0443\u0434\u043e\u0432\u0438\u0449\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0436\u0440\u0430\u043b\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445. \u0411\u0440\u0440\u2026 \u041d\u0435 \u0445\u043e\u0447\u0443 \u043e \u043d\u0451\u043c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c. <a href=\"https:\/\/osquery.io\" rel=\"noopener noreferrer nofollow\">Osquery<\/a> &#8212; \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u043e\u0433\u043e\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e &#8212; \u043e DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 <a href=\"https:\/\/github.com\/osquery\/osquery\/pull\/6254\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/a> \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u043e. <a href=\"https:\/\/github.com\/zeek\/zeek\" rel=\"noopener noreferrer nofollow\">Zeek<\/a> &#8212; \u043e \u043d\u0451\u043c \u044f \u0443\u0437\u043d\u0430\u043b \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c DNS-\u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041f\u043e\u0445\u043e\u0436\u0435 \u043e\u043d \u043d\u0435\u043f\u043b\u043e\u0445, \u043d\u043e \u043c\u0435\u043d\u044f \u0441\u043c\u0443\u0442\u0438\u043b\u043e \u0434\u0432\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0430: \u043e\u043d \u0441\u043b\u0435\u0434\u0438\u0442 <a href=\"https:\/\/docs.zeek.org\/en\/lts\/logs\/index.html\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e<\/a> \u0437\u0430 DNS, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043d\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d (\u0445\u043e\u0442\u044f, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b); \u0430 \u0435\u0449\u0451 \u043e\u043d \u043d\u0438\u0447\u0435\u0433\u043e <a href=\"https:\/\/docs.zeek.org\/en\/lts\/logs\/dns.html\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u0437\u043d\u0430\u0435\u0442<\/a> \u043e \u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u043b\u0430\u043b \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u044d\u0442\u043e \u0432\u0441\u0451? \u042f \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u044b\u0448\u0430\u043b \u043f\u0440\u043e eBPF\u2026<\/p>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e \u0442\u043e \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 eBPF. \u0422\u0435\u043e\u0440\u0438\u0438 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/493880\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/514736\/\" rel=\"noopener noreferrer nofollow\">\u0446\u0438\u043a\u043b<\/a> <a href=\"https:\/\/habr.com\/ru\/post\/529316\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u0435\u0439<\/a> (\u0441\u043f\u0430\u0441\u0438\u0431\u043e, <a class=\"mention\" href=\"\/users\/aspsk\">@aspsk<\/a>, \u0442\u0432\u043e\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435!). \u0427\u0435\u0433\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0431\u043e\u043b\u044c\u0448\u0435 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435) &#8212; \u0442\u0430\u043a \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430, \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u044f \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438. \u0410 \u0438\u043d\u043e\u0433\u0434\u0430 &#8212; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0445\u043e\u0434\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041a\u0430\u043a \u0438\u0442\u043e\u0433 &#8212; \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 eBPF \u0437\u0430\u0442\u0440\u0430\u0442\u044f\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u044f\u0442 \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 packetbeat?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0443\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0438 \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0431\u043e\u043b\u0435\u0432\u0448\u0438\u043c \ud83d\ude42 \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043a\u0430\u0437\u0430\u043d\u043e: \u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430, \u0442\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c, \u0430 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e &#8212; \u043c\u0435\u043d\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0426\u041f. \u041d\u0443 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u044f \u0435\u043c\u0443 \u043f\u0430\u043c\u044f\u0442\u044c. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 &#8212; \u0434\u0430, \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0442\u044c\u0441\u044f. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u2026 \u0442\u043e\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0441\u0442\u0430\u043b\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u0434\u043e\u043b\u0431\u0430\u043b\u0441\u044f \u0438 \u0441\u043d\u0451\u0441 packetbeat:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e<\/h2>\n<p>\u041f\u0438\u0441\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u043d\u0430 Python \u0438 \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e &#8212; \u043f\u043e\u0439\u043c\u0451\u043c \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 Python \u0438 eBPF. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0437\u044f\u0442\u044b\u0439 <a href=\"https:\/\/rdelfin.com\/blog\/post_ebpf_002\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u0436\u0430\u043b\u044c \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440 \u0442\u0430\u043a \u0438 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e). \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u0438 \u043f\u0430\u043a\u0435\u0442\u044b:<\/p>\n<pre><code>python3-bpfcc bpfcc-tools libbpfcc linux-headers-$(uname -r)<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0434\u043b\u044f Debian. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u043b\u0435\u0437\u0442\u044c \u0432 \u044f\u0434\u0440\u043e, \u0442\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0434 \u0432\u0430\u0448 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u043b\u044f \u0432\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 =). \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  from bcc import BPF  BPF_PROGRAM = r\"\"\" int hello(void *ctx) {   bpf_trace_printk(\"Hello world! clone() is calling\\n\");   return 0; } \"\"\"   bpf = BPF(text=BPF_PROGRAM) bpf.attach_kprobe(event=bpf.get_syscall_fnname(\"clone\"), fn_name=\"hello\")  while True:     try:         (_, _, _, _, _, msg_b) = bpf.trace_fields()         msg = msg_b.decode('utf8')         if 'Hello world' in msg:             print(msg)     except ValueError:         continue     except KeyboardInterrupt:         break<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u043c\u0438\u0440\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c, \u043e\u043d \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e, \u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442 \u043d\u0430\u0441 \u0441 \u0431\u0430\u0437\u043e\u0439. eBPF-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 \u044f\u0434\u0440\u0435. <code>attach_kprobe()<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u044f\u0434\u0440\u0430. \u041d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435 \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438, \u043a\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439? \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044f\u0434\u0440\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>get_syscall_fnname()<\/code>.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 eBPF &#8212; \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>bpf_trace_printk()<\/code>. \u041d\u043e \u044d\u0442\u043e &#8212; \u0432\u044b\u0432\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0412\u0441\u0451 \u0447\u0442\u043e \u0432\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u0442\u0435 \u0432 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#8212; \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b <code>\/sys\/kernel\/debug\/tracing\/trace_pipe<\/code>. \u0418 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b &#8212; \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>trace_fields()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0430\u043c\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043d\u0430\u043c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u0430 &#8212; \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e <code>Ctrl-C<\/code>, \u043c\u044b \u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u0438 \u0435\u0441\u043b\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f &#171;Hello world&#187; &#8212; \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0435\u0451 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<blockquote>\n<p><strong>NB<\/strong>: <code>bpf_trace_printk()<\/code> \u0443\u043c\u0435\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442, \u043f\u043e\u0434\u043e\u0431\u043d\u043e <code>printf()<\/code>, \u043d\u043e \u0441 \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 &#8212; \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d <code>%s<\/code>.<\/p>\n<\/blockquote>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u043e\u043d\u044f\u0432 \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 eBPF, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0447\u043d\u0451\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0432\u0435\u0442\u044b DNS \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0436\u0443\u0440\u043d\u0430\u043b \u043a\u0442\u043e \u0447\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b \u0438 \u043a\u0430\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b.<\/p>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 eBPF. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 &#8212; \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u0442\u0441\u044f \u043a \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0441\u043e\u043a\u0435\u0442\u0443. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u043a\u0435\u0442. \u041a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f &#8212; \u043f\u043e\u043a\u0430\u0436\u0443 \u043f\u043e\u0437\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 &#8212; \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e\u0439\u043c\u0430\u0442\u044c UDP \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 53. \u0418 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b. \u041d\u0430 C. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Ethernet. \u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 <code>cursor_advance<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c) \u043f\u043e \u043f\u0430\u043a\u0435\u0442\u0443, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f \u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u044f \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 (\u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 <a href=\"https:\/\/stackoverflow.com\/q\/60249948\/6696500\" rel=\"noopener noreferrer nofollow\">StackOverflow<\/a>):<\/p>\n<pre><code class=\"cpp\">#include &lt;linux\/if_ether.h> #include &lt;linux\/in.h> #include &lt;bcc\/proto.h>  int dns_matching(struct __sk_buff *skb) {     u8 *cursor = 0;      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b IP:     struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));      if (ethernet->type == ETH_P_IP) {         \u2026<\/code><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>ethernet_t<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 <a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/src\/cc\/export\/proto.h\" rel=\"noopener noreferrer nofollow\">proto.h<\/a>:<\/p>\n<pre><code class=\"cpp\">struct ethernet_t {   unsigned long long  dst:48;   unsigned long long  src:48;   unsigned int        type:16; }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442 Ethernet-\u043a\u0430\u0434\u0440\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Ethernet#%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D0%BA%D0%B0%D0%B4%D1%80%D0%B0\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0441\u0442\u043e\u0439<\/a> \u2013 \u044d\u0442\u043e 6 \u0431\u0430\u0439\u0442 (48 \u0431\u0438\u0442) \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 (16 \u0431\u0438\u0442) \u0442\u0438\u043f\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/p>\n<p>\u0422\u0438\u043f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439 <code>ETH_P_IP<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0432\u043d\u0430 <code>0x0800<\/code> \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>if_ether.h<\/code> &#8212; \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f IP (\u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043e\u043f\u0438\u0441\u0430\u043d \u0443 <a href=\"https:\/\/standards-oui.ieee.org\/ethertype\/eth.txt\" rel=\"noopener noreferrer nofollow\">IEEE<\/a>).<\/p>\n<p>\u0418\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0447\u0442\u043e \u0432 IP \u0432\u043b\u043e\u0436\u0435\u043d UDP \u0441 \u043f\u043e\u0440\u0442\u043e\u043c 53:<\/p>\n<pre><code class=\"cpp\">        \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b UDP:         struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));          if (ip->nextp == IPPROTO_UDP) {             \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0440\u0442 53:             struct udp_t *udp = cursor_advance(cursor, sizeof(*udp));              if (udp->dport == 53) {                 \/\/ \u0417\u0430\u043f\u0440\u043e\u0441                 return -1;             }              if (udp->sport == 53) {                 \/\/ \u041e\u0442\u0432\u0435\u0442                 return -1;             }         }<\/code><\/pre>\n<p><code>ip_t<\/code> \u0438 <code>udp_t<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432\u0441\u0451 \u0432 \u0442\u043e\u043c \u0436\u0435 <code>proto.h<\/code>. \u0410 \u0432\u043e\u0442 <code>IPPROTO_UDP<\/code> \u0443\u0436\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>in.h<\/code>. \u0412\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 IP \u0443\u0436\u0435 \u0447\u0443\u0442\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/IPv4#%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u043e\u0436\u043d\u0435\u0435<\/a> &#8212; \u0432 \u00a0\u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0434\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0411\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0434\u043b\u0438\u043d\u044b, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u043d\u043e \u043c\u044b \u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b\u0438 &#8212; \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0445\u043e\u0434\u0443 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c.<\/p>\n<p>DNS-\u043f\u0430\u043a\u0435\u0442 \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0438 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043b\u0435\u0433\u0447\u0435 &#8212; \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043f\u0430\u043a\u0435\u0442 \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 (\u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 <code>return -1<\/code> &#8212; \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 <code>0<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u043b \u0431\u044b \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e).<\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a Python. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445 \u0432\u0441\u0451 \u0436\u0435 \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0441\u043e\u043a\u0435\u0442:<\/p>\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  import dnslib import sys  from bcc import BPF  bpf = BPF(text=BPF_PROGRAM) function_dns_matching = bpf.load_func(\"dns_matching\", BPF.SOCKET_FILTER) BPF.attach_raw_socket(function_dns_matching, '')<\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u043a\u0435\u0442. \u041f\u0443\u0441\u0442\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0432 <code>attach_raw_socket<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 &#171;\u0432\u0441\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b&#187;. \u0415\u0441\u043b\u0438 \u0431\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 &#8212; \u0442\u0430\u043c \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0435\u0433\u043e \u0438\u043c\u044f.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043c \u0441\u043e\u043a\u0435\u0442 \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c:<\/p>\n<pre><code class=\"python\">import fcntl import os  socket_fd = function_dns_matching.sock fl = fcntl.fcntl(socket_fd, fcntl.F_GETFL) fcntl.fcntl(socket_fd, fcntl.F_SETFL, fl &amp; ~os.O_NONBLOCK)<\/code><\/pre>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u0430 &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u0432 \u043d\u0451\u043c \u0447\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u043e\u043a\u0435\u0442\u0430, \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0434\u043e\u0431\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043e DNS-\u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  import dnslib import fcntl import os import sys  from bcc import BPF   BPF_PROGRAM = r''' #include &lt;linux\/if_ether.h> #include &lt;linux\/in.h> #include &lt;bcc\/proto.h>  int dns_matching(struct __sk_buff *skb) {     u8 *cursor = 0;      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b IP:     struct ethernet_t *ethernet = cursor_advance(cursor, sizeof(*ethernet));      if (ethernet->type == ETH_P_IP) {         \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b UDP:         struct ip_t *ip = cursor_advance(cursor, sizeof(*ip));          if (ip->nextp == IPPROTO_UDP) {             \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u043e\u0440\u0442 53:             struct udp_t *udp = cursor_advance(cursor, sizeof(*udp));              if (udp->dport == 53 || udp->sport == 53) {                 return -1;             }         }     }     return 0; } '''   bpf = BPF(text=BPF_PROGRAM) function_dns_matching = bpf.load_func(\"dns_matching\", BPF.SOCKET_FILTER) BPF.attach_raw_socket(function_dns_matching, '')  socket_fd = function_dns_matching.sock fl = fcntl.fcntl(socket_fd, fcntl.F_GETFL) fcntl.fcntl(socket_fd, fcntl.F_SETFL, fl &amp; ~os.O_NONBLOCK)  while True:     try:         packet_str = os.read(socket_fd, 2048)     except KeyboardInterrupt:         sys.exit(0)      packet_bytearray = bytearray(packet_str)      ETH_HLEN = 14     UDP_HLEN = 8      # \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 IP     ip_header_length = packet_bytearray[ETH_HLEN]     ip_header_length = ip_header_length &amp; 0x0F     ip_header_length = ip_header_length &lt;&lt; 2      # \u041d\u0430\u0447\u0430\u043b\u043e DNS-\u043f\u0430\u043a\u0435\u0442\u0430     payload_offset = ETH_HLEN + ip_header_length + UDP_HLEN      payload = packet_bytearray[payload_offset:]      dnsrec = dnslib.DNSRecord.parse(payload)      # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0442:     if dnsrec.rr:         print(f'\u041e\u0422\u0412\u0415\u0422: {dnsrec.rr[0].rname} {dnslib.QTYPE.get(dnsrec.rr[0].rtype)} {\", \".join([repr(dnsrec.rr[i].rdata) for i in<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-337758","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/337758","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=337758"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/337758\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=337758"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=337758"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=337758"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}