{"id":90,"date":"2024-11-29T02:35:31","date_gmt":"2024-11-28T23:35:31","guid":{"rendered":"https:\/\/tech.itsx.ru\/?p=90"},"modified":"2025-06-24T21:28:17","modified_gmt":"2025-06-24T18:28:17","slug":"90","status":"publish","type":"post","link":"https:\/\/tech.itsx.ru\/?p=90","title":{"rendered":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 OpenVPN \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435"},"content":{"rendered":"\n\n   \n    <style>\n        h1 {\n            font-size: 2em;\n            color: #333;\n            border-bottom: 2px solid #ddd;\n            padding-bottom: 10px;\n        }\n        h2 {\n            font-size: 1.5em;\n            color: #555;\n            margin-top: 20px;\n        }\n        p {\n            margin: 10px 0;\n        }\n        .code-block {\n            background-color: #f7f7f7;\n            border: 1px solid #ddd;\n            border-radius: 5px;\n            padding: 10px;\n            margin: 15px 0;\n            position: relative;\n            font-family: monospace;\n        }\n        .copy-btn {\n            position: absolute;\n            top: 10px;\n            right: 10px;\n            background-color: #4CAF50;\n            color: white;\n            border: none;\n            border-radius: 3px;\n            padding: 5px 10px;\n            cursor: pointer;\n            font-size: 0.8em;\n        }\n        .copy-btn:hover {\n            background-color: #45a049;\n        }\n        pre {\n            margin: 0;\n            font-size: 0.9em;\n            white-space: pre-wrap;\n            word-wrap: break-word;\n        }\n    <\/style>\n\n    <h1>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 OpenVPN \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435<\/h1>\n    <p>\u0412 \u044d\u0442\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 OpenVPN \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 Docker, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0431\u0440\u0430\u0437 <code>kylemanna\/openvpn<\/code>.<\/p>\n\n    <h2>1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h2>\n    <p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 Docker volume, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e OpenVPN:<\/p>\n    <div class=\"code-block\">\n        <button class=\"copy-btn\" onclick=\"copyToClipboard('docker volume create --name ovpn-data')\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434<\/button>\n        <pre>docker volume create --name ovpn-data<\/pre>\n    <\/div>\n\n    <p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>ovpn_genconfig<\/code>:<\/p>\n    <div class=\"code-block\">\n        <button class=\"copy-btn\" onclick=\"copyToClipboard('docker run -v ovpn-data:\/etc\/openvpn --rm kylemanna\/openvpn ovpn_genconfig -u udp:\/\/VPN.SERVERNAME.COM')\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434<\/button>\n        <pre>docker run -v ovpn-data:\/etc\/openvpn --rm kylemanna\/openvpn ovpn_genconfig -u udp:\/\/VPN.SERVERNAME.COM<\/pre>\n    <\/div>\n\n    <h2>2. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f PKI<\/h2>\n    <p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439\u0442\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 (PKI):<\/p>\n    <div class=\"code-block\">\n        <button class=\"copy-btn\" onclick=\"copyToClipboard('docker run -v ovpn-data:\/etc\/openvpn --rm -it kylemanna\/openvpn ovpn_initpki')\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434<\/button>\n        <pre>docker run -v ovpn-data:\/etc\/openvpn --rm -it kylemanna\/openvpn ovpn_initpki<\/pre>\n    <\/div>\n\n    <h2>3. \u0417\u0430\u043f\u0443\u0441\u043a OpenVPN \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/h2>\n    <p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c OpenVPN:<\/p>\n    <div class=\"code-block\">\n        <button class=\"copy-btn\" onclick=\"copyToClipboard('docker run -v ovpn-data:\/etc\/openvpn -d -p 1194:1194\/udp --cap-add=NET_ADMIN kylemanna\/openvpn')\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434<\/button>\n        <pre>docker run -v ovpn-data:\/etc\/openvpn -d -p 1194:1194\/udp --cap-add=NET_ADMIN kylemanna\/openvpn<\/pre>\n    <\/div>\n\n    <h2>4. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/h2>\n    <p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n    <div class=\"code-block\">\n        <button class=\"copy-btn\" onclick=\"copyToClipboard('docker run -v ovpn-data:\/etc\/openvpn --rm -it kylemanna\/openvpn easyrsa build-client-full CLIENTNAME nopass')\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434<\/button>\n        <pre>docker run -v ovpn-data:\/etc\/openvpn --rm -it kylemanna\/openvpn easyrsa build-client-full CLIENTNAME nopass<\/pre>\n    <\/div>\n    <div class=\"code-block\">\n        <button class=\"copy-btn\" onclick=\"copyToClipboard('docker run -v ovpn-data:\/etc\/openvpn --rm kylemanna\/openvpn ovpn_getclient CLIENTNAME &gt; CLIENTNAME.ovpn')\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434<\/button>\n        <pre>docker run -v ovpn-data:\/etc\/openvpn --rm kylemanna\/openvpn ovpn_getclient CLIENTNAME &gt; CLIENTNAME.ovpn<\/pre>\n    <\/div>\n\n    <h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n    <p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0448\u0430\u0433\u0438 \u043f\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e OpenVPN \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n\n    <script>\n        function copyToClipboard(text) {\n            navigator.clipboard.writeText(text).then(() => {\n                alert(\"\u041a\u043e\u0434 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430!\");\n            }).catch(err => {\n                console.error(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438: \", err);\n            });\n        }\n    <\/script>\n\n\n","protected":false},"excerpt":{"rendered":"<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 OpenVPN \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 Docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0412 \u044d\u0442\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 OpenVPN \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 Docker, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0431\u0440\u0430\u0437 kylemanna\/openvpn. 1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 Docker volume, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e OpenVPN: \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 docker volume create &#8212;name ovpn-data \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b ovpn_genconfig: \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 docker run -v ovpn-data:\/etc\/openvpn [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":111,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"aside","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-90","post","type-post","status-publish","format-aside","has-post-thumbnail","hentry","category-1","post_format-post-format-aside"],"_links":{"self":[{"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=90"}],"version-history":[{"count":19,"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":113,"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=\/wp\/v2\/posts\/90\/revisions\/113"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=\/wp\/v2\/media\/111"}],"wp:attachment":[{"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tech.itsx.ru\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}