{"id":478922,"date":"2026-05-07T11:12:00","date_gmt":"2026-05-07T11:12:00","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=478922"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=478922","title":{"rendered":"\u0427\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c: \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0420\u041a\u041d\/\u0422\u0421\u041f\u0423 \u043f\u043e \u0441\u043b\u043e\u044f\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430. Rkn Block Checker"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0430\u0439\u0442 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u00ab\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u00bb. \u042d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u043d \u0437\u043d\u0430\u0435\u0442. \u041d\u043e \u00ab\u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00bb &#8212; \u044d\u0442\u043e \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439. ISP \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b DNS-\u043e\u0442\u0432\u0435\u0442. \u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0440\u0435\u0436\u0435\u0442 TCP \u043f\u043e IP. \u0422\u0421\u041f\u0423 \u0447\u0438\u0442\u0430\u0435\u0442 SNI \u0432 TLS ClientHello \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u0421\u0430\u0439\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 200 OK \u0441 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u043e\u0439 \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u00bb. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0432\u043e\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 &#8212; \u0438, \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u0435\u0435, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u043e \u0442\u043e\u043c, <strong>\u0433\u0434\u0435<\/strong> \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0444\u0438\u043b\u044c\u0442\u0440.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0443, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0438 \u043f\u043e\u043a\u0430\u0436\u0443 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 CLI \u043d\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0445 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u0443 \u0442\u0435\u0431\u044f \u0441\u043b\u043e\u043c\u0430\u043d \u0441\u043b\u043e\u0439 N\u00bb. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 &#8212; \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435, \u043f\u043e\u0434 MIT, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>pip install rkn-block-checker<\/code>. \u041d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u043d\u0435 \u0441\u0430\u043c \u043e\u043d, \u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c.<\/p>\n<h3>\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c<\/h3>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0433\u043e\u0432\u043e\u0440\u044e, \u0447\u0435\u0433\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442. \u042d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e \u043e\u0431\u0445\u043e\u0434 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u041d\u0435 \u043f\u0440\u043e VPN, \u043d\u0435 \u043f\u0440\u043e fronting, \u043d\u0435 \u043f\u0440\u043e DPI-evasion \u0442\u0438\u043f\u0430 <a href=\"https:\/\/github.com\/bol-van\/zapret\" rel=\"noopener noreferrer nofollow\">zapret<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/github.com\/ValdikSS\/GoodbyeDPI\" rel=\"noopener noreferrer nofollow\">GoodbyeDPI<\/a>. \u042d\u0442\u043e \u043f\u0440\u043e <strong>\u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443<\/strong>: \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u044c.<\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u0430 \u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0451\u0448\u044c \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u00ab\u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443 \u043f\u044f\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439 \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 &#8212; \u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u044b\u0435. \u0423 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 DNS (\u043b\u0435\u0447\u0438\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u043e\u0439 DNS-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430), \u0443 \u0434\u0440\u0443\u0433\u043e\u0433\u043e DPI \u043d\u0430 SNI (DNS \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442, \u043d\u0443\u0436\u0435\u043d fronting \u0438\u043b\u0438 VPN), \u0443 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 ISP \u0432\u0435\u0440\u043d\u0443\u043b \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 HTTP (\u0437\u043d\u0430\u0447\u0438\u0442, \u0434\u043e \u0441\u0430\u0439\u0442\u0430 \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043e\u0445\u043e\u0434\u044f\u0442, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u044b\u0448\u0435). \u0411\u0435\u0437 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u00ab\u0433\u0434\u0435\u00bb &#8212; \u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0438 \u043d\u0435 \u0443\u0433\u0430\u0434\u0430\u0442\u044c.<\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 &#8212; <strong>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u0430<\/strong>. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u0442\u0435 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443 \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0437\u0430 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u0443\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b: \u0442\u043e\u043b\u044c\u043a\u043e DPI \u043d\u0430 SNI? \u041f\u043b\u044e\u0441 DNS-poisoning? \u0417\u0430\u0433\u043b\u0443\u0448\u043a\u0438? \u042d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u044b\u0431\u043e\u0440 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 (DoH \u0445\u0432\u0430\u0442\u0438\u0442 \u0438\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u0442\u0443\u043d\u043d\u0435\u043b\u044c).<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/ooni.org\/\" rel=\"noopener noreferrer nofollow\">OONI Probe<\/a> \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 &#8212; \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041d\u043e \u0434\u043b\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u00ab\u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043b\u043e\u043c\u0430\u043d\u043e\u00bb \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440: \u0442\u044f\u0436\u0451\u043b\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439, \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u044b\u0432\u043e\u0434. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0447\u0435\u0433\u043e-\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u043e\u0434\u0438\u043d <code>pip install<\/code>, \u0447\u0442\u043e \u0432\u044b\u0434\u0430\u0451\u0442 \u0432\u0435\u0440\u0434\u0438\u043a\u0442 \u0437\u0430 \u043f\u043e\u043b\u043c\u0438\u043d\u0443\u0442\u044b.<\/p>\n<h3>\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f, \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0441\u043b\u043e\u043c\u0430\u0442\u044c<\/h3>\n<p>HTTPS-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0430\u0439\u0442\u0443 &#8212; \u044d\u0442\u043e \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u044d\u0442\u0430\u043f\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u042f \u0431\u0443\u0434\u0443 \u0438\u0434\u0442\u0438 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445.<\/p>\n<h4>\u0421\u043b\u043e\u0439 1: DNS<\/h4>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u0438 \u0434\u0435\u0448\u0451\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u0439\u0442 &#8212; \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c DNS \u0441\u043e\u0432\u0440\u0430\u0442\u044c. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u0432\u043e\u0434\u0438\u0442\u0435 <code>protonvpn.com<\/code>, \u0432\u0430\u0448 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 DNS-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e &#8212; \u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u044b\u0434\u0430\u043b DHCP \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430) IP-\u0430\u0434\u0440\u0435\u0441. \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440 \u0432\u0440\u0451\u0442 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>0.0.0.0<\/code> \u0438\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 &#8212; \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u0442. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e DPI-\u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 DNS.<\/p>\n<p>\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c DNS-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043b\u0435\u0433\u043a\u043e, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441 \u0447\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c. \u0411\u0435\u0440\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430 (\u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442) \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 DNS-over-HTTPS &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>https:\/\/cloudflare-dns.com\/dns-query<\/code>. ISP \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c DoH-\u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e HTTPS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 Cloudflare. \u0415\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 DNS \u0441\u043a\u0430\u0437\u0430\u043b \u00ab\u043d\u0435 \u0437\u043d\u0430\u044e \u0442\u0430\u043a\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430\u00bb, \u0430 DoH \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u043b IP &#8212; \u044d\u0442\u043e \u0441\u043c\u043e\u043a\u0438\u043d\u0433 \u0433\u0430\u043d.<\/p>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import socketimport requestsdef resolve_system(host: str) -&gt; str | None:    try:        return socket.gethostbyname(host)    except socket.gaierror:        return Nonedef resolve_doh(host: str) -&gt; str | None:    r = requests.get(        \"https:\/\/cloudflare-dns.com\/dns-query\",        params={\"name\": host, \"type\": \"A\"},        headers={\"accept\": \"application\/dns-json\"},        timeout=5,    )    for ans in r.json().get(\"Answer\", []):        if ans.get(\"type\") == 1:  # A record            return ans.get(\"data\")    return None<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u0435\u0440\u0434\u0438\u043a\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 IP, DoH \u0432\u0435\u0440\u043d\u0443\u043b \u0442\u043e\u0442 \u0436\u0435 IP &#8212; DNS \u0447\u0438\u0441\u0442\u044b\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 IP, DoH \u0432\u0435\u0440\u043d\u0443\u043b <strong>\u0434\u0440\u0443\u0433\u043e\u0439<\/strong> IP &#8212; \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 manipulation, \u043d\u043e \u043d\u0435 \u0444\u0430\u043a\u0442 (\u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e CDN \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439);<\/p>\n<\/li>\n<li>\n<p>\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 <code>None<\/code>, DoH \u0432\u0435\u0440\u043d\u0443\u043b IP &#8212; <strong>DNS-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430<\/strong>, \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u043e\u0439 DNS \u043d\u0430 1.1.1.1 \u0438\u043b\u0438 8.8.8.8 (\u0438\u043b\u0438 DoH \u043d\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435);<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0438 <code>None<\/code> &#8212; \u0441\u0430\u0439\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0438\u0442 \u0438\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0443\u043b\u0435\u0432\u044b\u0445-\u0434\u0435\u0441\u044f\u0442\u044b\u0445 \u0433\u043e\u0434\u043e\u0432 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432. \u041d\u043e \u0432 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0433\u043e\u0440\u043e\u0434\u0430\u0445 \u0435\u0433\u043e \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0448\u044c &#8212; \u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435.<\/p>\n<h4>\u0421\u043b\u043e\u0439 2: TCP<\/h4>\n<p>\u0428\u0430\u0433 \u0441\u043b\u043e\u0436\u043d\u0435\u0435: \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e IP. ISP \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0430\u0442\u044c <code>RST<\/code> \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, \u0438\u0434\u0443\u0449\u0438\u0439 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u043b\u0447\u0430 \u0434\u0440\u043e\u043f\u0430\u0442\u044c. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u043e\u0432 &#8212; \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e ACL.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e: \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0440\u0442 443 (HTTPS) \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.<\/p>\n<pre><code class=\"python\">import socketimport timedef check_tcp(host: str, port: int = 443, timeout: float = 5.0):    start = time.monotonic()    try:        with socket.create_connection((host, port), timeout=timeout):            return True, (time.monotonic() - start) * 1000, None    except socket.timeout:        return False, None, \"timeout\"    except ConnectionResetError:        return False, None, \"connection reset\"    except OSError as e:        return False, None, f\"{type(e).__name__}: {e}\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0440\u0438 \u0438\u0441\u0445\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p><strong>\u0412\u0441\u0451 \u043e\u043a<\/strong>, TCP-handshake \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f &#8212; \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a TLS;<\/p>\n<\/li>\n<li>\n<p><strong>Connection reset<\/strong> \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 handshake &#8212; IP-\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0448\u043b\u0451\u0442 <code>RST<\/code>. \u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0434\u043a\u043e\u0441\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439 RST \u043f\u043e IP \u043d\u0435\u0443\u0434\u043e\u0431\u0435\u043d (CDN, \u043e\u0431\u0449\u0438\u0435 \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0438). \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043a \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u043c \u0446\u0435\u043b\u044f\u043c;<\/p>\n<\/li>\n<li>\n<p><strong>Timeout<\/strong> &#8212; \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u043e\u043b\u0447\u0430 \u0434\u0440\u043e\u043f\u0430\u044e\u0442\u0441\u044f. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u0430 \u043d\u0435 \u0434\u043b\u044f \u0446\u0435\u043b\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 2026 \u0433\u043e\u0434\u0443 \u0447\u0438\u0441\u0442\u044b\u0439 TCP-RST \u043f\u043e IP \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e &#8212; \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443. \u041d\u043e \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043d\u043e\u0434 Tor) \u044d\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e.<\/p>\n<h4>\u0421\u043b\u043e\u0439 3: TLS<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0422\u0421\u041f\u0423-\u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 <strong>\u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 TCP<\/strong>. \u041e\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 SYN, SYN-ACK, ACK &#8212; \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u0448\u043b\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 TLS-\u043f\u0430\u043a\u0435\u0442 (ClientHello), middlebox \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0433\u043e, \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u043b\u0435 SNI \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p>Server Name Indication &#8212; \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 TLS, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442 \u0432 <strong>\u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c<\/strong> \u0432\u0438\u0434\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0445\u043e\u0441\u0442\u0443 \u043e\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u0438\u043d IP \u043c\u043e\u0433 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0441\u0430\u0439\u0442\u043e\u0432: \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u0440\u0435\u0434\u044a\u044f\u0432\u0438\u0442\u044c. ClientHello \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 SNI \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438, \u043a\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043f\u0443\u0442\u0438.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 middlebox \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445: \u0448\u043b\u0451\u0442 <code>RST<\/code> \u043e\u0431\u0435\u0438\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0447\u0438\u0441\u0442\u043e (\u043f\u0438\u043d\u0433-\u043f\u043e\u043d\u0433 \u0443\u0441\u043f\u0435\u0448\u0435\u043d), \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 ClientHello, \u0438 \u0442\u0443\u0442 &#8212; \u043b\u0438\u0431\u043e <code>ConnectionResetError<\/code>, \u043b\u0438\u0431\u043e <code>socket.timeout<\/code>.<\/p>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c <strong>\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a DPI \u043d\u0430 SNI<\/strong>:<\/p>\n<pre><code>TCP_OK + TLS_FAILED  \u2192  \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0422\u0421\u041f\u0423<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0438\u043a\u0430\u043a\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0442\u0430\u043a \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442. \u0415\u0441\u043b\u0438 \u0431\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 DNS, \u043c\u044b \u0431\u044b \u043d\u0435 \u0434\u043e\u0448\u043b\u0438 \u0434\u043e TCP. \u0415\u0441\u043b\u0438 \u0431\u044b \u043f\u043e IP &#8212; TCP \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u0441\u044f \u0431\u044b. \u0410 \u0432\u043e\u0442 \u00ab\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c, \u043d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u0437\u0430\u043b \u043a\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u0432\u0441\u0451 \u0440\u0432\u0451\u0442\u0441\u044f\u00bb &#8212; \u044d\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u0440\u043e \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e SNI.<\/p>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:<\/p>\n<pre><code class=\"python\">import socketimport sslimport timedef check_tls(host: str, port: int = 443, timeout: float = 5.0):    ctx = ssl.create_default_context()    start = time.monotonic()    try:        with socket.create_connection((host, port), timeout=timeout) as sock:            with ctx.wrap_socket(sock, server_hostname=host) as ssock:                return True, (time.monotonic() - start) * 1000, None    except socket.timeout:        return False, None, \"timeout\"    except ssl.SSLError as e:        return False, None, f\"SSLError: {e.reason}\"    except ConnectionResetError:        return False, None, \"connection reset during TLS\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: <code>server_hostname=host<\/code> &#8212; \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 SNI. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e (\u0438\u043b\u0438 \u0441 \u043f\u043e\u0434\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u043c SNI) middlebox \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442. \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043e\u0431\u0445\u043e\u0434\u0430: domain fronting, ECH (Encrypted Client Hello), \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f ClientHello. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<p>\u0412 TLS 1.3 \u0431\u044b\u043b \u0448\u0430\u043d\u0441 \u0443\u0431\u0438\u0442\u044c SNI \u043a\u0430\u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442 &#8212; \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 ECH, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0448\u0438\u0444\u0440\u0443\u0435\u0442 ClientHello \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041d\u043e deployment \u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439, \u0438 middleboxes \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0430\u043c \u0444\u0430\u043a\u0442 ECH (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0432\u0438\u0434\u044f\u0442 ECH-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435). \u041f\u043e\u043a\u0430 \u0447\u0442\u043e SNI \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438.<\/p>\n<h4>\u0421\u043b\u043e\u0439 4: HTTP<\/h4>\n<p>\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u0441\u0451 &#8212; DNS, TCP, TLS &#8212; \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430. \u042d\u0442\u043e \u0434\u0432\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.<\/p>\n<p><strong>HTTP 451.<\/strong> \u041a\u043e\u0434 \u00abUnavailable For Legal Reasons\u00bb, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 RFC 7725 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041f\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0435 &#8212; \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043a\u0440\u044b\u0442 \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0441\u0443\u0434\u0430\u00bb. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f &#8212; \u044d\u0442\u043e \u044f\u0432\u043d\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440.<\/p>\n<p><strong>ISP stub-page.<\/strong> ISP \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 HTTPS, \u0432\u044b\u0434\u0430\u0451\u0442 <strong>\u0441\u0432\u043e\u0439<\/strong> \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 (\u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u0431\u044b \u043e\u0448\u0438\u0431\u043a\u0443 TLS, \u043d\u043e &#8212; \u043d\u0435\u0442, \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0435-HTTPS-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u043b\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e\u0442 DNS, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u0430 \u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440) \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432\u0440\u043e\u0434\u0435 \u00ab\u0414\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0420\u043e\u0441\u043a\u043e\u043c\u043d\u0430\u0434\u0437\u043e\u0440\u0430\u00bb \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c 200 OK. \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0451 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 &#8212; \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435 \u0442\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0434\u0435\u043b\u0430\u0442\u044c GET \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 URL \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0432 \u0442\u0435\u043b\u0435. \u0415\u0441\u043b\u0438 \u0442\u0430\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043a &#8212; \u0437\u043d\u0430\u0447\u0438\u0442, \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430.<\/p>\n<pre><code class=\"python\">STUB_MARKERS = (    \"\u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\",    \"\u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0440\u043e\u0441\u043a\u043e\u043c\u043d\u0430\u0434\u0437\u043e\u0440\u0430\",    \"\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0443\u0434\u0430\",    \"\u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\",    \"blocked by\",    \"rkn.gov.ru\",    \"\u0435\u0434\u0438\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440\",)def looks_like_stub(body: str) -&gt; bool:    body_lower = body.lower()    return any(marker in body_lower for marker in STUB_MARKERS)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c &#8212; \u043d\u0435 100%. \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0440\u0430\u0437\u0443 \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u00bb \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 false-positive \u044f \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0435 \u044f \u0431\u044b \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u0438\u043b \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<h3>\u041a\u0430\u043a \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0434\u0438\u043a\u0442<\/h3>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u00ab\u043e\u0431\u0445\u043e\u0434\u0430\u00bb \u043f\u043e \u0441\u043b\u043e\u044f\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u0430\u044f: \u0438\u0434\u0451\u043c \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u043e\u043c\u0430\u043d\u043d\u043e\u043c.<\/p>\n<pre><code>DNS resolve (system)   \u2193 okDNS resolve (DoH)   \u2193 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442TCP connect :443   \u2193 okTLS handshake (\u0441 SNI)   \u2193 okHTTP GET   \u2193 \u0441\u0442\u0430\u0442\u0443\u0441 200 + \u043d\u0435 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430= OK<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c, \u0432\u044b\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u0439 \u0432\u0435\u0440\u0434\u0438\u043a\u0442:<\/p>\n<ul>\n<li>\n<p>DNS \u0441\u0438\u0441\u0442\u0435\u043c\u0430 failed, DoH ok \u2192 <code>DNS_BLOCK<\/code><\/p>\n<\/li>\n<li>\n<p>TCP RST \u2192 <code>TCP_RESET<\/code><\/p>\n<\/li>\n<li>\n<p>TCP timeout \u2192 <code>TIMEOUT<\/code><\/p>\n<\/li>\n<li>\n<p>TCP ok, TLS RST\/timeout \u2192 <code>TLS_BLOCK<\/code> (\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a DPI)<\/p>\n<\/li>\n<li>\n<p>HTTP 451 \u0438\u043b\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0432 \u0442\u0435\u043b\u0435 \u2192 <code>HTTP_STUB<\/code><\/p>\n<\/li>\n<li>\n<p>\u0412\u0441\u0451 \u043e\u043a \u2192 <code>OK<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437 \u00ab\u043e\u0434\u0438\u043d \u0441\u0430\u0439\u0442 \u0441\u043b\u043e\u043c\u0430\u043d\u00bb \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u0435\u0440\u0434\u0438\u043a\u0442 \u00ab\u0432\u044b \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438\u00bb, \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u043f\u0430\u0447\u043a\u0443. \u042f \u0432\u0437\u044f\u043b \u0434\u0432\u0430 \u0441\u043f\u0438\u0441\u043a\u0430:<\/p>\n<ul>\n<li>\n<p><strong>Whitelist<\/strong> (\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0439) &#8212; \u0441\u0430\u0439\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f: gosuslugi, yandex, sberbank, vk, ozon, mos.ru, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f &#8212; \u0443 \u0432\u0430\u0441 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430, \u0443 \u0432\u0430\u0441 \u0441\u043b\u043e\u043c\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>Blacklist<\/strong> &#8212; \u0441\u0430\u0439\u0442\u044b, \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0420\u0424: Instagram, X (Twitter), LinkedIn, Discord, Tor Project, ProtonVPN, Patreon, rutracker \u0438 \u043f\u0440.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 whitelist \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 100%, \u0430 blacklist &#8212; \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u043d\u0430 70% \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432\u044b\u0434\u0430\u0451\u043c \u00ab\u0432\u044b \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u0438 \u0432\u043e\u0442 \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0430 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a\u00bb.<\/p>\n<h3>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u044b \u0438 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433 \u0432\u044b\u0432\u043e\u0434\u0430<\/h3>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f CLI \u0434\u0435\u043b\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e: 36 \u0441\u0430\u0439\u0442\u043e\u0432 \u00d7 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u0443 &#8212; \u043c\u0438\u043d\u0443\u0442\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 &#8212; \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0447\u0435\u0440\u0435\u0437 <code>ThreadPoolExecutor<\/code>:<\/p>\n<pre><code class=\"python\">from concurrent.futures import ThreadPoolExecutordef check_urls_parallel(urls, max_workers=10, timeout=5.0):    with ThreadPoolExecutor(max_workers=max_workers) as pool:        return list(pool.map(            lambda kv: check_url(kv[0], kv[1], timeout),            urls.items()        ))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0430\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 10 \u0440\u0430\u0437 &#8212; \u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. <code>pool.map()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 <strong>\u0432\u0441\u0435<\/strong> \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b. \u0422\u043e \u0435\u0441\u0442\u044c \u044e\u0437\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 CLI, \u0432\u0438\u0434\u0438\u0442 \u0448\u0430\u043f\u043a\u0443 \u00abRKN Block Checker\u00bb, \u0430 \u043f\u043e\u0442\u043e\u043c 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0442\u0438\u0448\u0438\u043d\u044b &#8212; \u0438 \u043f\u043e\u0442\u043e\u043c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u044f \u0441\u0442\u0435\u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. UX \u0442\u0430\u043a \u0441\u0435\u0431\u0435.<\/p>\n<p>\u041f\u043e\u0447\u0438\u043d\u0438\u043b\u043e\u0441\u044c \u043e\u0434\u043d\u0438\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441 <code>pool.map()<\/code> \u043d\u0430 <code>as_completed()<\/code> &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 yield-\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0440\u0430\u0437\u0443, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442:<\/p>\n<pre><code class=\"python\">from concurrent.futures import ThreadPoolExecutor, as_completedfrom typing import Iteratordef iter_check_urls(urls, max_workers=10, timeout=5.0) -&gt; Iterator[CheckResult]:    with ThreadPoolExecutor(max_workers=max_workers) as pool:        futures = [            pool.submit(check_url, name, url, timeout)            for name, url in urls.items()        ]        for fut in as_completed(futures):            yield fut.result()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 CLI \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u043b \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"python\">print_section(\"Whitelist (should always work)\")for r in iter_check_urls(WHITE_URLS, workers, timeout):    print_result(r)    sys.stdout.flush()  # \u0432\u0430\u0436\u043d\u043e - \u0438\u043d\u0430\u0447\u0435 \u043f\u0438\u0442\u043e\u043d \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0443\u0435\u0442 stdout<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u0438\u043d \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: <code>as_completed<\/code> \u043e\u0442\u0434\u0430\u0451\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438, \u043d\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u0445\u043e\u0434\u0430. \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e (\u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0441\u0432\u0435\u0440\u0445\u0443, \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 &#8212; \u0432\u043d\u0438\u0437\u0443), \u0430 \u0432\u043e\u0442 \u0434\u043b\u044f <code>--json<\/code> \u0440\u0435\u0436\u0438\u043c\u0430, \u0433\u0434\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0430\u0434\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 wrapper:<\/p>\n<pre><code class=\"python\">def check_urls_parallel(urls, max_workers=10, timeout=5.0) -&gt; list[CheckResult]:    name_order = list(urls.keys())    by_name = {r.name: r for r in iter_check_urls(urls, max_workers, timeout)}    return [by_name[name] for name in name_order if name in by_name]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u044c &#8212; \u043e\u0431\u0435 \u0433\u0440\u0443\u043f\u043f\u044b (whitelist \u0438 blacklist) \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432 <strong>\u043e\u0434\u043d\u043e\u043c<\/strong> \u043f\u0443\u043b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0441\u0440\u0430\u0437\u0443. \u041f\u043e\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f whitelist-\u0441\u0442\u0440\u043e\u043a\u0438, blacklist \u0443\u0436\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0444\u043e\u043d\u0435. \u041a\u043e\u0433\u0434\u0430 whitelist \u0434\u043e\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442\u0441\u044f, blacklist \u0443\u0436\u0435 \u043b\u0438\u0431\u043e \u0433\u043e\u0442\u043e\u0432, \u043b\u0438\u0431\u043e \u043f\u043e\u0447\u0442\u0438 \u0433\u043e\u0442\u043e\u0432 &#8212; \u0441\u0435\u043a\u0446\u0438\u044f blacklist \u043d\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0432\u044b\u0440\u043e\u0441\u043b\u043e, \u0430 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u043e\u0449\u0443\u0442\u0438\u043c\u043e \u0436\u0438\u0432\u0435\u0435.<\/p>\n<h3>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435<\/h3>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>======================================================================  RKN Block Checker======================================================================  IP:       95.165.xxx.xxx  ISP:      AS12389 Rostelecom  Location: Moscow, Moscow, RU----------------------------------------------------------------------Whitelist (should always work)  name          verdict            TCP     TLS     PLT  status  ------------------------------------------------------------  gosuslugi     \u2713 OK              18ms    42ms   380ms  200  yandex        \u2713 OK               8ms    25ms    95ms  200  sberbank      \u2713 OK              12ms    38ms   250ms  200  ...Blacklist (RKN-restricted)  name          verdict            TCP     TLS     PLT  status  ------------------------------------------------------------  instagram     \u2717 TLS BLOCK       22ms       -       -  -    \u2514 TLS reset - DPI cutting on SNI (typical RKN\/TSPU)  twitter\/x     \u2717 TLS BLOCK       24ms       -       -  -    \u2514 TLS timeout - silent drop after ClientHello  rutracker     \u2717 HTTP STUB       18ms    45ms   120ms  200    \u2514 response body matches an ISP stub-page marker  protonvpn     \u2717 DNS BLOCK          -       -       -  -    \u2514 system DNS doesn't resolve, DoH does - DNS poisoning======================================================================  Summary----------------------------------------------------------------------  Whitelist: 21\/21 working  Blacklist: 3\/15 open, 12\/15 blocked  \u2192 You ARE in an RKN-blocked zone.  Block types in the blacklist:    \u2717 TLS BLOCK: 8    \u2717 DNS BLOCK: 2    \u2717 HTTP STUB: 2======================================================================<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e: \u043a\u0430\u043a\u0438\u0435 \u0441\u0430\u0439\u0442\u044b, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0438\u043c\u0438 \u043d\u0435 \u0442\u0430\u043a, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0441\u043b\u043e\u0435 \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c. \u0414\u043b\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0438\u043d\u0433\u0430 \u0435\u0441\u0442\u044c <code>--json<\/code> &#8212; \u0432\u044b\u0434\u0430\u0451\u0442 \u0442\u0443 \u0436\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u043b\u044e\u0441 \u043f\u043e\u043b\u043d\u044b\u0439 probe trace \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0430\u0439\u0442 (\u043a\u0430\u043a\u0438\u0435 IP \u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u044b, \u043a\u0430\u043a\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u0440\u0438\u0448\u0451\u043b, \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438). \u0423\u0434\u043e\u0431\u043d\u043e \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0442\u044c \u0432 <code>jq<\/code>:<\/p>\n<pre><code class=\"bash\"># \u0438\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432rkn-check --json | jq -r '.blacklist[] | select(.verdict != \"OK\") | .name'# \u0442\u043e\u043b\u044c\u043a\u043e DPI-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 (TCP \u0436\u0438\u0432, TLS \u043c\u0435\u0440\u0442\u0432)rkn-check --json | jq '.blacklist[] | select(.verdict == \"TLS_BLOCK\" and .tcp_ok)'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0427\u0442\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043f\u0440\u043e\u0433\u043e\u0432\u043e\u0440\u044e \u044f\u0432\u043d\u043e.<\/p>\n<p><strong>IPv6.<\/strong> \u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 IPv6-\u0442\u0440\u0430\u0444\u0438\u043a \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0422\u0421\u041f\u0423 \u043c\u0435\u043d\u0435\u0435 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e &#8212; \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 v6 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u0442\u043e, \u0447\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 v4. \u042d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u044e\u0436\u0435\u0442, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0438 \u0432\u0435\u0440\u0434\u0438\u043a\u0442\u043e\u0432 (\u00abv4 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d, v6 \u043e\u0442\u043a\u0440\u044b\u0442\u00bb &#8212; \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442). \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p><strong>QUIC \u0438 HTTP\/3.<\/strong> \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0430\u0439\u0442\u044b \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 QUIC (UDP, \u043f\u043e\u0440\u0442 443). \u0422\u0421\u041f\u0423 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 QUIC \u043f\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c &#8212; \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043f\u043e\u043a\u0430 \u0447\u0430\u0449\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u043d\u0443\u044e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 UDP\/443 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0443\u0436\u0435\u0441\u0442\u043e\u0447\u0435\u043d\u0438\u0439, \u0447\u0435\u043c \u0447\u0435\u0440\u0435\u0437 DPI \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 QUIC \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430 \u0431\u044b \u0441\u0432\u043e\u0435\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e probe-\u0441\u0442\u0435\u043a\u0430.<\/p>\n<p><strong>\u0422\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430.<\/strong> \u041c\u043d\u043e\u0433\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u00ab\u0432\u0435\u0441\u044c \u0434\u043e\u043c\u0435\u043d\u00bb, \u0430 \u00ab\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 URL\u00bb \u0438\u043b\u0438 \u00ab\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 CDN\u00bb. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, YouTube \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e &#8212; \u0440\u0435\u0436\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 CDN-\u043f\u0440\u0435\u0444\u0438\u043a\u0441. \u042d\u0442\u0430 \u0442\u0443\u043b\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 &#8212; \u0435\u0441\u043b\u0438 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e OK.<\/p>\n<p><strong>TLS 1.3 ECH.<\/strong> \u041a\u043e\u0433\u0434\u0430 (\u0435\u0441\u043b\u0438) ECH \u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u043c, \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 <code>TLS_BLOCK = DPI on SNI<\/code> \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0439 &#8212; SNI \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d. \u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e ECH \u043c\u0430\u043b\u043e \u0433\u0434\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p><strong>\u041b\u043e\u043d\u0433\u0438\u0442\u0443\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433.<\/strong> \u041e\u0434\u0438\u043d \u043f\u0440\u043e\u0433\u043e\u043d &#8212; \u044d\u0442\u043e \u0441\u043d\u0438\u043c\u043e\u043a. \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u00ab\u043a\u043e\u0433\u0434\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c\/\u043f\u0440\u043e\u043f\u0430\u043b\u0430\u00bb, \u043d\u0443\u0436\u043d\u043e \u0433\u043e\u043d\u044f\u0442\u044c <code>rkn-check --json<\/code> \u043f\u043e cron \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432 timeseries. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 docker-compose \u0441 Grafana, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<h3>\u0413\u0434\u0435 \u0432\u0437\u044f\u0442\u044c \u0438 \u0447\u0442\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c<\/h3>\n<p>GitHub: <a href=\"https:\/\/github.com\/MayersScott\/rkn-block-checker\" rel=\"noopener noreferrer nofollow\">github.com\/MayersScott\/rkn-block-checker<\/a> PyPI: <code>pip install rkn-block-checker<\/code>, \u043f\u043e\u0442\u043e\u043c <code>rkn-check<\/code>.<\/p>\n<p>\u041f\u043e \u0442\u0435\u043c\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438 DPI \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/gfw.report\/\" rel=\"noopener noreferrer nofollow\">GFW Report<\/a> &#8212; \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0443\u0441\u0441\u043a\u043e- \u0438 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e DPI-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a (\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u041a\u0438\u0442\u0430\u044f, \u043d\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b);<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/ooni.org\/\" rel=\"noopener noreferrer nofollow\">OONI<\/a> &#8212; academic-grade \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0446\u0435\u043d\u0437\u0443\u0440\u044b \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/bol-van\/zapret\" rel=\"noopener noreferrer nofollow\">bol-van\/zapret<\/a> \u0438 \u0435\u0433\u043e Wiki &#8212; \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u043e \u0442\u043e, <strong>\u043a\u0430\u043a<\/strong> \u0438\u043c\u0435\u043d\u043d\u043e \u0422\u0421\u041f\u0423 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u0442 SNI \u0438 \u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 evasion \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435 &#8212; \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u0435\u0440\u0434\u0438\u043a\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e: false positives \u0438\u043b\u0438, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043b\u043e\u0436\u043d\u043e-\u0437\u0435\u043b\u0451\u043d\u044b\u0435 \u0441\u0430\u0439\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1032572\/\">https:\/\/habr.com\/ru\/articles\/1032572\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u0441\u0430\u0439\u0442 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u00ab\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u00bb. \u042d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u043d \u0437\u043d\u0430\u0435\u0442. \u041d\u043e \u00ab\u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00bb &#8212; \u044d\u0442\u043e \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0439. ISP \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b DNS-\u043e\u0442\u0432\u0435\u0442. \u041f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0440\u0435\u0436\u0435\u0442 TCP \u043f\u043e IP. \u0422\u0421\u041f\u0423 \u0447\u0438\u0442\u0430\u0435\u0442 SNI \u0432 TLS ClientHello \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u0421\u0430\u0439\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 200 OK \u0441 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u043e\u0439 \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u00bb. \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0432\u043e\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 &#8212; \u0438, \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u0435\u0435, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u043e \u0442\u043e\u043c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0444\u0438\u043b\u044c\u0442\u0440.\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0443, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u0438 \u043f\u043e\u043a\u0430\u0436\u0443 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 CLI \u043d\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0445 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u0443 \u0442\u0435\u0431\u044f \u0441\u043b\u043e\u043c\u0430\u043d \u0441\u043b\u043e\u0439 N\u00bb. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 &#8212; \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435, \u043f\u043e\u0434 MIT, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 pip install rkn-block-checker. \u041d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u043d\u0435 \u0441\u0430\u043c \u043e\u043d, \u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c.\u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c\u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0433\u043e\u0432\u043e\u0440\u044e, \u0447\u0435\u0433\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442. \u042d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e \u043e\u0431\u0445\u043e\u0434 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a. \u041d\u0435 \u043f\u0440\u043e VPN, \u043d\u0435 \u043f\u0440\u043e fronting, \u043d\u0435 \u043f\u0440\u043e DPI-evasion \u0442\u0438\u043f\u0430 zapret \u0438\u043b\u0438 GoodbyeDPI. \u042d\u0442\u043e \u043f\u0440\u043e \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443: \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u044c.\u041f\u043e\u043b\u044c\u0437\u0430 \u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0451\u0448\u044c \u0432 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u00ab\u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443 \u043f\u044f\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439 \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 &#8212; \u0438 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u044b\u0435. \u0423 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 DNS (\u043b\u0435\u0447\u0438\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u043e\u0439 DNS-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430), \u0443 \u0434\u0440\u0443\u0433\u043e\u0433\u043e DPI \u043d\u0430 SNI (DNS \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442, \u043d\u0443\u0436\u0435\u043d fronting \u0438\u043b\u0438 VPN), \u0443 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 ISP \u0432\u0435\u0440\u043d\u0443\u043b \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 HTTP (\u0437\u043d\u0430\u0447\u0438\u0442, \u0434\u043e \u0441\u0430\u0439\u0442\u0430 \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043e\u0445\u043e\u0434\u044f\u0442, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u044b\u0448\u0435). \u0411\u0435\u0437 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u00ab\u0433\u0434\u0435\u00bb &#8212; \u0442\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0438 \u043d\u0435 \u0443\u0433\u0430\u0434\u0430\u0442\u044c.\u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u0430. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u0442\u0435 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0443 \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c, \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0437\u0430 30 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u0443\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b: \u0442\u043e\u043b\u044c\u043a\u043e DPI \u043d\u0430 SNI? \u041f\u043b\u044e\u0441 DNS-poisoning? \u0417\u0430\u0433\u043b\u0443\u0448\u043a\u0438? \u042d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u044b\u0431\u043e\u0440 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 (DoH \u0445\u0432\u0430\u0442\u0438\u0442 \u0438\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u0442\u0443\u043d\u043d\u0435\u043b\u044c).\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0432\u0440\u043e\u0434\u0435 OONI Probe \u0434\u0435\u043b\u0430\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 &#8212; \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041d\u043e \u0434\u043b\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u00ab\u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043b\u043e\u043c\u0430\u043d\u043e\u00bb \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440: \u0442\u044f\u0436\u0451\u043b\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439, \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u044b\u0432\u043e\u0434. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0447\u0435\u0433\u043e-\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 \u043e\u0434\u0438\u043d pip install, \u0447\u0442\u043e \u0432\u044b\u0434\u0430\u0451\u0442 \u0432\u0435\u0440\u0434\u0438\u043a\u0442 \u0437\u0430 \u043f\u043e\u043b\u043c\u0438\u043d\u0443\u0442\u044b.\u0427\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u044f, \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0441\u043b\u043e\u043c\u0430\u0442\u044cHTTPS-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0441\u0430\u0439\u0442\u0443 &#8212; \u044d\u0442\u043e \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u044d\u0442\u0430\u043f\u0430, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0442\u0430\u043a\u043e\u0432\u0430\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u042f \u0431\u0443\u0434\u0443 \u0438\u0434\u0442\u0438 \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445.\u0421\u043b\u043e\u0439 1: DNS\u0421\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u0438 \u0434\u0435\u0448\u0451\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u0439\u0442 &#8212; \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c DNS \u0441\u043e\u0432\u0440\u0430\u0442\u044c. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u0432\u043e\u0434\u0438\u0442\u0435 protonvpn.com, \u0432\u0430\u0448 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 DNS-\u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e &#8212; \u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u044b\u0434\u0430\u043b DHCP \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430) IP-\u0430\u0434\u0440\u0435\u0441. \u0415\u0441\u043b\u0438 \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440 \u0432\u0440\u0451\u0442 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0.0.0.0 \u0438\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 &#8212; \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u0442. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e DPI-\u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 DNS.\u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0442\u044c DNS-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443 \u043b\u0435\u0433\u043a\u043e, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0441 \u0447\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c. \u0411\u0435\u0440\u0451\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u043e\u043b\u0432\u0435\u0440\u0430 (\u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442) \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 DNS-over-HTTPS &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, https:\/\/cloudflare-dns.com\/dns-query. ISP \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c DoH-\u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e HTTPS-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 Cloudflare. \u0415\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 DNS \u0441\u043a\u0430\u0437\u0430\u043b \u00ab\u043d\u0435 \u0437\u043d\u0430\u044e \u0442\u0430\u043a\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430\u00bb, \u0430 DoH \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u043b IP &#8212; \u044d\u0442\u043e \u0441\u043c\u043e\u043a\u0438\u043d\u0433 \u0433\u0430\u043d.\u0412 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:import socketimport requestsdef resolve_system(host: str) -&gt; str | None:    try:        return socket.gethostbyname(host)    except socket.gaierror:        return Nonedef resolve_doh(host: str) -&gt; str | None:    r = requests.get(        &#171;https:\/\/cloudflare-dns.com\/dns-query&#187;,        params={&#171;name&#187;: host, &#171;type&#187;: &#171;A&#187;},        headers={&#171;accept&#187;: &#171;application\/dns-json&#187;},        timeout=5,    )    for ans in r.json().get(&#171;Answer&#187;, []):        if ans.get(&#171;type&#187;) == 1:  # A record            return ans.get(&#171;data&#187;)    return None\u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u0435\u0440\u0434\u0438\u043a\u0442\u0430:\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 IP, DoH \u0432\u0435\u0440\u043d\u0443\u043b \u0442\u043e\u0442 \u0436\u0435 IP &#8212; DNS \u0447\u0438\u0441\u0442\u044b\u0439;\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 IP, DoH \u0432\u0435\u0440\u043d\u0443\u043b \u0434\u0440\u0443\u0433\u043e\u0439 IP &#8212; \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 manipulation, \u043d\u043e \u043d\u0435 \u0444\u0430\u043a\u0442 (\u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e CDN \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0433\u0435\u043e\u043b\u043e\u043a\u0430\u0446\u0438\u0435\u0439);\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 None, DoH \u0432\u0435\u0440\u043d\u0443\u043b IP &#8212; DNS-\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430, \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u0441\u043c\u0435\u043d\u043e\u0439 DNS \u043d\u0430 1.1.1.1 \u0438\u043b\u0438 8.8.8.8 (\u0438\u043b\u0438 DoH \u043d\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u0435);\u043e\u0431\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0438 None &#8212; \u0441\u0430\u0439\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0438\u0442 \u0438\u043b\u0438 \u0435\u0433\u043e \u043d\u0435\u0442.\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0430\u0440\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0443\u043b\u0435\u0432\u044b\u0445-\u0434\u0435\u0441\u044f\u0442\u044b\u0445 \u0433\u043e\u0434\u043e\u0432 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432. \u041d\u043e \u0432 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0433\u043e\u0440\u043e\u0434\u0430\u0445 \u0435\u0433\u043e \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0448\u044c &#8212; \u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435.\u0421\u043b\u043e\u0439 2: TCP\u0428\u0430\u0433 \u0441\u043b\u043e\u0436\u043d\u0435\u0435: \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e IP. ISP \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0430\u0442\u044c RST \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043f\u0430\u043a\u0435\u0442, \u0438\u0434\u0443\u0449\u0438\u0439 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u043b\u0447\u0430 \u0434\u0440\u043e\u043f\u0430\u0442\u044c. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u043e\u0432 &#8212; \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e ACL.\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e: \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0440\u0442 443 (HTTPS) \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.import socketimport timedef check_tcp(host: str, port: int = 443, timeout: float = 5.0):    start = time.monotonic()    try:        with socket.create_connection((host, port), timeout=timeout):            return True, (time.monotonic() &#8212; start) * 1000, None    except socket.timeout:        return False, None, &#171;timeout&#187;    except ConnectionResetError:        return False, None, &#171;connection reset&#187;    except OSError as e:        return False, None, f&#187;{type(e).__name__}: {e}&#187;\u0422\u0440\u0438 \u0438\u0441\u0445\u043e\u0434\u0430:\u0412\u0441\u0451 \u043e\u043a, TCP-handshake \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f &#8212; \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a TLS;Connection reset \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 handshake &#8212; IP-\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430, \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0448\u043b\u0451\u0442 RST. \u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0435\u0434\u043a\u043e\u0441\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439 RST \u043f\u043e IP \u043d\u0435\u0443\u0434\u043e\u0431\u0435\u043d (CDN, \u043e\u0431\u0449\u0438\u0435 \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0438). \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043a \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u043c \u0446\u0435\u043b\u044f\u043c;Timeout &#8212; \u043f\u0430\u043a\u0435\u0442\u044b \u043c\u043e\u043b\u0447\u0430 \u0434\u0440\u043e\u043f\u0430\u044e\u0442\u0441\u044f. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u0430 \u043d\u0435 \u0434\u043b\u044f \u0446\u0435\u043b\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432.\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 2026 \u0433\u043e\u0434\u0443 \u0447\u0438\u0441\u0442\u044b\u0439 TCP-RST \u043f\u043e IP \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e &#8212; \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430\u043c \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443. \u041d\u043e \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043d\u043e\u0434 Tor) \u044d\u0442\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e.\u0421\u043b\u043e\u0439 3: TLS\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0422\u0421\u041f\u0423-\u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 TCP. \u041e\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 SYN, SYN-ACK, ACK &#8212; \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u0448\u043b\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 TLS-\u043f\u0430\u043a\u0435\u0442 (ClientHello), middlebox \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0433\u043e, \u0447\u0438\u0442\u0430\u0435\u0442 \u043f\u043e\u043b\u0435 SNI \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.Server Name Indication &#8212; \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 TLS, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0445\u043e\u0441\u0442\u0443 \u043e\u043d \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u0438\u043d IP \u043c\u043e\u0433 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0441\u0430\u0439\u0442\u043e\u0432: \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u0440\u0435\u0434\u044a\u044f\u0432\u0438\u0442\u044c. ClientHello \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 SNI \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438, \u043a\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043f\u0443\u0442\u0438.\u0414\u0430\u043b\u044c\u0448\u0435 middlebox \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445: \u0448\u043b\u0451\u0442 RST \u043e\u0431\u0435\u0438\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c, \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0447\u0438\u0441\u0442\u043e (\u043f\u0438\u043d\u0433-\u043f\u043e\u043d\u0433 \u0443\u0441\u043f\u0435\u0448\u0435\u043d), \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 ClientHello, \u0438 \u0442\u0443\u0442 &#8212; \u043b\u0438\u0431\u043e ConnectionResetError, \u043b\u0438\u0431\u043e socket.timeout.\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a DPI \u043d\u0430 SNI:TCP_OK + TLS_FAILED  \u2192  \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0422\u0421\u041f\u0423\u041d\u0438\u043a\u0430\u043a\u0430\u044f \u0434\u0440\u0443\u0433\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0442\u0430\u043a \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442. \u0415\u0441\u043b\u0438 \u0431\u044b \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 DNS, \u043c\u044b \u0431\u044b \u043d\u0435 \u0434\u043e\u0448\u043b\u0438 \u0434\u043e TCP. \u0415\u0441\u043b\u0438 \u0431\u044b \u043f\u043e IP &#8212; TCP \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u0441\u044f \u0431\u044b. \u0410 \u0432\u043e\u0442 \u00ab\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c, \u043d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0430\u0437\u0430\u043b \u043a\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u0432\u0441\u0451 \u0440\u0432\u0451\u0442\u0441\u044f\u00bb &#8212; \u044d\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u043f\u0440\u043e \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u044e SNI.\u041a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:import socketimport sslimport timedef check_tls(host: str, port: int = 443, timeout: float = 5.0):    ctx = ssl.create_default_context()    start = time.monotonic()    try:        with socket.create_connection((host, port), timeout=timeout) as sock:            with ctx.wrap_socket(sock, server_hostname=host) as ssock:                return True, (time.monotonic() &#8212; start) * 1000, None    except socket.timeout:        return False, None, &#171;timeout&#187;    except ssl.SSLError as e:        return False, None, f&#187;SSLError: {e.reason}&#187;    except ConnectionResetError:        return False, None, &#171;connection reset during TLS&#187;\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: server_hostname=host &#8212; \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 SNI. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e (\u0438\u043b\u0438 \u0441 \u043f\u043e\u0434\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u043c SNI) middlebox \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442. \u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u043e\u0431\u0445\u043e\u0434\u0430: domain fronting, ECH (Encrypted Client Hello), \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f ClientHello. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043f\u0440\u043e \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e.\u0412 TLS 1.3 \u0431\u044b\u043b \u0448\u0430\u043d\u0441 \u0443\u0431\u0438\u0442\u044c SNI \u043a\u0430\u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442 &#8212; \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 ECH, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0448\u0438\u0444\u0440\u0443\u0435\u0442 ClientHello \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041d\u043e deployment \u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439, \u0438 middleboxes \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u0430\u043c \u0444\u0430\u043a\u0442 ECH (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0432\u0438\u0434\u044f\u0442 ECH-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435). \u041f\u043e\u043a\u0430 \u0447\u0442\u043e SNI \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0438\u043d\u0441\u043f\u0435\u043a\u0446\u0438\u0438.\u0421\u043b\u043e\u0439 4: HTTP\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u0441\u0451 &#8212; DNS, TCP, TLS &#8212; \u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430. \u042d\u0442\u043e \u0434\u0432\u0430 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f.HTTP 451. \u041a\u043e\u0434 \u00abUnavailable For Legal Reasons\u00bb, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 RFC 7725 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041f\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0435 &#8212; \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043a\u0440\u044b\u0442 \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0441\u0443\u0434\u0430\u00bb. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0441\u044f &#8212; \u044d\u0442\u043e \u044f\u0432\u043d\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440.ISP stub-page. ISP \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 HTTPS, \u0432\u044b\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 (\u0447\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u0431\u044b \u043e\u0448\u0438\u0431\u043a\u0443 TLS, \u043d\u043e &#8212; \u043d\u0435\u0442, \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0435-HTTPS-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u043b\u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u044e\u0442 DNS, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u0430 \u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440) \u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432\u0440\u043e\u0434\u0435 \u00ab\u0414\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0420\u043e\u0441\u043a\u043e\u043c\u043d\u0430\u0434\u0437\u043e\u0440\u0430\u00bb \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c 200 OK. \u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0435\u0451 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 &#8212; \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435 \u0442\u043e.\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0434\u0435\u043b\u0430\u0442\u044c GET \u043d\u0430 \u043d\u0443\u0436\u043d\u044b\u0439 URL \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0432 \u0442\u0435\u043b\u0435. \u0415\u0441\u043b\u0438 \u0442\u0430\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043a &#8212; \u0437\u043d\u0430\u0447\u0438\u0442, \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430.STUB_MARKERS = (    &#171;\u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d&#187;,    &#171;\u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0440\u043e\u0441\u043a\u043e\u043c\u043d\u0430\u0434\u0437\u043e\u0440\u0430&#187;,    &#171;\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0443\u0434\u0430&#187;,    &#171;\u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d&#187;,    &#171;blocked by&#187;,    &#171;rkn.gov.ru&#187;,    &#171;\u0435\u0434\u0438\u043d\u044b\u0439 \u0440\u0435\u0435\u0441\u0442\u0440&#187;,)def looks_like_stub(body: str) -&gt; bool:    body_lower = body.lower()    return any(marker in body_lower for marker in STUB_MARKERS)\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c &#8212; \u043d\u0435 100%. \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0440\u0430\u0437\u0443 \u00ab\u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u00bb \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 false-positive \u044f \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0442\u0430\u043a\u043e\u0439 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0435 \u044f \u0431\u044b \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u0438\u043b \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.\u041a\u0430\u043a \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0434\u0438\u043a\u0442\u041b\u043e\u0433\u0438\u043a\u0430 \u00ab\u043e\u0431\u0445\u043e\u0434\u0430\u00bb \u043f\u043e \u0441\u043b\u043e\u044f\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u0430\u044f: \u0438\u0434\u0451\u043c \u0441\u043d\u0438\u0437\u0443 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u043e\u043c\u0430\u043d\u043d\u043e\u043c.DNS resolve (system)   \u2193 okDNS resolve (DoH)   \u2193 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442TCP connect :443   \u2193 okTLS handshake (\u0441 SNI)   \u2193 okHTTP GET   \u2193 \u0441\u0442\u0430\u0442\u0443\u0441 200 + \u043d\u0435 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430= OK\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0441\u043b\u043e\u043c\u0430\u043b\u043e\u0441\u044c, \u0432\u044b\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u0439 \u0432\u0435\u0440\u0434\u0438\u043a\u0442:DNS \u0441\u0438\u0441\u0442\u0435\u043c\u0430 failed, DoH ok \u2192 DNS_BLOCKTCP RST \u2192 TCP_RESETTCP timeout \u2192 TIMEOUTTCP ok, TLS RST\/timeout \u2192 TLS_BLOCK (\u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a DPI)HTTP 451 \u0438\u043b\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0432 \u0442\u0435\u043b\u0435 \u2192 HTTP_STUB\u0412\u0441\u0451 \u043e\u043a \u2192 OK\u0427\u0442\u043e\u0431\u044b \u0438\u0437 \u00ab\u043e\u0434\u0438\u043d \u0441\u0430\u0439\u0442 \u0441\u043b\u043e\u043c\u0430\u043d\u00bb \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0432\u0435\u0440\u0434\u0438\u043a\u0442 \u00ab\u0432\u044b \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438\u00bb, \u043d\u0443\u0436\u043d\u043e&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-478922","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478922","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=478922"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478922\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=478922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=478922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=478922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}