{"id":354954,"date":"2024-05-20T22:58:41","date_gmt":"2024-05-20T22:58:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=354954"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=354954","title":{"rendered":"<span>P2P-\u0444\u043e\u0440\u0443\u043c \u0441 \u043d\u0443\u043b\u044f | \u043e\u0442 NAT hole punching \u0434\u043e \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0439 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/761188\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/go\/c6\/fb\/goc6fbxehf6l6rs6ihvnw5mmzy8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/go\/c6\/fb\/goc6fbxehf6l6rs6ihvnw5mmzy8.png\"\/><\/div>\n<p><\/a><br \/>  \u041c\u043d\u043e\u0433\u0438\u0435, \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0444\u0435\u0440\u0435 IT, \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u043e\u00a0<i>\u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0435 \u043f\u043e\u0440\u0442\u043e\u0432<\/i>. \u0421\u0432\u044f\u0437\u0430\u043d\u043e \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0445\/\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445\/\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u043e\u0443\u0442\u0435\u0440\u0430\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/NAT\">NAT<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0441\u0435\u0442\u044f\u0445 \u0438\u0437\u0432\u043d\u0435, \u043e\u0431\u0449\u0430\u044f\u0441\u044c \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c \u043e\u0442 \u0438\u0445 \u0438\u043c\u0435\u043d\u0438.<\/p>\n<p>  \u0423 NAT \u0435\u0441\u0442\u044c \u043a\u0438\u043b\u043b\u0435\u0440-\u0444\u0438\u0447\u0430 \u2014 \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439\u00a0<i><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B5%D0%B6%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD\">\u0444\u0430\u0435\u0440\u0432\u043e\u043b<\/a><\/i>: \u0430\u0442\u0430\u043a\u0438 \u0438\u0437\u0432\u043d\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u0442\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A3%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5_%D0%B0%D1%82%D0%B0%D0%BA%D0%B8\">\u0430\u0442\u0430\u043a \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u041e\u0421<\/a>.<\/p>\n<p>  \u041d\u043e, \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0442\u044b \u0437\u0430\u0445\u043e\u0447\u0435\u0448\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e <i>\u0437\u0430 NAT<\/i> \u0432 \u0431\u043b\u0430\u0433\u0438\u0445 \u0446\u0435\u043b\u044f\u0445, \u0442\u043e \u0442\u044b \u0447\u0438\u0441\u0442\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0448\u044c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 <i>\u0443 \u043d\u0435\u0433\u043e\u00a0\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u0431\u044f \u043d\u0435\u0442 IP-\u0430\u0434\u0440\u0435\u0441\u0430.<\/i><\/p>\n<p>  \u0420\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445, \u0442. \u0435. \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u0443\u044e \u043d\u043e\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0431\u0435\u043b\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 (\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0437\u0430 NAT). \u0412\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u00ab\u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438\u00bb \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u043f\u0430\u0434\u0430\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u0447\u0438\u0441\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u0442\u0430\u043a \u0435\u0449\u0451 \u0438 \u043d\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0430\u0434\u0451\u0442, \u0442\u043e \u0432\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0437\u0430 \u043d\u0438\u043c (\u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u043a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0445 \u0442\u0430\u043c kubernetes).<\/p>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0434\u0430\u0436\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0437\u0430 NAT\u0430\u043c\u0438,\u00a0<strong><font color=\"#3AC1EF\">P2P \u0440\u0435\u0430\u043b\u0435\u043d<\/font><\/strong>. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c bittorrent-\u0440\u0430\u0437\u0434\u0430\u0447\u0438, \u0442\u0440\u0430\u043d\u0441\u0444\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u041f\u043e\u0438\u0441\u043a \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0451\u043b \u043c\u0435\u043d\u044f \u0432 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u0434\u0435\u0431\u0440\u0438, \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0432\u0435\u0440\u043b\u0435\u0439\u043d\u0443\u044e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B4%D0%BD%D0%BE%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C\">p2p-\u0441\u0435\u0442\u044c<\/a>, \u0433\u0434\u0435\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/BitTorrent-%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80\">\u0442\u0440\u0435\u043a\u0435\u0440\u0430\u043c\u0438<\/a>\u00a0\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u0438 \u0435\u0451 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<a name=\"habracut\"><\/a><\/p>\n<p>  \u0415\u0441\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439\u0441\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f\u00a0<strong><font color=\"#3AC1EF\">NAT hole punching<\/font><\/strong>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0434\u0432\u0443\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0437\u0430 NAT\u0430\u043c\u0438, \u0437\u043d\u0430\u044f \u043b\u0438\u0448\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 NAT \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430. \u041d\u043e \u0432\u0435\u0434\u044c \u0437\u0430 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u2014 \u043a\u0430\u043a \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e?<\/p>\n<h2><font color=\"#3AC1EF\">\u0414\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/font><\/h2>\n<p>  \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044f \u0431\u0443\u0434\u0443 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043a\u0430\u0436\u0451\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0438\u0445 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0441 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%B5%D1%82%D0%B5%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_OSI\">\u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e OSI<\/a>, \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \u0438 \u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>  \u041a \u043c\u043e\u0435\u043c\u0443 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0438\u043b\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b\u0438 hole punching, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0432 ru \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u043b\u044e\u0431\u0438\u0442\u0435 \u0437\u0440\u0438\u0442\u044c \u0432 \u043a\u043e\u0440\u0435\u043d\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0438\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0441\u0435\u0431\u044f \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u0432 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445, \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/bford.info\/pub\/net\/p2pnat\/\">\u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b (en)<\/a> \u2014 \u043d\u0430 \u043d\u0435\u0433\u043e \u043e\u043f\u0438\u0440\u0430\u043b\u0441\u044f \u0438 \u044f \u0441\u0430\u043c, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437\u0443\u0447\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u0442\u043e \u043c\u043e\u0433\u0443 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0449\u0451 \u0438 \u044d\u0442\u0443 \u0432\u0435\u0441\u044c\u043c\u0430 \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e: <a href=\"https:\/\/tailscale.com\/blog\/how-nat-traversal-works\/\">How NAT traversal works<\/a>.<\/p>\n<blockquote><p>P.S. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u043d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u0441\u0432\u043e\u0435\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u043c <a href=\"https:\/\/habr.com\/ru\/articles\/763164\/\">\u044d\u0442\u043e\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u043c\u0443 \u0431\u043e\u043b\u0435\u0435 \u0443\u043c\u0435\u043b\u043e\u043c\u0443 \u0432 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u0430 \u0434\u0440\u0443\u0433\u0443.<\/p><\/blockquote>\n<p>  \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u0430 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441 NAT hole punching \u0432\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043e \u0438 \u0441\u043b\u043e\u0436\u043d\u043e, \u043a\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443.<br \/>  \u0411\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b P2P \u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u043c \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0444\u043e\u0440\u0443\u043c\u0430.<\/p>\n<p>  \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438 (\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0430\u043c\u0438). \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b\u043b \u0431\u044b \u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043d\u043e-\u043b\u043e\u043d\u0433\u0440\u0438\u0434, \u043a\u043e\u0438 \u044f \u0432\u0441\u0435\u0439 \u0434\u0443\u0448\u043e\u0439 \u043e\u0441\u0443\u0436\u0434\u0430\u044e. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043d\u0430 \u0447\u0442\u043e \u0438\u0434\u0451\u0442\u0435. \u0423\u0434\u0430\u0447\u0438!<\/p>\n<h2><font color=\"#3AC1EF\">\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/font><\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"#KNR\">\u041a\u0430\u043a NAT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/a><br \/> \n<ul>\n<li><a href=\"#UPNP\">\u041a\u0442\u043e \u0442\u0430\u043a\u043e\u0439 UPnP \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043c\u0451\u0440\u0442\u0432<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#HOLE\">\u041f\u0440\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u0434\u044b\u0440\u044b \u0432 NAT<\/a><br \/> \n<ul>\n<li><a href=\"#PNCH\">\u0415\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u0438\u0442\u0438\u0435!<\/a><\/li>\n<li><a href=\"#STUN\">\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d STUN?<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#PRJC\">\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0442\u044c<\/a><\/li>\n<li><a href=\"#FUNC\">\u041f\u0440\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443<\/a><\/li>\n<li><a href=\"#PYTH\">\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c<\/a><br \/> \n<ul>\n<li><a href=\"#TOOL\">\u041f\u0438\u0448\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/a><\/li>\n<li><a href=\"#PROT\">\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438<\/a><\/li>\n<li><a href=\"#UI\">\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 UI<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<li><a href=\"#TEST\">\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c<\/a><br \/> \n<ul>\n<li><a href=\"#CONC\">\u041f\u043e\u0434\u0432\u043e\u0434\u0438\u043c \u0438\u0442\u043e\u0433\u0438<\/a><\/li>\n<\/ul>\n<p>  <\/li>\n<\/ul>\n<p><a name=\"KNR\"><\/a><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9d0\/5cc\/d7f\/9d05ccd7f8d094bf11c465bce5a31c35.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9d0\/5cc\/d7f\/9d05ccd7f8d094bf11c465bce5a31c35.png\"\/><\/div>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u041c\u0430\u0442\u0447\u0430\u0441\u0442\u044c NAT<\/font><\/h2>\n<p>  <i>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0435\u0441\u044c \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u043c \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0438, \u043b\u0438\u0441\u0442\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.<\/i><\/p>\n<p>  <strong><font color=\"#3AC1EF\">NAT<\/font><\/strong>\u00a0(\u043e\u0442\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%90%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA\">\u0430\u043d\u0433\u043b.<\/a>\u00a0Network Address Translation\u00a0\u2014 \u00ab\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u00bb) \u2014 \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C\">\u0441\u0435\u0442\u044f\u0445<\/a>\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D1%82%D0%B5%D0%BA_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D0%BE%D0%B2_TCP\/IP\">TCP\/IP<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/IP-%D0%B0%D0%B4%D1%80%D0%B5%D1%81\">IP-\u0430\u0434\u0440\u0435\u0441\u0430<\/a>\u00a0\u0442\u0440\u0430\u043d\u0437\u0438\u0442\u043d\u044b\u0445\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%B0%D0%BA%D0%B5%D1%82_(%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8)\">\u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/a>.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dfb\/6e2\/dcb\/dfb6e2dcbbbf0da859fb48c9b207ec44.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dfb\/6e2\/dcb\/dfb6e2dcbbbf0da859fb48c9b207ec44.png\"\/><\/div>\n<p>  \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u2014 NAT \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432 \u0442\u0432\u043e\u0435\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u0435\u0431\u0435, \u0431\u0443\u0434\u0443\u0447\u0438 \u0432 \u0435\u0433\u043e \u043f\u043e\u0434\u0441\u0435\u0442\u0438, \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c\u00a0<strong><font color=\"#3AC1EF\">\u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0440\u043e\u0443\u0442\u0435\u0440\u0430.<\/font><\/strong>\u00a0\u0422\u0430\u043a \u043a\u0430\u043a \u0443 \u0440\u043e\u0443\u0442\u0435\u0440\u0430\u00a0<strong><font color=\"#3AC1EF\">\u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0430\u0434\u0440\u0435\u0441<\/font><\/strong>, \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0430\u00a0<strong><font color=\"#3AC1EF\">\u0443 \u0442\u0435\u0431\u044f \u0435\u0433\u043e \u043d\u0435\u0442<\/font><\/strong>.<\/p>\n<p>  \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0432\u043e\u0439 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043e DNS Google:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7dc\/221\/10e\/7dc22110e3b7ebd066822f89721ff616.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7dc\/221\/10e\/7dc22110e3b7ebd066822f89721ff616.png\"\/><\/div>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u0441 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c \u0434\u0440\u0443\u0433\u0430, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0441\u044f \u0437\u0430 \u0441\u0432\u043e\u0438\u043c NAT, \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442. \u0415\u0433\u043e \u0440\u043e\u0443\u0442\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0442\u044c, \u043a\u043e\u043c\u0443 \u0442\u044b \u0430\u0434\u0440\u0435\u0441\u043e\u0432\u0430\u043b \u043f\u0430\u043a\u0435\u0442 \u0432 \u0435\u0433\u043e \u043f\u043e\u0434\u0441\u0435\u0442\u0438, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u043d \u0435\u0433\u043e \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442. \u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0414\u0440\u0443\u0433 \u043c\u043e\u0436\u0435\u0442\u00a0\u00ab<i>\u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0440\u0442<\/i>\u00bb\u00a0\u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u0435. \u041e\u043d \u0437\u0430\u0439\u0434\u0451\u0442 \u043d\u0430 \u0432\u0435\u0431-\u043c\u0430\u0439\u043a\u0443 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>192.168.0.1<\/code>, \u0438 \u043f\u043e\u0442\u044b\u043a\u0430\u0435\u0442 \u0442\u0430\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0433\u0430\u0439\u0434\u0443 \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u0433\u0440\u044b. \u042d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0434\u043b\u044f \u0435\u0433\u043e NAT \u043d\u043e\u0432\u043e\u0435\u00a0<strong><font color=\"#3AC1EF\">\u043f\u0440\u0430\u0432\u0438\u043b\u043e<\/font><\/strong> \u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 (\u00ab\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u044b\u0440\u043a\u0438\u00bb) \u0441\u043d\u0430\u0440\u0443\u0436\u0438 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0441 \u043f\u043e\u0440\u0442\u043e\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0437\u0430 \u043d\u0438\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dcc\/d20\/948\/dccd209484c3a3ae8cc4dad708bb284d.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dcc\/d20\/948\/dccd209484c3a3ae8cc4dad708bb284d.png\"\/><\/div>\n<p>  \u0423\u0432\u044b, \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041d\u0430\u0448 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0434\u0440\u0443\u0433 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u043a\u0430\u0444\u0435\/\u043e\u0431\u0449\u0430\u0433\u0435\/\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 (\u043d\u0435 \u0438\u043c\u0435\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u0430). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/UPnP\"><strong>UPnP<\/strong><\/a>.<a name=\"UPNP\"><\/a><\/p>\n<p>  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/UPnP\"><strong>UPnP<\/strong><\/a>-\u043f\u0430\u043a\u0435\u0442 \u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0440\u043e\u0443\u0442\u0435\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0438\u0442 \u0435\u0433\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0440\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u0440\u043e\u0443\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0431\u044b\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d. \u041d\u043e \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u044d\u0442\u0430 \u043d\u0435 \u043f\u0440\u0438\u0436\u0438\u043b\u0430\u0441\u044c \u0432 \u043c\u0430\u0441\u0441\u0430\u0445. \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 UPnP \u043d\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0435 \u0434\u0430\u0451\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0435\u0442\u044c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043e\u043d \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u0445 \u0441 \u0437\u0430\u0432\u043e\u0434\u0430 -> \u043e\u043d \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n<blockquote><p>\u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, UPnP \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u0435, \u0447\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u0440\u0440\u0435\u043d\u0442-\u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c.<\/p><\/blockquote>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/926\/fd0\/9a6\/926fd09a660ca1bacfa93c7b3f18ca00.png\" align=\"left\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/926\/fd0\/9a6\/926fd09a660ca1bacfa93c7b3f18ca00.png\"\/>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f \u043a \u0441\u0430\u043c\u043e\u043c\u0443 NAT.<br \/>  \u0412\u043e\u0442, \u043e\u043d \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0432\u043e\u0439 \u043f\u0430\u043a\u0435\u0442 \u043f\u043e\u0434 \u043f\u0430\u043a\u0435\u0442 \u0442\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u043d\u0430\u0440\u0443\u0436\u0443, \u0432\u0435\u0440\u043d\u043e?<\/p>\n<p>  \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u0434\u0435\u043b\u0430\u0435\u0448\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a Google (\u043f\u0430\u0440\u0443 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0439 \u043d\u0430\u0437\u0430\u0434), \u0442\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0432\u0435\u0434\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 NAT \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443?<\/p>\n<p>  \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e NAT \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u0430\u0437\u0435\u0439\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<blockquote><p>\u041b\u0430\u0437\u0435\u0439\u043a\u043e\u0439 \u0438\u043b\u0438 \u0434\u044b\u0440\u043a\u043e\u0439 \u044f \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e NAT \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f.<\/p><\/blockquote>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e1\/e0e\/813\/6e1e0e81328a8ae4818cd8ffd87f7134.png\" align=\"left\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6e1\/e0e\/813\/6e1e0e81328a8ae4818cd8ffd87f7134.png\"\/>\u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u043f\u043e\u0440\u0442\u0430 \u0434\u043e \u0442\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c: \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0441 \u0442\u043e\u0433\u043e \u0436\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0442\u0432\u043e\u0439 \u043f\u0430\u043a\u0435\u0442-\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430.<\/p>\n<p>  \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e Google, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u044b \u0441\u0430\u043c \u043f\u043e \u0441\u0443\u0442\u0438 \u043e\u0442\u043a\u0440\u044b\u043b \u044d\u0442\u0443 \u0434\u044b\u0440\u0443, \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0432 \u0435\u043c\u0443 \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442.<\/p>\n<p>  \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044f NAT. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043c\u043d\u043e\u0439 \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438, \u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0451 \u0436\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f. \u0412\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u044f \u043d\u0435 \u0441\u0442\u0430\u043d\u0443, \u0441\u043a\u0430\u0436\u0443 \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0434\u0430\u043b\u0435\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 (\u0438 \u0434\u0430\u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438!).<\/p>\n<blockquote><p>\u041a\u0441\u0442\u0430\u0442\u0438, NAT \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e NAT \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 (\u0441\u043c. <a href=\"https:\/\/en.m.wikipedia.org\/wiki\/Carrier-grade_NAT\">CG-NAT<\/a>).<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u0430\u043b\u0435\u0435 \u043c\u0435\u0442\u043e\u0434\u0430.<\/p><\/blockquote>\n<p>  <a name=\"HOLE\"><\/a><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d54\/ab6\/e9c\/d54ab6e9cb36f45ca8feb98bef4b8a46.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d54\/ab6\/e9c\/d54ab6e9cb36f45ca8feb98bef4b8a46.png\"\/><\/div>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u041f\u0440\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u0434\u044b\u0440\u044b \u0432 NAT<\/font><\/h2>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 Google \u0438\u043c\u0435\u043b \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u0431\u0435\u043b\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u0431\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u0440\u0442\u043e\u043c. \u041d\u043e \u043a\u0430\u043a \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0434\u0432\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0437\u0430 NAT\u0430\u043c\u0438?<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/94e\/048\/8e7\/94e0488e73dada360316e8d4639f297e.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/94e\/048\/8e7\/94e0488e73dada360316e8d4639f297e.png\"\/><\/div>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0443 \u043d\u0430\u0441 \u0434\u0430\u043d\u043d\u044b\u0445\u2026<\/p>\n<ol>\n<li>\u0422\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u0431\u0435\u043b\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0434\u0440\u0443\u0433\u0430, \u043e\u043d \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f NAT \u0438 \u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043f\u043e\u0440\u0442\u0430 \u043d\u0430 \u0442\u0432\u043e\u0435\u043c \u0440\u043e\u0443\u0442\u0435\u0440\u0435 \u2116X (\u0442\u044b \u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0448\u044c!).  <\/li>\n<li><strong><font color=\"#3AC1EF\">\u041f\u0430\u043a\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u0444\u0430\u0439\u0440\u0432\u043e\u043b \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0434\u0440\u0443\u0433\u0430 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/font><\/strong><\/li>\n<li>\u0422\u0443\u043d\u043d\u0435\u043b\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442 \u043d\u0430 \u0442\u0432\u043e\u0451\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u043e\u0440\u0442\u0443 X, \u043d\u043e \u0435\u0433\u043e \u043d\u043e\u043c\u0435\u0440 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442.  <\/li>\n<\/ol>\n<p>  \u0421\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0442\u0443\u043f\u0438\u043a\u043e\u0432\u043e\u0439, \u043d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0432 NAT \u2014 \u0435\u0441\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043f\u0440\u0438\u0451\u043c \u043e\u0442 google.com \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u043e\u0440\u0442 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 X, \u0442\u043e \u0442\u044b \u043c\u043e\u0436\u0435\u0448\u044c \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043a\u0435\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f\u00a0<i>\u044d\u0442\u0443 \u0436\u0435 \u0441\u0435\u0441\u0441\u0438\u044e<\/i>\u00a0\u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 (\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, <code>123.123.123.123<\/code>). \u0421\u0435\u0441\u0441\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043e\u0442 \u043d\u0435\u0433\u043e, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0432 \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u043e\u0440\u0442 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435.<br \/>  <a name=\"PNCH\"><\/a><br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435 \u043d\u0435\u043a\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 <code>1.2.3.4<\/code>, \u0432\u0438\u0434\u0438\u043c\u044b\u0439 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.<\/p>\n<ol>\n<li>\u0422\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 <code>1.2.3.4<\/code>, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u0435\u0441\u0441\u0438\u044e, \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u043e\u0440\u0442\u0443 X.  <\/li>\n<li>1.2.3.4 \u0432\u0438\u0434\u0438\u0442 \u0442\u0432\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u043e\u0440\u0442 X, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 (\u0434\u0440\u0443\u0433 \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u0432\u0435\u0434\u044c \u043f\u0430\u043a\u0435\u0442 \u043d\u0435 \u0434\u043e\u0448\u0451\u043b).  <\/li>\n<li>\u0412\u043b\u0430\u0434\u0435\u043b\u0435\u0446 <code>1.2.3.4<\/code> \u043d\u0435\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u0442\u0435\u0431\u0435 \u0442\u0432\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u043e\u0440\u0442 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 X.  <\/li>\n<li>\u0422\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0448\u044c \u043f\u0430\u043a\u0435\u0442 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0434\u0440\u0443\u0433\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u043e\u0442 \u0436\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u043d\u0430 \u041f\u041a, \u0447\u0442\u043e \u0438 \u0434\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a <code>1.2.3.4<\/code>. \u042d\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0430\u043a\u0435\u0442 \u0438\u0434\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0443\u044e\u0441\u044f \u0441\u0435\u0441\u0441\u0438\u044e NAT.  <\/li>\n<li>\u0422\u0432\u043e\u044f \u0441\u0435\u0441\u0441\u0438\u044f NAT \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043d\u0435 \u043e\u0442 <code>1.2.3.4<\/code>, \u0430 \u043e\u0442 \u0442\u0432\u043e\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u0430.  <\/li>\n<li><strong><font color=\"#3AC1EF\">\u041f\u0430\u043a\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u0444\u0430\u0439\u0440\u0432\u043e\u043b \u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0434\u0440\u0443\u0433\u0430 \u0441\u043d\u0430\u0440\u0443\u0436\u0438.<\/font><\/strong><\/li>\n<li>\u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0437\u043d\u0430\u0435\u043c X \u0437\u0430 \u0441\u0447\u0451\u0442 \u043f\u043e\u043c\u043e\u0449\u0438 \u043e\u0442 <code>1.2.3.4<\/code>,  <\/li>\n<li>\u0414\u0440\u0443\u0433 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u0438 \u0436\u0435 \u0448\u0430\u0433\u0438, \u043d\u043e \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0432 \u043f\u043e\u0440\u0442 X, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u0435\u0441\u0441\u0438\u0435\u0439 NAT \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u043f\u0440\u0438\u0451\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 (\u0432 \u0448\u0430\u0433\u0435 5).  <\/li>\n<li><strong><font color=\"#3AC1EF\">\u041f\u0430\u043a\u0435\u0442 \u0434\u0440\u0443\u0433\u0430 \u0434\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430!<\/font><\/strong><\/li>\n<li>\u041c\u044b \u0432\u0438\u0434\u0438\u043c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u043e\u0440\u0442 \u0434\u0440\u0443\u0433\u0430 Y (\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e X) \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u043a\u0432\u043e\u0437\u044c \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440\u044b. \u041f\u043e\u0431\u0435\u0434\u0430!  <\/li>\n<\/ol>\n<p>  <a name=\"STUN\"><\/a>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043a \u0431\u043b\u0430\u0433\u0438\u043c \u0434\u0435\u043b\u0430\u043c <code>1.2.3.4<\/code>, \u0438, \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0418 \u0437\u043e\u0432\u0443\u0442 \u044d\u0442\u0438\u0445 \u0434\u043e\u0431\u0440\u044f\u043a\u043e\u0432\u00a0<strong><font color=\"#3AC1EF\">STUN<\/font><\/strong>-\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438.<\/p>\n<p>  <a href=\"https:\/\/ru.wikipedia.org\/wiki\/STUN\"><strong>STUN-\u0441\u0435\u0440\u0432\u0435\u0440<\/strong><\/a>\u00a0&#8212; \u044d\u0442\u043e\u00a0\u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0438 \u043f\u043e\u0440\u0442\u043e\u043c X, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/IP-%D0%B0%D0%B4%D1%80%D0%B5%D1%81\">IP-\u0430\u0434\u0440\u0435\u0441<\/a> \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043f\u043e\u0440\u0442 X \u0441\u0432\u043e\u0435\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 NAT.<\/p>\n<p>  \u0418\u0445 \u0435\u0441\u0442\u044c \u0432\u0435\u043b\u0438\u043a\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435, \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u044d\u0442\u043e \u043c\u044b \u0435\u0449\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c. \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 url, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0434\u043d\u044f\u0442\u044b STUN:\u00a0<a href=\"https:\/\/gist.github.com\/mondain\/b0ec1cf5f60ae726202e\">https:\/\/gist.github.com\/mondain\/b0ec1cf5f60ae726202e<\/a>.<\/p>\n<p>  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0<a href=\"http:\/\/stun.ekiga.net\/\">stun.ekiga.net<\/a>, \u043d\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<blockquote><p>\u041c\u043e\u0439 \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0439 \u0433\u0430\u0439\u0434 \u043f\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a \u043a\u043e\u043d\u0446\u0443 \u2014 \u0434\u0430\u043b\u0435\u0435 \u0438\u0434\u0451\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u0435\u0439\u0441\u0430. <a name=\"PRJC\"><\/a>\u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043e\u0441\u043e\u0437\u043d\u0430\u043b\u0438 \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u044e\u0430\u043d\u0441\u043e\u0432, \u0442\u043e \u0432\u0430\u043c <a href=\"https:\/\/habr.com\/ru\/articles\/763164\/\">\u0441\u044e\u0434\u0430<\/a>.<\/p><\/blockquote>\n<p>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0422\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0435\u0442\u0438<\/font><\/h2>\n<p>  \u041d\u0430\u0448\u0430\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B2%D0%B5%D1%80%D0%BB%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C\">\u043e\u0432\u0435\u0440\u043b\u0435\u0439\u043d\u0430\u044f \u0441\u0435\u0442\u044c<\/a>\u00a0\u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u0441\u0435\u0431\u044f \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0434, \u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0445 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c udp-\u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0438\u0445 NAT.<\/p>\n<p>  \u0421\u0435\u0442\u044c <b><font color=\"#3AC1EF\">\u041d\u0415<\/font><\/b> \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u00a0\u043c\u043e\u0436\u0435\u0442 <i>\u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/i>\u00a0\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b \u0437\u0430 \u0441\u0435\u0442\u044c\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0434\u0435\u044f \u0441\u0445\u043e\u0436\u0430 \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5ac\/41b\/ec1\/5ac41bec16497fec1fbdd48eb7815187.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5ac\/41b\/ec1\/5ac41bec16497fec1fbdd48eb7815187.png\"\/><\/div>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u043a\u0440\u0430\u0442\u0446\u0435, \u043c\u044b \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u043c, \u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 T. \u0415\u0441\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435\u043c (\u043f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0441 \u043c\u0443\u0441\u043e\u0440\u043e\u043c), \u0438 \u0442\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0441\u0435\u0442\u0438, \u0442\u043e \u0444\u0430\u043a\u0442 \u0438 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c\u0443 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044e.<\/p>\n<blockquote><p><strong>\u041c\u0443\u0441\u043e\u0440\u043d\u044b\u0439 (\u043b\u043e\u0436\u043d\u044b\u0439) \u0442\u0440\u0430\u0444\u0438\u043a<\/strong>\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0445 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439.<\/p><\/blockquote>\n<p>  \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b:\u00a0<a href=\"https:\/\/habr.com\/ru\/articles\/753902\/\">https:\/\/habr.com\/ru\/articles\/753902\/<\/a>.  <\/div>\n<\/p><\/div>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u0448\u0430 \u0441\u0435\u0442\u044c \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0431\u044b\u0442\u044c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439, \u0435\u0441\u043b\u0438 \u0431\u044b \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u043e\u0434\u0430, \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0441\u043b\u0430\u043b\u0430 \u0435\u0449\u0451 \u0438 \u043c\u0443\u0441\u043e\u0440 \u0432\u0441\u0435\u043c, \u043d\u043e \u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043e\u0442\u043a\u0430\u0436\u0443\u0441\u044c \u043e\u0442 \u0434\u0430\u043d\u043d\u043e\u0439 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u0443\u0433\u043e\u0434\u0443 \u0440\u0430\u0437\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u0430\u043d\u0430\u043b\u0430, \u043d\u043e \u0438 <i>\u043d\u0435 \u0441\u0442\u0430\u043d\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u044c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0439<\/i>.<a name=\"FUNC\"><\/a><\/p>\n<h2><font color=\"#3AC1EF\">\u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f<\/font><\/h2>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0442\u0438 \u044f \u043d\u0435 \u0441\u0442\u0430\u043d\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b, \u0442\u0440\u0435\u043a\u0435\u0440\u044b \u0438 \u0442. \u0434. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0442\u0430\u043a\u043e\u0432\u0430, \u0447\u0442\u043e \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u044b, \u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0435 \u0442\u0440\u0435\u0442\u044c\u0435 \u043b\u0438\u0446\u043e \u0441 \u0431\u0435\u043b\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0438\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e (\u043a\u0440\u043e\u043c\u0435 STUN).<\/p>\n<p>  \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043d\u043e\u0434\u044b\u00a0<strong><font color=\"#3AC1EF\">(I)<\/font><\/strong>\u00a0\u0438\u00a0<strong><font color=\"#3AC1EF\">(II)<\/font><\/strong>, \u043e\u043d\u0438 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435\u00a0\u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.\u00a0\u0412 \u044d\u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u0430 \u043d\u0435\u043a\u0430\u044f \u043d\u043e\u0434\u0430<strong><font color=\"#3AC1EF\">\u00a0(III)<\/font><\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u043a\u00a0<strong><font color=\"#3AC1EF\">(I)<br \/>  <\/font><\/strong>. \u041d\u043e\u0434\u0430\u00a0<strong><font color=\"#3AC1EF\">(II)\u00a0<\/font><\/strong>\u0443\u0437\u043d\u0430\u043b\u0430 \u043e\u0442<strong><font color=\"#3AC1EF\">\u00a0(I),\u00a0<\/font><\/strong>\u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0430\u044f<strong><font color=\"#3AC1EF\">\u00a0(III).<\/font><\/strong>\u00a0\u0421\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/034\/2a4\/6bc\/0342a46bc10d56745bbd8979638b4e41.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/034\/2a4\/6bc\/0342a46bc10d56745bbd8979638b4e41.png\"\/><\/div>\n<p>  <\/p>\n<ul>\n<li>0. \u041f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u2014 \u0431\u0443\u0434\u0435\u0442 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0437\u0436\u0435.  <\/li>\n<li>1. <b><font color=\"#3AC1EF\">(II)<\/font><\/b> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u00a0<b><font color=\"#3AC1EF\">(III)<\/font><\/b>, \u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0438 \u043f\u0440\u043e\u0441\u0438\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c\u00a0<strong><font color=\"#3AC1EF\">(I)<\/font><\/strong>.<\/li>\n<li>2. <b><font color=\"#3AC1EF\">(I)<\/font><\/b>\u00a0\u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441.<\/li>\n<li>3. <strong><font color=\"#3AC1EF\">(III)<\/font><\/strong>\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 HOLE PUNCH \u043a\u00a0<strong><font color=\"#3AC1EF\">(II)<\/font><\/strong>, \u043e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0438 \u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u00a0<strong><font color=\"#3AC1EF\">(II)<\/font><\/strong>, \u0437\u0430\u0442\u043e \u0441\u0430\u043c\u00a0<strong><font color=\"#3AC1EF\">(III)<\/font><\/strong>\u00a0\u0443\u0437\u043d\u0430\u043b \u0435\u0433\u043e \u043e\u0442 STUN.<\/li>\n<li>4. <strong><font color=\"#3AC1EF\">(III)\u00a0<\/font><\/strong>\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u00a0<strong><font color=\"#3AC1EF\">(II)<\/font><\/strong>\u00a0\u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c PUNCHED-\u043f\u043e\u0440\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437\u00a0<strong><font color=\"#3AC1EF\">(I)<\/font><\/strong>.<\/li>\n<li>5. <strong><font color=\"#3AC1EF\">(I)<\/font><\/strong>\u00a0\u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u043e\u0442\u0432\u0435\u0442.<\/li>\n<li>6. <strong><font color=\"#3AC1EF\">(II)<\/font><\/strong>\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 HOLE PUNCH \u043a\u00a0<strong><font color=\"#3AC1EF\">(III)\u00a0<\/font><\/strong>\u043d\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u0440\u0442\u044b \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u043f\u0440\u043e\u0431\u0440\u043e\u0448\u0435\u043d\u044b.<\/li>\n<li>7. \u0422\u0435\u043f\u0435\u0440\u044c\u00a0<strong><font color=\"#3AC1EF\">(III)<\/font><\/strong>\u00a0\u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u00a0<strong><font color=\"#3AC1EF\">(II)<\/font><\/strong>, \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u043c\u0435\u043d \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u043a\u0430\u043a \u0432 \u0448\u0430\u0433\u0435<strong><font color=\"#3AC1EF\">\u00a00<\/font><\/strong>.<\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p>\u0415\u0441\u0442\u044c \u043f\u0440\u0430\u0432\u0434\u0430 \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 \u2014 \u043a \u0442\u0430\u043a\u043e\u0439 \u0441\u0435\u0442\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0438\u0437\u0432\u043d\u0435.\u00a0\u0412\u0441\u044f \u043e\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445.\u00a0\u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0442\u044b \u0445\u043e\u0447\u0435\u0448\u044c \u0432\u043e\u0439\u0442\u0438 \u0432 \u0441\u0435\u0442\u044c, \u0442\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u0433\u043e-\u0442\u043e, \u043a\u0442\u043e \u0443\u0436\u0435 \u0432 \u043d\u0435\u0439 \u0441\u043e\u0441\u0442\u043e\u0438\u0442, \u0438 \u0432 \u0440\u0443\u0447\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c (\u043f\u043e \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u043c\u0443 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u044e). \u0414\u0430\u043b\u0435\u0435 \u0432\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e \u0441\u0445\u0435\u043c\u0435, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435.<\/p><\/blockquote>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u0427\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c?<\/font><\/h3>\n<p>  \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043e\u0432\u0435\u0440\u043b\u0435\u0439\u043d\u0443\u044e \u0441\u0435\u0442\u044c, \u0433\u0434\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 LAN (\u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0440\u0442\u0430).<\/p>\n<p>  \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043e\u0431\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438<\/p>\n<ul>\n<li>\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439.  <\/li>\n<li>\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D0%B5%D1%88-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F\">\u0445\u0435\u0448<\/a>.  <\/li>\n<li>Reply \u043d\u0430 \u0447\u0443\u0436\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0435\u0433\u043e \u0445\u0435\u0448\u0443.<br \/> \n<ul>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0435 \u043f\u043e\u0434\u043e\u0431\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/127864\/\">LinkedList <\/a>\u0438\u043b\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%BB%D0%BE%D0%BA%D1%87%D0%B5%D0%B9%D0%BD\">\u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0430<\/a>.  <\/li>\n<\/ul>\n<p>  <\/li>\n<li>\u0412\u0435\u0441\u044c \u0444\u043e\u0440\u0443\u043c \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 python <a href=\"https:\/\/python-scripts.com\/sets\">set (aka \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e)<\/a>:<br \/> \n<ul>\n<li>\u0414\u0432\u0443\u0445 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442.  <\/li>\n<li>\u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441 \u0447\u0443\u0436\u0438\u043c\u0438.  <\/li>\n<\/ul>\n<p>  <\/li>\n<li>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0444\u043e\u0440\u0443\u043c\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u0435\u0440\u0435\u0432\u043e, \u0433\u0434\u0435 \u0443\u0437\u043b\u044b \u044d\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.<br \/> \n<ul>\n<li>\u041e\u0442\u0432\u0435\u0447\u0430\u044f \u043d\u0430 \u0447\u0443\u0436\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0442\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u0448\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u043e\u0442 \u043d\u0435\u0433\u043e.  <\/li>\n<li>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043e\u0442\u0432\u0435\u0442\u043e\u0432, \u0442\u044b \u0443\u0434\u043b\u0438\u043d\u044f\u0435\u0448\u044c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0432\u0435\u0442\u043e\u043a.  <\/li>\n<\/ul>\n<p>  <\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0445\u0440\u0430\u043d\u0438\u0442 \u0443 \u0441\u0435\u0431\u044f \u0441\u0432\u043e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u043e\u0440\u0443\u043c\u0430, \u0438\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u043e, \u0442\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: <i>\u0438\u0441\u0442\u0438\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/i> \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u2014 \u044d\u0442\u043e <i>\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0435<\/i>. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0438\u0437 \u0442\u0432\u043e\u0438\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u0443 \u0442\u0435\u0431\u044f, \u0442\u043e \u0442\u044b \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0445 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0435\u0431\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/003\/2f6\/928\/0032f69289df30917cefdc741fe8b91f.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/003\/2f6\/928\/0032f69289df30917cefdc741fe8b91f.png\"\/><\/div>\n<p><i><font color=\"#999999\">\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/font><\/i><\/p>\n<ul>\n<li>\u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u044f\u0445.  <\/li>\n<\/ul>\n<p>  \u041f\u043e\u0434\u0431\u0438\u0440\u0430\u044f\u0441\u044c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e <i>\u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0441 \u0447\u0443\u0436\u0438\u043c<\/i>.<\/p>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0435\u0441\u0441\u0438\u044f NAT \u0443\u043c\u0440\u0451\u0442, \u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 Keep Alive-\u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D0%B8\">Proof of Concept<\/a>-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 Python \u0434\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0435\u043e\u0440\u0438\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24d\/eb3\/40a\/24deb340a3da19493ffb7f1bc2c190c9.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24d\/eb3\/40a\/24deb340a3da19493ffb7f1bc2c190c9.png\"\/><\/div>\n<p><a name=\"PYTH\"><\/a>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Python<\/font><\/h2>\n<p>  \u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0443 \u0432\u0441\u0435\u0445, \u043a\u0442\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0441 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0448\u0435\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u044b\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043d\u0435 \u0441\u043c\u043e\u0433\u0443 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0411\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043a\u0443\u0441\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435 \u043e\u043a\u043e\u0448\u043a\u043e \u0444\u0440\u0435\u0439\u043c\u0430 \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430.  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0418\u043c\u043f\u043e\u0440\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043b\u043e\u0433\u0433\u0435\u0440 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">from pathlib import Path import time import os import sys   def cls():     os.system(\"cls\" if os.name == \"nt\" else \"clear\")   try:     scriptname = Path(__file__).name except:     scriptname = \"CnC.py\" try:     verfrom = time.ctime(os.path.getmtime(__file__)) except:     verfrom = \"!No time!\"   import threading import socket import random import hashlib import json import logging import pdb   class Debug(pdb.Pdb):     def __init__(self, *args, **kwargs):         super(Debug, self).__init__(*args, **kwargs)         self.prompt = \"CnC Debug Shell >>> \"      def shell(self):         self.set_trace()   debug = Debug() # logging.warn(f\"Event logging is enabled. You can see it in {scriptname}.log\") logging.basicConfig(     format=\"%(asctime)s %(message)s\", level=logging.DEBUG, filename=f\"{scriptname}.log\" ) logging.info(\"Hello world!\") logging.getLogger().setLevel(logging.DEBUG)<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p><a name=\"TOOL\"><\/a><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0436\u0438\u0437\u043d\u0438:<\/p>\n<pre><code class=\"python\">def dat_to_bytes(diction: dict) -> bytes:     return json.dumps(diction).encode(\"cp866\")   def bytes_to_dat(byte: bytes) -> dict:     return json.loads(byte.decode(\"cp866\"))   def checksum(b):     return hashlib.blake2s(b, digest_size=4).hexdigest()   _alreadyused = set()   def randomport():     global _alreadyused     p = random.randint(16000, 65535)     while p in _alreadyused:         p = random.randint(16000, 65535)     _alreadyused.update({p})     return p<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432 \u0431\u0430\u0439\u0442\u044b, \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0438\u0434\u0451\u0442 \u0432\u0437\u044f\u0442\u0438\u0435 \u0445\u044d\u0448\u0430 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0434\u0430\u044e\u0449\u0430\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f STUN() \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u043a\u0430\u043a \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u043d\u0435\u0433\u043e STUN request \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u00a0<a href=\"http:\/\/stun.ekiga.net\/\">stun.ekiga.net<\/a>.<\/p>\n<p>  \u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0439\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043d\u0435 \u0432\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043c\u043f\u043d\u0443\u043b \u0435\u0433\u043e \u0438\u0437 <a href=\"https:\/\/www.wireshark.org\">Wireshark<\/a>.<\/p>\n<p>  \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0440\u0442 X \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<pre><code class=\"python\">def STUN(port, host=\"stun.ekiga.net\"):     logging.debug(f\"STUN request via {host}\")     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)     sock.bind((\"0.0.0.0\", port))     sock.setblocking(0)     server = socket.gethostbyname(host)     work = True     while work:         sock.sendto(             b\"\\x00\\x01\\x00\\x00!\\x12\\xa4B\\xd6\\x85y\\xb8\\x11\\x030\\x06xi\\xdfB\",             (server, 3478),         )         for i in range(20):             try:                 ans, addr = sock.recvfrom(2048)                 work = False                 break             except:                 time.sleep(0.01)      sock.close()     return socket.inet_ntoa(ans[28:32]), int.from_bytes(ans[26:28], byteorder=\"big\")<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u0430\u0440\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 ip:port \u0432 \u043e\u0434\u043d\u043e \u0447\u0438\u0441\u043b\u043e<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def addr2int(ip, port: int):     binport = bin(port)[2:].rjust(16, \"0\")     binip = \"\".join([bin(int(i))[2:].rjust(8, \"0\") for i in ip.split(\".\")])     return int(binip + binport, 2)   def int2addr(num):     num = bin(num)[2:].rjust(48, \"0\")     print(num)     num = [         str(int(i, 2))         for i in [num[0:8], num[8:16], num[16:24], num[24:32], num[32:48]]     ]     return \".\".join(num[0:4]), int(num[4])<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  Dump \u0438 Load \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\/\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442 \u0441\u0435\u0442\u0438:<\/p>\n<pre><code class=\"python\">def data_dump():     with open(f\"{scriptname}.chat-savefile.json\", \"w\") as f:         json.dump(data, f)   def data_load():     global data     try:         with open(f\"{scriptname}.chat-savefile.json\", \"r\") as f:             data = json.load(f)     except:         logging.error(f\"No save file exists! New one created\")         with open(f\"{scriptname}.chat-savefile.json\", \"w\") as f:             json.dump({}, f)<\/code><\/pre>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u043d\u043e\u0434\u044b<\/font><\/h3>\n<p>  \u041a\u043b\u0430\u0441\u0441, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u043e\u0434\u043e\u0439:<\/p>\n<pre><code class=\"python\">class Session:     def __init__(self):         # self.prefix=\"IDL\"         self.immortal = False         self.local_port = randomport()         for i in range(10):             self.public_ip, self.public_port = STUN(self.local_port)         self.socket = None         self.client = None         self.thread = None         logging.info(f'\"{self.public_ip}\",{self.public_port}')      def make_connection(self, ip, port, timeout=10):         logging.debug(f\"Start waiting for handshake with {ip}:{port}\")         sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)         sock.bind((\"0.0.0.0\", self.local_port))         sock.setblocking(0)         while True:             sock.sendto(b\"Con. Request!\", (ip, port))             time.sleep(2)             try:                 ans, addr = sock.recvfrom(9999)                 sock.sendto(b\"Con. Request!\", (ip, port))                 sock.close()                 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)                 sock.bind((\"0.0.0.0\", self.local_port))                 sock.setblocking(0)                 self.client = (ip, port)                 self.socket = sock                 logging.debug(f\"Hole with {self.client} punched!\")                 break             except Exception as e:                 assert timeout > 0                 timeout -= 1                 logging.debug(f\"No handshake with {ip}:{port} yet...\")<\/code><\/pre>\n<p>  \u0418\u0437 \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u2014 \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0432 NAT. \u0412\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u0437\u0430\u0442\u044c \u0433\u043b\u0430\u0437\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 <code>for i in range(10): self.public_ip, self.public_port = STUN(self.local_port)<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a STUN 10 \u0420\u0410\u0417. \u042d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u0441\u0442\u044b\u043b\u0451\u043c \u0434\u043b\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u043e\u043a\u0430 \u0436\u0438\u0437\u043d\u0438 NAT-\u0441\u0435\u0441\u0441\u0438\u0438, \u0432\u0435\u0434\u044c \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0440\u043e\u0443\u0442\u0435\u0440\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0435\u0451 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 (\u043f\u043e\u0440\u044f\u0434\u043a\u0430 10 \u0441\u0435\u043a\u0443\u043d\u0434) \u0438 \u0432\u044b \u0441 \u00ab\u0434\u0440\u0443\u0433\u043e\u043c\u00bb \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0443\u0441\u043f\u0435\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u0434\u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 \u0440\u0430\u0441\u0442\u0451\u0442 \u043f\u0440\u0438 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 \u043d\u0443\u0436\u0435\u043d \u0441\u043f\u0430\u043c STUN-\u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. <a name=\"PROT\"><\/a><\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b<\/font><\/h3>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<p>  \u0412\u0432\u0435\u0434\u0443 \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435, \u043a\u0430\u043a \u00ab\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u00bb. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 3 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 UDP-\u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0441 \u043a\u0430\u043a\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u043e\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<blockquote><p><b>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/b>: <i>\u0412\u043f\u0435\u0440\u0435\u0434\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0439 if-elif-else, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 match \u0438\u043b\u0438 \u0437\u0430\u043c\u0443\u0442\u0438\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0438 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435. \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0430\u0432\u0442\u043e\u0440 \u043d\u0435 \u0441\u0442\u0430\u043b \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c&#8230;<\/i><\/p><\/blockquote>\n<p>  \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0446\u0438\u043a\u043b \u0436\u0438\u0437\u043d\u0438 \u043d\u043e\u0434\u044b:<\/p>\n<pre><code class=\"python\">def backlife_cycle(self, freq=1):     global sessions     if self.immortal:         logging.warning(f\"{self.client} session beacame immortal\")         self.life_cycle = aegis(self.life_cycle)     th = threading.Thread(target=self.life_cycle, args=(freq,))     th.start()     self.thread = th     logging.warning(f\"Session with {self.client} stabilized!\")     # sessions.append(self)  def life_cycle(self, freq=1):     global data     global sessions     global pool     c = 0     while 1:         if len(pool):             pref = pool.pop(0)         else:             pref = b\"KPL\"          self.socket.sendto(pref, self.client)  # Keep-alive         time.sleep(max(random.gauss(1 \/ freq, 3), 0))          while True:             try:                 ans, reply_addr = self.socket.recvfrom(9999)                 logging.debug(                     f\"{self.client[0]}: Recieved {ans[:3].decode('cp866')} from {reply_addr}: {ans}\"                 )             except:                 break <\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0435\u0451 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 KPL (Keep Alive) \u043f\u0430\u043a\u0435\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 KPL-\u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<p>  \u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0430\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<ul>\n<li>\u0420\u0430\u0437 \u0432 10 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 KPL \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u0432. <\/li>\n<li>\u0420\u0430\u0437 \u0432 33 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 KPL \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"python\">if ans[:3] == b\"KPL\":     c += 1     if c % 10 == 0:         logging.debug(             f\"{self.client[0]}: Requesting Datagram     {c\/\/10}\"         )         self.socket.sendto(b\"RQD\", self.client)         c += 1     elif c % 33 == 0:         logging.debug(             f\"{self.client[0]}: Requesting Session List {c\/\/33}\"         )         self.socket.sendto(b\"RQS\", self.client)         c += 1 <\/code><\/pre>\n<p>  \u041f\u043e\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0445\u0435\u0448\u0435\u0439.<br \/>  \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044f \u0438\u0445 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u043e\u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0437\u0430\u0445\u043e\u0434\u0438\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 4 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041d\u0435 \u043c\u043e\u0433\u0443 \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043e\u043d\u0438 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b.<\/p>\n<pre><code class=\"python\"> # ----------------------------------------Hashes (keys) sync (disabled now)---------------------------------------- elif ans[:3] == b\"RQH\":     logging.debug(f\"{self.client[0]}: Sending hashes\")     self.socket.sendto(         b\"HAS\" + dat_to_bytes(list(data.keys())), self.client     )  elif ans[:3] == b\"HAS\":     missed_messages.update(         set(bytes_to_dat(ans[3:])) - set(data.keys())     ) <\/code><\/pre>\n<p>  \u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"python\"># ----------------------------------------Data sync---------------------------------------- elif ans[:3] == b\"RQD\":     if ans[3:] != b\"\":         logging.debug(f\"{self.client[0]}: Sending specific datagram\")         n = {}         r = set(bytes_to_dat(ans[3:]))         for i in r:             if i in data:                 n.update({i: data[i]})         logging.debug(f\"{self.client[0]}: Sending {n}\")         self.socket.sendto(b\"DAT\" + dat_to_bytes(n), self.client)     else:         logging.debug(f\"{self.client[0]}: Sending datagram\")         self.socket.sendto(b\"DAT\" + dat_to_bytes(data), self.client)  elif ans[:3] == b\"DAT\":     data.update(bytes_to_dat(ans[3:])) <\/code><\/pre>\n<p>  \u041e\u0431\u043c\u0435\u043d \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c\u0443 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0443, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443 \u043d\u0430\u0441 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u0438:<\/p>\n<pre><code class=\"python\"># ----------------------------------------IP list sync------------------------------------- elif ans[:3] == b\"RQS\":     logging.debug(f\"{self.client[0]}: Sending Session List\")     sess = [i.client[0] if i.client else None for i in sessions]     sess = set(sess)     sess = sess - {None}     sess = list(sess)     sess.remove(self.client[0])     self.socket.sendto(b\"SES\" + dat_to_bytes(sess), self.client)  elif ans[:3] == b\"SES\":     sess = [i.client[0] if i.client else None for i in sessions]     sess = set(sess)     sess = sess - {None}     logging.debug(         f\"{self.client[0]}: My sessions: {sess} Recieved: {set(bytes_to_dat(ans[3:]))} New: {list(set(bytes_to_dat(ans[3:]))-sess)}\"     )     uncon = list(set(bytes_to_dat(ans[3:])) - sess)     if not uncon:         continue     adr = random.choice(uncon)     s = Session()     sessions.append(s)     self.socket.sendto(         b\"HOP\"         + socket.inet_aton(adr)         + b\"CON\"         + s.public_ip.encode(\"cp866\")         + b\":\"         + str(s.public_port).encode(\"cp866\"),         self.client,     ) <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0442\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u0432\u0430\u043b HOP. \u041e\u043d \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0433\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0433\u043e\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442\u044c \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e.<\/p>\n<p>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <b>X<\/b>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a (id \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430) \u0438 \u0434\u0430\u043d\u043d\u044b\u0435. <br \/>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 <code>2.2.2.2<\/code>, \u043d\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u043c \u0441 \u043d\u0438\u043c \u0441\u0435\u0441\u0441\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0443\u0437\u043d\u0430\u0451\u043c, \u043a\u0442\u043e \u0436\u0435 \u0441 \u043d\u0438\u043c \u044d\u0442\u0443 \u0441\u0430\u043c\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e \u0438\u043c\u0435\u0435\u0442 (\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c <code>3.3.3.3<\/code>). \u041c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043a <code>3.3.3.3<\/code> \u043f\u0430\u043a\u0435\u0442 \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c: <code>HOP+2.2.2.2+X<\/code>.<\/p>\n<p>  \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b HOP:  <\/p>\n<pre><code class=\"python\"># ----------------------------------------HOP Tracking------------------------------------- elif ans[:3] == b\"HOP\":     sess = [i.client[0] if i.client else None for i in sessions]      ip = socket.inet_ntoa(ans[3:7])     if ip in sess:         s = sessions[sess.index(ip)]         s.socket.sendto(ans[7:], s.client)  elif ans[:3] == b\"CON\":     s = Session()     adr, prt = ans[3:].decode(\"cp866\").split(\":\")     self.socket.sendto(         b\"HOP\"         + socket.inet_aton(adr)         + b\"RDY\"         + prt.encode(\"cp866\")         + b\":\"         + s.public_ip.encode(\"cp866\")         + b\":\"         + str(s.public_port).encode(\"cp866\"),         self.client,     )     try:         s.make_connection(adr, int(prt))         s.backlife_cycle(1)         sessions.append(s)     except:         logging.error(f\"{self.client[0]}: Connect initiation timeout!\")  elif ans[:3] == b\"RDY\":     myprt, adr, prt = ans[3:].decode(\"cp866\").split(\":\")     sess = [i.public_port for i in sessions]      if int(myprt) in sess:         s = sessions[sess.index(int(myprt))]         try:             s.make_connection(adr, int(prt))             s.backlife_cycle(1)         except:             logging.error(                 f\"{self.client[0]}: Connect stabilization timeout!\"             )             sessions.remove(s) <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a \u043a\u043e\u0434\u0430 \u2014 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0442\u0440\u0435\u043a\u0438\u043d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0438\u0441\u0430\u043b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b HOP. \u0418\u0437\u0432\u0438\u043d\u044f\u044e\u0441\u044c \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0435\u0433\u043e \u0442\u0443\u0442 \u0432\u0438\u0434\u0438\u0442\u0435)<\/p>\n<pre><code class=\"python\"># ----------------------------------------Disabled Trash----------------------------------- elif ans[:3] == b\"TRK\":     adr, prt = ans[3:].decode(\"cp866\").split(\",\")     sess = [i.client[0] for i in sessions]     sess.remove(self.client[0])     s = sessions[sess.index(adr)]      s.socket.sendto(         b\"CN0\"         + f\"{self.client[0].encode('cp866')}:{prt.encode('cp866')}\",         s.client,     )  elif ans[:3] == b\"CN0\":     s = Session()     self.socket.sendto(         b\"CN1\"         + f\"{s.public_ip.encode('cp866')}:{str(s.public_port).encode('cp866')}\",         self.client,     )     adr, prt = ans[3:].decode(\"cp866\").split(\":\")     s.make_connection(adr, int(prt))     sessions.append(s) elif ans[:3] == b\"TRK\":     pass <\/code><\/pre>\n<p>  \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0430\u0442\u0430 \u0432 \u0430\u0434 \u0438\u0437 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e <b>elif<\/b>, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044f \u043b\u044e\u0431\u043e\u0439 \u043c\u0443\u0441\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <b>else<\/b>.<\/p>\n<pre><code class=\"python\">else:     logging.warning(f\"{self.client[0]}: Malformed! !!!{ans}!!!\") <\/code><\/pre>\n<\/div><\/div>\n<p>  <i>\u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435:<\/i> \u0432 \u044d\u0442\u043e\u043c \u0441\u043d\u0438\u043f\u043f\u0435\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a:  <\/p>\n<ol>\n<li><b><font color=\"#3AC1EF\">KPL <\/font><\/b> \u2014 Keep Alive  <\/li>\n<li><b><font color=\"#3AC1EF\">RQH <\/font><\/b> \u2014 Request hashes  <\/li>\n<li><b><font color=\"#3AC1EF\">HAS\u00a0<\/font><\/b> \u2014 \u041f\u0430\u043a\u0435\u0442 \u0441 \u0445\u044d\u0448\u0430\u043c\u0438  <\/li>\n<li><b><font color=\"#3AC1EF\">RQD\u00a0<\/font><\/b> \u2014 Request dataset  <\/li>\n<li><b><font color=\"#3AC1EF\">DAT\u00a0<\/font><\/b> \u2014 \u043f\u0430\u043a\u0435\u0442 \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438  <\/li>\n<li><b><font color=\"#3AC1EF\">RQS\u00a0<\/font><\/b> \u2014 Request Sessions  <\/li>\n<li><b><font color=\"#3AC1EF\">SES\u00a0<\/font><\/b> \u2014 \u043f\u0430\u043a\u0435\u0442 \u0441 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438  <\/li>\n<li><b><font color=\"#3AC1EF\">HOP\u00a0<\/font><\/b> \u2014 \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u043a\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c (\u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e \u0438\u0434\u0451\u0442 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u043a\u0435\u0442)  <\/li>\n<li><b><font color=\"#3AC1EF\">CON\u00a0<\/font><\/b> \u2014 \u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f  <\/li>\n<li><b><font color=\"#3AC1EF\">RDY\u00a0<\/font><\/b> \u2014 \u041e\u0442\u0432\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043a \u0432\u0437\u0430\u0438\u043c\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e  <\/li>\n<\/ol>\n<p>  <\/p>\n<h3><font color=\"#3AC1EF\">\u258d \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/font><\/h3>\n<p>  <a name=\"UI\"><\/a>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0432 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u0443\u0431\u0440\u0430\u0442\u044c \u0440\u0443\u0447\u043d\u043e\u0439 \u0432\u0432\u043e\u0434 \u043a\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u043c\u0438\u043b\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0435\u0440\u0435\u0432\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0414\u0435\u043b\u0430\u0435\u043c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<pre><code class=\"python\">def silent():     logging.disable()   logging.warning(     f\"Logger for DEBUG is running! to diable it run {scriptname.split('.')[0]}.silent()\" ) print(     f\" Welcome to {scriptname} version from {verfrom} - event logging here: {scriptname}.log\" ) print(     f\"   Your Python version is {'.'.join([str(i) for i in sys.version_info[0:3]])}, branch {sys.version_info[3].upper()}\" ) try:     c = STUN(12346)     print(f\"     Internet connection is stable on {socket.gethostname()}!\")     if 1:         import requests          r2 = requests.get(f\"http:\/\/ipinfo.io\/{c[0]}\").json()[\"org\"]         print(             f\"       Gray  (local)  IP is {socket.gethostbyname(socket.gethostname())}\"         )         print(f\"       While (public) IP is {c[0]} - {r2}\")     else:         print(             f\"       Gray  (local)  IP is {socket.gethostbyname(socket.gethostname())}\"         )         print(f\"       While (public) IP is {c[0]}\") except Exception as e:     logging.critical(e)     print(f\" No internet connection found! I cant work offline!\") <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (\u0434\u0435\u0440\u0435\u0432\u0430):<\/p>\n<pre><code class=\"python\"> import re  def get_tree(data):     data = data.copy()     data.update({\"00000000\": \"Root\"})     # data.update({\"11111111\":\"Root\"})     data.update({\"ffffffff\": \"Lost\"})     dct = {}      for key, message in data.items():         if key + \": \" + message not in dct:             dct.update({key + \": \" + message: []})      for key, message in data.items():         rep = [i[1:] for i in re.findall(\"@+[a-z0-9]{8}\", message)]          if len(rep) > 0:             rep = rep[0]         else:             rep = \"00000000\"          if rep not in data:             rep = \"ffffffff\"         if rep + \": \" + data[rep] in dct:             dct[rep + \": \" + data[rep]].append(key + \": \" + message)         else:             pass             # dct.update({rep+\": \"+data[rep]:[key+\": \"+message]})     # print(dct)     dct[\"00000000: Root\"].remove(\"00000000: Root\")     for k, v in list(dct.items()).copy():         if v == []:             dct.pop(k)     return dct <\/code><\/pre>\n<p>  \u041f\u0438\u0448\u0435\u043c <b>MAIN<\/b> \u0441 \u0441\u0430\u043c\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c:<\/p>\n<pre><code class=\"python\"> if __name__ == \"__main__\":     data_load()     print()     inp = input(         \"You must to connect with one node (friend), which is already in net. (Press Enter when you and your friend are ready)\"     )     s = Session()     print()     print(f\"Send this to your friend {addr2int(s.public_ip,int(s.public_port))}\")     print()     i, p = int2addr(int(input(\"Input the number from your friend: \")))     print(\"Waiting for your friend\")     s.make_connection(i, p)     sessions.append(s)     s.backlife_cycle(1)     while 1:         print()         print(\"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550> Connect &amp; Chan Panel &lt;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\")         print(\"\u255f> Type and enter your post\")         print(\"\u255f> (Empty input + Enter) to see Root\")         print(\"\u255f> ($00000000) to see specific thread\")         print(\"\u255f> (!) for new connection\")         print(\"\u255f> (#) to save checkpoint\")         print(\"\u255f> (`) dev console\")         print(\"\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550>\")         inp = input(\"Input: \")         print(\"&lt;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550> Connect &amp; Chan Info &lt;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550>\")         print(             f\" Connected Nodes: {len(sessions)} | Size of Chan tree: {len(dat_to_bytes(data))} bytes\\n\"         )          if inp == \"\":             ptree(\"00000000: Root\", get_tree(data))          elif inp == \"!\":             s = Session()             print(                 f\"Send this to your friend {addr2int(s.public_ip,int(s.public_port))}\"             )             print()             inp = input(\"Input the number from your friend (Empty to cancel): \")             if inp:                 i, p = int2addr(int(inp))                 print(\"Waiting for your friend\")                 try:                     s.make_connection(i, p)                     sessions.append(s)                     s.backlife_cycle(1)                 except:                     print(\"Timeout(\")         elif inp == \"`\":             try:                 debug.shell()             except:                 pass         elif inp == \"#\":             data_dump()         elif inp[0] == \"$\":             if inp[1:] in data:                 ptree(f\"{inp[1:]}: {data[inp[1:]]}\", get_tree(data))             else:                 print(f\"There is no message with id [{inp[1:]}]\")         elif inp:             data_add(inp)         else:             ptree(\"00000000: Root\", get_tree(data))         input(\"\\n\\nEnter to reload page\")         cls()<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p><a name=\"TEST\"><\/a><br \/>  \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0435\u0441\u0441\u0438\u044e \u0432\u00a0<a href=\"https:\/\/colab.research.google.com\/\">google colab<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0440\u043e\u043b\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u0430 (\u0442\u0443\u0442 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0448\u0443\u0442\u043a\u0430 \u043f\u0440\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445).<\/p>\n<h2><font color=\"#3AC1EF\">\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/font><\/h2>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043e\u0442 \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/942\/0a9\/523\/9420a9523c27131aee2e44139fd1ed72.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/942\/0a9\/523\/9420a9523c27131aee2e44139fd1ed72.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0441\u0435\u0442\u0438<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/777\/2d7\/da5\/7772d7da5edb6388ed7466c9144d9a7e.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/777\/2d7\/da5\/7772d7da5edb6388ed7466c9144d9a7e.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d6\/f44\/447\/4d6f44447b16e024d7add7900069dd32.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d6\/f44\/447\/4d6f44447b16e024d7add7900069dd32.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8f3\/d87\/cd3\/8f3d87cd3448914b0fe1bc232931e52a.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8f3\/d87\/cd3\/8f3d87cd3448914b0fe1bc232931e52a.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0434\u0440\u0443\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u0430\u043d\u043d\u044b\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb6\/ea4\/a58\/cb6ea4a58a041c66dd75dc5df69b28b8.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb6\/ea4\/a58\/cb6ea4a58a041c66dd75dc5df69b28b8.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0442\u0432\u0435\u0442\u0438\u043c \u043d\u0430 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e8f\/2ab\/8f8\/e8f2ab8f83c296c115c701bf42c98bfd.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e8f\/2ab\/8f8\/e8f2ab8f83c296c115c701bf42c98bfd.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  \u0418 \u0435\u0449\u0451 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0444\u0435\u0439\u043a\u043e\u0432\u044b\u0439 12312312 \u0445\u044d\u0448.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0434\u0440\u0443\u0433 \u0432\u0438\u0434\u0438\u0442 \u043e\u0431\u0430 (\u0430 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u0438\u043b\u043e\u0441\u044c \u043a \u0432\u0435\u0442\u043a\u0435 Lost):<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/652\/378\/ce0\/652378ce0bcb57e6476dc824207cd350.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/652\/378\/ce0\/652378ce0bcb57e6476dc824207cd350.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u0445\u044d\u0448\u0435\u043c 12312312, \u0442\u043e \u043e\u043d\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e.<\/p><\/blockquote>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0440\u044d\u0434 \u0432\u043c\u0435\u0441\u0442\u043e Root:<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/922\/16e\/40e\/92216e40e0a374f5f03e7fcae5566758.png\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/922\/16e\/40e\/92216e40e0a374f5f03e7fcae5566758.png\"\/>  <\/div>\n<\/p><\/div>\n<p>  \u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0442\u0440\u0438 \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u044b\u043b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438 \u043e\u043d\u0438 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u2014 \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0443\u0441\u043f\u0435\u0445.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041b\u043e\u0433\u0438 \u043d\u043e\u0434\u044b (\u044f \u0436\u0435 \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u0451\u0441 \u0432\u0441\u0451 \u043d\u0430 \u043b\u043e\u0433\u0433\u0435\u0440, \u0432\u0435\u0440\u043d\u043e?)<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\">2023-07-27 21:05:30,651 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:34,622 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:34,622 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:37,502 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:37,502 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:37,502 34.74.93.102: Requesting Datagram     60 2023-07-27 21:05:37,502 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:37,502 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:39,647 34.74.93.102: Recieved DAT from ('34.74.93.102', 26698): b'DAT{\"54b2b91c\": \"hello\", \"f41fe2a9\": \"Reply to @54b2b91c!\", \"894df995\": \"Malformed, lol @12345678\", \"1508abcd\": \"text\", \"0f0961d5\": \"#\"}' 2023-07-27 21:05:39,647 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:44,532 34.74.93.102: Recieved RQD from ('34.74.93.102', 26698): b'RQD' 2023-07-27 21:05:44,532 34.74.93.102: Sending datagram 2023-07-27 21:05:44,532 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:48,152 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:05:53,749 34.74.93.102: Recieved RQD from ('34.74.93.102', 26698): b'RQD' 2023-07-27 21:05:53,749 34.74.93.102: Sending datagram 2023-07-27 21:05:53,749 34.74.93.102: Recieved RQS from ('34.74.93.102', 26698): b'RQS' 2023-07-27 21:05:53,749 34.74.93.102: Sending Session List 2023-07-27 21:05:53,750 34.74.93.102: Recieved RQD from ('34.74.93.102', 26698): b'RQD' 2023-07-27 21:05:53,750 34.74.93.102: Sending datagram 2023-07-27 21:05:53,750 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:01,225 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:03,857 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:03,857 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:03,857 34.74.93.102: Requesting Datagram     61 2023-07-27 21:06:07,235 34.74.93.102: Recieved DAT from ('34.74.93.102', 26698): b'DAT{\"54b2b91c\": \"hello\", \"f41fe2a9\": \"Reply to @54b2b91c!\", \"894df995\": \"Malformed, lol @12345678\", \"1508abcd\": \"text\", \"0f0961d5\": \"#\"}' 2023-07-27 21:06:07,235 34.74.93.102: Recieved RQD from ('34.74.93.102', 26698): b'RQD' 2023-07-27 21:06:07,235 34.74.93.102: Sending datagram 2023-07-27 21:06:07,235 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:11,860 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:11,860 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:14,504 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:24,636 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:24,636 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:24,636 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:24,636 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:28,006 34.74.93.102: Recieved RQD from ('34.74.93.102', 26698): b'RQD' 2023-07-27 21:06:28,006 34.74.93.102: Sending datagram 2023-07-27 21:06:28,006 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:28,006 34.74.93.102: Requesting Datagram     62 2023-07-27 21:06:28,007 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:28,007 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:28,007 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:37,933 34.74.93.102: Recieved DAT from ('34.74.93.102', 26698): b'DAT{\"54b2b91c\": \"hello\", \"f41fe2a9\": \"Reply to @54b2b91c!\", \"894df995\": \"Malformed, lol @12345678\", \"1508abcd\": \"text\", \"0f0961d5\": \"#\"}' 2023-07-27 21:06:37,933 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:37,933 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:37,933 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:37,933 34.74.93.102: Requesting Session List 19 2023-07-27 21:06:37,933 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:37,933 34.74.93.102: Recieved KPL from ('34.74.93.102', 26698): b'KPL' 2023-07-27 21:06:37,933 34.74.93.102: Requesting Datagram     63 2023-07-27 21:06:47,334 34.74.93.102: Recieved SES from ('34.74.93.102', 26698): b'SES[\"34.147.33.206\"]' 2023-07-27 21:06:47,334 34.74.93.102: My sessions: {'34.74.93.102'} Recieved: {'34.147.33.206'} New: ['34.147.33.206'] 2023-07-27 21:06:47,334 STUN request via stun.ekiga.net<\/code><\/pre>\n<p>  \u0412\u0438\u0434\u0438\u043c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0440\u0430\u043d\u044c\u0448\u0435. \u041d\u043e\u0434\u044b \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f KPL, \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0432\u0435\u0440\u044f\u044f \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u044b \u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0441\u0435\u0441\u0441\u0438\u0439.  <\/div>\n<\/p><\/div>\n<p><a name=\"CONC\"><\/a>  <\/p>\n<h2><font color=\"#3AC1EF\">As conclusion<\/font><\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3ce\/f5c\/428\/3cef5c428a7ab78d8c22732fc9438a70.jpg\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3ce\/f5c\/428\/3cef5c428a7ab78d8c22732fc9438a70.jpg\" data-blurred=\"true\"\/><\/p>\n<p>  \u041f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0434\u0430\u0436\u0435 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b. \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u043a\u0430 \u043f\u043e\u0440\u0442\u043e\u0432 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u044e\u0437\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u2014 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443 \u043d\u0435\u0442 \u043f\u0440\u0435\u0434\u0435\u043b\u0430. \u041a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c ip \u0435\u0449\u0451 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043e\u0442 \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0439 \u043f\u0430\u0440\u044b \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0432 \u0441\u044b\u0440\u043e\u043c \u0432\u0438\u0434\u0435, \u0430 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044d\u0442\u043e\u0439 \u043f\u0430\u0440\u043e\u0439 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0433 \u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c (\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0448 \u0434\u0440\u0443\u0433). \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0432\u0435\u0440\u0445 \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c <a href=\"https:\/\/www.electronjs.org\/\">electron<\/a>\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u2026<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 CnC.py<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">from pathlib import Path import time import os import sys   def cls():     os.system(\"cls\" if os.name == \"nt\" else \"clear\")   try:     scriptname = Path(__file__).name except:     scriptname = \"CnC.py\" try:     verfrom = time.ctime(os.path.getmtime(__file__)) except:     verfrom = \"!No time!\"   import threading import socket import random import hashlib import json import logging import pdb   class Debug(pdb.Pdb):     def __init__(self, *args, **kwargs):         super(Debug, self).__init__(*args, **kwargs)         self.prompt = \"CnC Debug Shell >>> \"      def shell(self):         self.set_trace()   debug = Debug() # logging.warn(f\"Event logging is enabled. You can see it in {scriptname}.log\") logging.basicConfig(     format=\"%(asctime)s %(message)s\", level=logging.DEBUG, filename=f\"{scriptname}.log\" ) logging.info(\"Hello world!\") logging.getLogger().setLevel(logging.DEBUG)   def get_files():     matches = []     for root, dirs, files in os.walk(os.getcwd()):         for file in files:             if file.endswith(\".html\"):                 matches.append(os.path.splitext(file)[0])     return matches   def dat_to_bytes(diction: dict) -> bytes:     return json.dumps(diction).encode(\"cp866\")   def bytes_to_dat(byte: bytes) -> dict:     return json.loads(byte.decode(\"cp866\"))   def checksum(b):     return hashlib.blake2s(b, digest_size=4).hexdigest()   _alreadyused = set()   def randomport():     global _alreadyused     p = random.randint(16000, 65535)     while p in _alreadyused:         p = random.randint(16000, 65535)     _alreadyused.update({p})     return p   def aegis(f):     def wr():         while 1:             try:                 f()                 break             except Exception as e:                 logging.critical(e)      return wr   def STUN(port, host=\"stun.ekiga.net\"):     logging.debug(f\"STUN request via {host}\")     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)     sock.bind((\"0.0.0.0\", port))     sock.setblocking(0)     server = socket.gethostbyname(host)     work = True     while work:         sock.sendto(             b\"\\x00\\x01\\x00\\x00!\\x12\\xa4B\\xd6\\x85y\\xb8\\x11\\x030\\x06xi\\xdfB\",             (server, 3478),         )         for i in range(20):             try:                 ans, addr = sock.recvfrom(2048)                 work = False                 break             except:                 time.sleep(0.01)      sock.close()     return socket.inet_ntoa(ans[28:32]), int.from_bytes(ans[26:28], byteorder=\"big\")   def addr2int(ip, port: int):     binport = bin(port)[2:].rjust(16, \"0\")     binip = \"\".join([bin(int(i))[2:].rjust(8, \"0\") for i in ip.split(\".\")])     return int(binip + binport, 2)   def int2addr(num):     num = bin(num)[2:].rjust(48, \"0\")     print(num)     num = [         str(int(i, 2))         for i in [num[0:8], num[8:16], num[16:24], num[24:32], num[32:48]]     ]     return \".\".join(num[0:4]), int(num[4])   pool = []  # Pool for commands to any session (like RQD to initiate data update)  missed_messages = (     set() )  # Storage for hashes of required but missed messages (to request them later)  data = {} sessions = []   def mass_command(c):     global pool     pool.append(c)   def data_add(item):     data.update({checksum(item.encode(\"cp866\")): item})   def data_dump():     with open(f\"{scriptname}.chat-savefile.json\", \"w\") as f:         json.dump(icm2.data, f)   def data_load():     global data     try:         with open(f\"{scriptname}.chat-savefile.json\", \"r\") as f:             data = json.load(f)     except:         logging.error(f\"No save file exists! New one created\")         with open(f\"{scriptname}.chat-savefile.json\", \"w\") as f:             json.dump({}, f)   class Session:     def __init__(self):         # self.prefix=\"IDL\"         self.immortal = False         self.local_port = randomport()         for i in range(10):             self.public_ip, self.public_port = STUN(self.local_port)         self.socket = None         self.client = None         self.thread = None         logging.info(f'\"{self.public_ip}\",{self.public_port}')      def make_connection(self, ip, port, timeout=10):         logging.debug(f\"Start waiting for handshake with {ip}:{port}\")         sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)         sock.bind((\"0.0.0.0\", self.local_port))         sock.setblocking(0)         while True:             sock.sendto(b\"Con. Request!\", (ip, port))             time.sleep(2)             try:                 ans, addr = sock.recvfrom(9999)                 sock.sendto(b\"Con. Request!\", (ip, port))                 sock.close()                 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)                 sock.bind((\"0.0.0.0\", self.local_port))                 sock.setblocking(0)                 self.client = (ip, port)                 self.socket = sock                 logging.debug(f\"Hole with {self.client} punched!\")                 break             except Exception as e:                 assert timeout > 0                 timeout -= 1                 logging.debug(f\"No handshake with {ip}:{port} yet...\")      def backlife_cycle(self, freq=1):         global sessions         if self.immortal:             logging.warning(f\"{self.client} session beacame immortal\")             self.life_cycle = aegis(self.life_cycle)         th = threading.Thread(target=self.life_cycle, args=(freq,))         th.start()         self.thread = th         logging.warning(f\"Session with {self.client} stabilized!\")         # sessions.append(self)      def life_cycle(self, freq=1):         global data         global sessions         global pool         c = 0         while 1:             if len(pool):                 pref = pool.pop(0)             else:                 pref = b\"KPL\"              self.socket.sendto(pref, self.client)  # Keep-alive             time.sleep(max(random.gauss(1 \/ freq, 3), 0))              while True:                 try:                     ans, reply_addr = self.socket.recvfrom(9999)                     logging.debug(                         f\"{self.client[0]}: Recieved {ans[:3].decode('cp866')} from {reply_addr}: {ans}\"                     )                 except:                     break                  if ans[:3] == b\"KPL\":                     c += 1                     if c % 10 == 0:                         logging.debug(                             f\"{self.client[0]}: Requesting Datagram     {c\/\/10}\"                         )                         self.socket.sendto(b\"RQD\", self.client)                         c += 1                     elif c % 33 == 0:                         logging.debug(                             f\"{self.client[0]}: Requesting Session List {c\/\/33}\"                         )                         self.socket.sendto(b\"RQS\", self.client)                         c += 1                  # ----------------------------------------Hashes (keys) sync (disabled now)----------------------------------------                 elif ans[:3] == b\"RQH\":                     logging.debug(f\"{self.client[0]}: Sending hashes\")                     self.socket.sendto(                         b\"HAS\" + dat_to_bytes(list(data.keys())), self.client                     )                  elif ans[:3] == b\"HAS\":                     missed_messages.update(                         set(bytes_to_dat(ans[3:])) - set(data.keys())                     )                  # ----------------------------------------Data sync----------------------------------------                 elif ans[:3] == b\"RQD\":                     if ans[3:] != b\"\":                         logging.debug(f\"{self.client[0]}: Sending specific datagram\")                         n = {}                         r = set(bytes_to_dat(ans[3:]))                         for i in r:                             if i in data:                                 n.update({i: data[i]})                         logging.debug(f\"{self.client[0]}: Sending {n}\")                         self.socket.sendto(b\"DAT\" + dat_to_bytes(n), self.client)                     else:                         logging.debug(f\"{self.client[0]}: Sending datagram\")                         self.socket.sendto(b\"DAT\" + dat_to_bytes(data), self.client)                  elif ans[:3] == b\"DAT\":                     data.update(bytes_to_dat(ans[3:]))                  # ----------------------------------------IP list sync-------------------------------------                 elif ans[:3] == b\"RQS\":                     logging.debug(f\"{self.client[0]}: Sending Session List\")                     sess = [i.client[0] if i.client else None for i in sessions]                     sess = set(sess)                     sess = sess - {None}                     sess = list(sess)                     sess.remove(self.client[0])                     self.socket.sendto(b\"SES\" + dat_to_bytes(sess), self.client)                  elif ans[:3] == b\"SES\":                     sess = [i.client[0] if i.client else None for i in sessions]                     sess = set(sess)                     sess = sess - {None}                     logging.debug(                         f\"{self.client[0]}: My sessions: {sess} Recieved: {set(bytes_to_dat(ans[3:]))} New: {list(set(bytes_to_dat(ans[3:]))-sess)}\"                     )                     uncon = list(set(bytes_to_dat(ans[3:])) - sess)                     if not uncon:                         continue                     adr = random.choice(uncon)                     s = Session()                     sessions.append(s)                     self.socket.sendto(                         b\"HOP\"                         + socket.inet_aton(adr)                         + b\"CON\"                         + s.public_ip.encode(\"cp866\")                         + b\":\"                         + str(s.public_port).encode(\"cp866\"),                         self.client,                     )                 # ----------------------------------------HOP Tracking-------------------------------------                 elif ans[:3] == b\"HOP\":                     sess = [i.client[0] if i.client else None for i in sessions]                      ip = socket.inet_ntoa(ans[3:7])                     if ip in sess:                         s = sessions[sess.index(ip)]                         s.socket.sendto(ans[7:], s.client)                  elif ans[:3] == b\"CON\":                     s = Session()                     adr, prt = ans[3:].decode(\"cp866\").split(\":\")                     self.socket.sendto(                         b\"HOP\"                         + socket.inet_aton(adr)                         + b\"RDY\"                         + prt.encode(\"cp866\")                         + b\":\"                         + s.public_ip.encode(\"cp866\")                         + b\":\"                         + str(s.public_port).encode(\"cp866\"),                         self.client,                     )                     try:                         s.make_connection(adr, int(prt))                         s.backlife_cycle(1)                         sessions.append(s)                     except:                         logging.error(f\"{self.client[0]}: Connect initiation timeout!\")                  elif ans[:3] == b\"RDY\":                     myprt, adr, prt = ans[3:].decode(\"cp866\").split(\":\")                     sess = [i.public_port for i in sessions]                      if int(myprt) in sess:                         s = sessions[sess.index(int(myprt))]                         try:                             s.make_connection(adr, int(prt))                             s.backlife_cycle(1)                         except:                             logging.error(                                 f\"{self.client[0]}: Connect stabilization timeout!\"                             )                             sessions.remove(s)                  # ----------------------------------------Disabled Trash-----------------------------------                 elif ans[:3] == b\"TRK\":                     adr, prt = ans[3:].decode(\"cp866\").split(\",\")                     sess = [i.client[0] for i in sessions]                     sess.remove(self.client[0])                     s = sessions[sess.index(adr)]                      s.socket.sendto(                         b\"CN0\"                         + f\"{self.client[0].encode('cp866')}:{prt.encode('cp866')}\",                         s.client,                     )                  elif ans[:3] == b\"CN0\":                     s = Session()                     self.socket.sendto(                         b\"CN1\"                         + f\"{s.public_ip.encode('cp866')}:{str(s.public_port).encode('cp866')}\",                         self.client,                     )                     adr, prt = ans[3:].decode(\"cp866\").split(\":\")                     s.make_connection(adr, int(prt))                     sessions.append(s)                 elif ans[:3] == b\"TRK\":                     pass                 else:                     logging.warning(f\"{self.client[0]}: Malformed! !!!{ans}!!!\")   # It is like a legacy code, bruh: (https:\/\/stackoverflow.com\/questions\/51903172\/how-to-display-a-tree-in-python-similar-to-msdos-tree-command) def ptree(start, tree, indent_width=4):     def _ptree(start, parent, tree, grandpa=None, indent=\"\"):         if parent != start:             if grandpa is None:  # Ask grandpa kids!                 print(parent, end=\"\")             else:                 print(parent)         if parent not in tree:             return          for child in tree[parent][:-1]:             print(indent + \"\u251c\" + \"\u2500\" * indent_width, end=\"\")             _ptree(start, child, tree, parent, indent + \"\u2502\" + \" \" * 4)         child = tree[parent][-1]         print(indent + \"\u2514\" + \"\u2500\" * indent_width, end=\"\")         _ptree(start, child, tree, parent, indent + \" \" * 5)  # 4 -> 5      parent = start     print(start)     _ptree(start, parent, tree)   def silent():     logging.disable()   logging.warning(     f\"Logger for DEBUG is running! to diable it run {scriptname.split('.')[0]}.silent()\" ) print(     f\" Welcome to {scriptname} version from {verfrom} - event logging here: {scriptname}.log\" ) print(     f\"   Your Python version is {'.'.join([str(i) for i in sys.version_info[0:3]])}, branch {sys.version_info[3].upper()}\" ) try:     c = STUN(12346)     print(f\"     Internet connection is stable on {socket.gethostname()}!\")     if 1:         import requests          r2 = requests.get(f\"http:\/\/ipinfo.io\/{c[0]}\").json()[\"org\"]         print(             f\"       Gray  (local)  IP is {socket.gethostbyname(socket.gethostname())}\"         )         print(f\"       While (public) IP is {c[0]} - {r2}\")     else:         print(             f\"       Gray  (local)  IP is {socket.gethostbyname(socket.gethostname())}\"         )         print(f\"       While (public) IP is {c[0]}\") except Exception as e:     logging.critical(e)     print(f\" No internet connection found! I cant work offline!\")   import re   def get_tree(data):     data = data.copy()     data.update({\"00000000\": \"Root\"})     # data.update({\"11111111\":\"Root\"})     data.update({\"ffffffff\": \"Lost\"})     dct = {}      for key, message in data.items():         if key + \": \" + message not in dct:             dct.update({key + \": \" + message: []})      for key, message in data.items():         rep = [i[1:] for i in re.findall(\"@+[a-z0-9]{8}\", message)]          if len(rep) > 0:             rep = rep[0]         else:             rep = \"00000000\"          if rep not in data:             rep = \"ffffffff\"         if rep + \": \" + data[rep] in dct:             dct[rep + \": \" + data[rep]].append(key + \": \" + message)         else:             pass             # dct.update({rep+\": \"+data[rep]:[key+\": \"+message]})     # print(dct)     dct[\"00000000: Root\"].remove(\"00000000: Root\")     for k, v in list(dct.items()).copy():         if v == []:             dct.pop(k)     return dct   if __name__ == \"__main__\":     data_load()     print()     inp = input(         \"You must to connect with one node (friend), which is already in net. (Press Enter when you and your friend are ready)\"     )     s = Session()     print()     print(f\"Send this to your friend {addr2int(s.public_ip,int(s.public_port))}\")     print()     i, p = int2addr(int(input(\"Input the number from your friend: \")))     print(\"Waiting for your friend\")     s.make_connection(i, p)     sessions.append(s)     s.backlife_cycle(1)     while 1:         print()         print(\"\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550> Connect &amp; Chan Panel &lt;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\")         print(\"\u255f> Type and enter your post\")         print(\"\u255f> (Empty input + Enter) to see Root\")         print(\"\u255f> ($00000000) to see specific thread\")         print(\"\u255f> (!) for new connection\")         print(\"\u255f> (#) to save checkpoint\")         print(\"\u255f> (`) dev console\")         print(\"\u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550>\")         inp = input(\"Input: \")         print(\"&lt;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550> Connect &amp; Chan Info &lt;\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550>\")         print(             f\" Connected Nodes: {len(sessions)} | Size of Chan tree: {len(dat_to_bytes(data))} bytes\\n\"         )          if inp == \"\":             ptree(\"00000000: Root\", get_tree(data))          elif inp == \"!\":             s = Session()             print(                 f\"Send this to your friend {addr2int(s.public_ip,int(s.public_port))}\"             )             print()             inp = input(\"Input the number from your friend (Empty to cancel): \")             if inp:                 i, p = int2addr(int(inp))                 print(\"Waiting for your friend\")                 try:                     s.make_connection(i, p)                     sessions.append(s)                     s.backlife_cycle(1)                 except:                     print(\"Timeout(\")         elif inp == \"`\":             try:                 debug.shell()             except:                 pass         elif inp == \"#\":             data_dump()         elif inp[0] == \"$\":             if inp[1:] in data:                 ptree(f\"{inp[1:]}: {data[inp[1:]]}\", get_tree(data))             else:                 print(f\"There is no message with id [{inp[1:]}]\")         elif inp:             data_add(inp)         else:             ptree(\"00000000: Root\", get_tree(data))         input(\"\\n\\nEnter to reload page\")         cls()<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0425\u043e\u0442\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c. <\/p>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043f\u043e\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0432\u0430\u0441 \u0437\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e. \u041d\u0435 \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u0434\u043e\u0441\u044e\u0434\u0430 \u0432\u0441\u0435 \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u043d\u0438\u043a\u0430\u043b\u0438 \u0432\u043e \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u044b, \u043c\u043e\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0449\u0451 \u0437\u0434\u0435\u0441\u044c\u2026<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u0435\u0440\u0436\u0438 \u043c\u0438\u043b\u044b\u0435 \u043e\u0431\u043e\u0438 \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ru\/hh\/ob\/ruhhobvxnh2haqrwru6ejkipwcs.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ru\/hh\/ob\/ruhhobvxnh2haqrwru6ejkipwcs.png\"\/>  <\/p>\n<blockquote><p>\u0418\u043b\u0438 \u0442\u0438\u0437\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e ML, \u0442\u0443\u0442 \u043a\u0430\u043a \u0437\u043d\u0430\u0442\u044c&#8230;<\/p><\/blockquote>\n<\/div><\/div>\n<p>  \u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, feedback \u0438 \u0437\u0434\u0440\u0430\u0432\u0430\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f. \u0421\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<blockquote><p><b><font color=\"#3AC1EF\"><a href=\"https:\/\/t.me\/ruvds_community\">Telegram-\u043a\u0430\u043d\u0430\u043b \u0441 \u0440\u043e\u0437\u044b\u0433\u0440\u044b\u0448\u0430\u043c\u0438 \u043f\u0440\u0438\u0437\u043e\u0432, \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u043c\u0438 IT \u0438 \u043f\u043e\u0441\u0442\u0430\u043c\u0438 \u043e \u0440\u0435\u0442\u0440\u043e\u0438\u0433\u0440\u0430\u0445 ?\ufe0f<\/a><\/font><\/b><\/p><\/blockquote>\n<p><a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=CodeDroidX&amp;utm_content=p2p_forum_s_nulya_ot_nat_hole_punching_do_avtonomnoj_i_polnostyu_decentralizovannoj_seti\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/tp\/sk\/z-\/tpskz-7w7a8e74isoowuep40xeg.png\" data-src=\"https:\/\/habrastorage.org\/webt\/tp\/sk\/z-\/tpskz-7w7a8e74isoowuep40xeg.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/761188\/\"> https:\/\/habr.com\/ru\/articles\/761188\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/companies\/ruvds\/articles\/761188\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/go\/c6\/fb\/goc6fbxehf6l6rs6ihvnw5mmzy8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/go\/c6\/fb\/goc6fbxehf6l6rs6ihvnw5mmzy8.png\"\/><\/div>\n<p><\/a><br \/>  \u041c\u043d\u043e\u0433\u0438\u0435, \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u043e\u043a\u0435\u0442\u0430\u043c\u0438 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0441\u0444\u0435\u0440\u0435 IT, \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u043e\u00a0<i>\u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0435 \u043f\u043e\u0440\u0442\u043e\u0432<\/i>. \u0421\u0432\u044f\u0437\u0430\u043d\u043e \u044d\u0442\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u0434\u043e\u043c\u0430\u0448\u043d\u0438\u0445\/\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445\/\u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u043e\u0443\u0442\u0435\u0440\u0430\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/NAT\">NAT<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0432 \u044d\u0442\u0438\u0445 \u043f\u043e\u0434\u0441\u0435\u0442\u044f\u0445 \u0438\u0437\u0432\u043d\u0435, \u043e\u0431\u0449\u0430\u044f\u0441\u044c \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c \u043e\u0442 \u0438\u0445 \u0438\u043c\u0435\u043d\u0438.<\/p>\n<p>  \u0423 NAT \u0435\u0441\u0442\u044c \u043a\u0438\u043b\u043b\u0435\u0440-\u0444\u0438\u0447\u0430 \u2014 \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439\u00a0<i><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B5%D0%B6%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD\">\u0444\u0430\u0435\u0440\u0432\u043e\u043b<\/a><\/i>: \u0430\u0442\u0430\u043a\u0438 \u0438\u0437\u0432\u043d\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u0442\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A3%D0%B4%D0%B0%D0%BB%D1%91%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D1%8B%D0%B5_%D0%B0%D1%82%D0%B0%D0%BA%D0%B8\">\u0430\u0442\u0430\u043a \u043d\u0430 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u041e\u0421<\/a>.<\/p>\n<p>  \u041d\u043e, \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0442\u044b \u0437\u0430\u0445\u043e\u0447\u0435\u0448\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e <i>\u0437\u0430 NAT<\/i> \u0432 \u0431\u043b\u0430\u0433\u0438\u0445 \u0446\u0435\u043b\u044f\u0445, \u0442\u043e \u0442\u044b \u0447\u0438\u0441\u0442\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0448\u044c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 <i>\u0443 \u043d\u0435\u0433\u043e\u00a0\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u0431\u044f \u043d\u0435\u0442 IP-\u0430\u0434\u0440\u0435\u0441\u0430.<\/i><\/p>\n<p>  \u0420\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445, \u0442. \u0435. \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u0443\u044e \u043d\u043e\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0431\u0435\u043b\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 (\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0437\u0430 NAT). \u0412\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u00ab\u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438\u00bb \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u043f\u0430\u0434\u0430\u0435\u0442. \u041e\u0434\u043d\u0430\u043a\u043e \u0447\u0438\u0441\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u0442\u0430\u043a \u0435\u0449\u0451 \u0438 \u043d\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0430\u0434\u0451\u0442, \u0442\u043e \u0432\u0441\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0437\u0430 \u043d\u0438\u043c (\u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u043a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0435 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0445 \u0442\u0430\u043c kubernetes).<\/p>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0434\u0430\u0436\u0435 \u0432 \u0440\u0435\u0430\u043b\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0437\u0430 NAT\u0430\u043c\u0438,\u00a0<strong><font color=\"#3AC1EF\">P2P \u0440\u0435\u0430\u043b\u0435\u043d<\/font><\/strong>. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0435\u0441\u044c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c bittorrent-\u0440\u0430\u0437\u0434\u0430\u0447\u0438, \u0442\u0440\u0430\u043d\u0441\u0444\u0435\u0440 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u041f\u043e\u0438\u0441\u043a \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0451\u043b \u043c\u0435\u043d\u044f \u0432 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0435 \u0434\u0435\u0431\u0440\u0438, \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0432\u0435\u0440\u043b\u0435\u0439\u043d\u0443\u044e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D0%B4%D0%BD%D0%BE%D1%80%D0%B0%D0%BD%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F_%D1%81%D0%B5%D1%82%D1%8C\">p2p-\u0441\u0435\u0442\u044c<\/a>, \u0433\u0434\u0435\u00a0<a href=\"https:\/\/ru.wikipedia.org\/wiki\/BitTorrent-%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80\">\u0442\u0440\u0435\u043a\u0435\u0440\u0430\u043c\u0438<\/a>\u00a0\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u0438 \u0435\u0451 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-354954","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354954","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=354954"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354954\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=354954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=354954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=354954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}