Запускаємо OpenVPN у Докері за 2 секунди

Привіт, хабрівчани! Чи стикалися ви коли-небудь із ситуацією, коли дуже хотілося б віртуально перенестися до іншого міста, країни чи іншого континенту? У мене така необхідність виникає досить часто, тому можливість мати свій VPN сервер, який можна запустити будь-де, за пару секунд, стояв досить гостро. У цій статті хочу розповісти про свій проект, який я задумав коли шукав готове рішення, в даному випадку образ, який би дозволив швидко підняти OpenVPN сервер, з мінімумом налаштувань та прийнятним рівнем безпеки.

Запускаємо OpenVPN у Докері за 2 секунди

Передісторія

Можливість запускати сервіс на будь-якій машині: чи то фізичний сервер, чи то віртуальний приватний сервер, чи то зовсім контейнерний простір усередині іншої системи управління контейнерами — була критично важливою. Мій погляд відразу впав на Докер. По-перше, цей сервіс набирає популярності, а отже, все більше і більше провайдерів надають готові рішення з його передустановкою; по-друге, є централізоване сховище образів, звідки можна скачати і запустити сервіс за допомогою однієї команди в терміналі. Думка, що подібний проект вже має існувати, відвідувала мене і я вперто шукав. Але більшість проектів, які я знаходив, були або занадто громіздкими (потрібно було створювати контейнер для постійного зберігання даних і кілька разів запускати контейнер з додатком з різними параметрами), або без осудної документації, або зовсім занедбаними. Не знайшовши нічого прийнятного, я почав роботу над своїм проектом Попереду були безсонні ночі вивчення документації, написання коду та налагодження, але зрештою мій сервіс побачив світло та заграв усіма кольорами монохромної світлодіодної панелі роутера. Отже, прошу любити і шанувати Docker-OpenVPN. Я навіть логотип придумав (вище, перед катом), але його не судіть суворо, бо я не дизайнер (уже). Коли я реалізовував цей проект, я ставив в основу швидкість розгортання, мінімум налаштувань і прийнятний рівень безпеки. Методом спроб і помилок я знайшов оптимальний баланс цих критеріїв, правда, подекуди довелося пожертвувати швидкістю розгортання заради безпеки, а за мінімум налаштувань довелося заплатити портативністю: в поточній конфігурації одного разу створений контейнер на одному сервері не можна перенести і запустити на інший. Наприклад, всі клієнтські та серверні сертифікати генеруються при запуску сервісу і це займе близько 2 секунд. Однак, генерацію файлу Дефі Хеллмана довелося винести в білд-тайм: він створюється під час складання докеру образу і може тривати до 10 хвилин. Я б дуже хотів отримати аудит безпеки такого рішення від шановної спільноти.

запуск

Щоб запустити сервіс, нам необхідні кілька речей:

  1. Сервер: фізичний чи віртуальний. Теоретично можна запускати в режимі докер-в-докер, але я не проводив масштабного тестування цієї опції;
  2. Власне, Докер. Багато хостинг-провайдерів надають готові рішення з Докером «на борту»;
  3. Публічна IP-адреса.

Якщо всі реквізити на місці, далі нам залишається запустити наступну команду в консолі вашого сервера:

docker run --cap-add=NET_ADMIN 
-it -p 1194:1194/udp -p 80:8080/tcp 
-e HOST_ADDR=$(curl -s https://api.ipify.org) 
alekslitvinenk/openvpn

Уважний читач міг звернути увагу на те, що IP-адреса сервера визначається автоматично за допомогою ipify.org. Якщо з якихось причин це не працює, то можна вказати адресу вручну. Якщо всі попередні кроки були виконані правильно, ми повинні побачити в консолі щось схоже:

Sun Jun  9 08:56:11 2019 Initialization Sequence Completed
Sun Jun  9 08:56:12 2019 Client.ovpn file has been generated
Sun Jun  9 08:56:12 2019 Config server started, download your client.ovpn config at http://example.com/
Sun Jun  9 08:56:12 2019 NOTE: After you download you client config, http server will be shut down!

Ми близькі до мети: тепер нам треба скопіювати example.com (у вашому випадку буде адреса сервера) і вставити в адресний рядок браузера. Після того як ви натиснете Enter, client.ovpn файл буде завантажено, а сам http сервер піде в небуття. Якщо це рішення викликає сумнів, то можна скористатися наступним трюком: запустити попередню команду і додати прапори zp та пароль. Тепер, якщо ви вставите згенероване посилання у вікно браузера - ви отримаєте архів з паролем. Коли у вас є файл з клієнтською конфігурацією, можна використовувати будь-який відповідний клієнт. Я використовую Tunnelblick для Мака.

Відео туторіал

Даний відео туторіал містить докладну інструкцію щодо розгортання сервісу на DigitalOcean.

PS Якщо ви вважаєте цей проект корисним, то будь ласка, поставте йому зірочку на ГітХабі, зробіть форк і розкажіть друзям. Контрибутори та аудит безпеки також широко вітаються.PPS Якщо ця стаття потрапить на Хабр, то я планую написати наступну про те, як я запускав докер-у-докері і докер-в-докері, для чого я це робив і що з цього вийшло.
EDIT1:

  1. Виправив помилки у публікації,
  2. Відповідаючи на коментарі, вирішив винести цю інформацію сюди: прапор —privileged потрібен для роботи з iptables

EDIT2:

  1. Поліпшив команду запуску образу: тепер він не вимагає прапора.
  2. Додав посилання на російськомовне відео керівництво: youtu.be/A8zvrHsT9A0

Джерело: habr.com

Додати коментар або відгук