Вступ
Які причини для запуску OpenVPN і веб-сервера на одному порту 443
Уявімо, що у вас є сервер OpenVPN, який слухає порт 1194, і ви підключаєтеся з публічної або робочої мережі, яку ви не контролюєте. У цьому випадку може виникнути ситуація, коли дозволені лише вихідні підключення до загальних портів (наприклад, 80 і 443, щоб користувач міг лише переглядати веб-сторінки), тому ви не можете підключитися до свого сервера OpenVPN і зашифрувати трафік від адміністратора мережі.
У цьому конкретному випадку ви можете спробувати перемістити службу OpenVPN для прослуховування через порт 443. Але що робити, якщо ви також використовуєте свій сервер для розміщення деяких веб-сайтів, тому порт 443 уже використовується? Щоб вирішити цю проблему, доцільно використовувати проксі-сервер або рішення для балансування навантаження та перенаправляти мережевий трафік із вхідного порту 443 на відповідний порт локальної служби 1194, 8080 тощо.
Як це працює
Ви можете налаштувати HAProxy на завершення SSL, а потім маршрутизацію трафіку на основі SNI (Індикація імені сервера) або інших критеріїв на ваш сервер OpenVPN або на інші веб-сайти. Ось загальний огляд того, як цього досягти:
-
Завершення SSL: HAProxy оброблятиме вхідні з’єднання SSL на порту 443. Він розшифровуватиме трафік, перевірятиме його, а потім вирішуватиме, куди його пересилати.
-
Маршрутизація трафіку: На основі таких критеріїв, як запитане ім’я хоста або вміст початкових пакетів, HAProxy може скеровувати трафік на різні внутрішні сервери:
- Трафік HTTPS можна перенаправляти на ваші веб-сервери.
- Трафік OpenVPN можна перенаправляти на сервер OpenVPN.
- Приховування VPN-трафіку: Завдяки обслуговуванню OpenVPN на порту 443 мережевим адміністраторам стає важче відрізнити звичайний трафік HTTPS від трафіку VPN. Це може допомогти в середовищах, де використання VPN обмежено або контролюється.
Налаштування
Посібник зі встановлення припускає, що ви вже запустили ці служби у своїй системі:
- Служба OpenVPN працює в режимі TCP.
- Одна або декілька веб-служб http.
Особисто я запускаю кожну веб-службу як контейнери докерів (докерів компонування) і прив’язую їхні http-порти до якогось вільного порту на локальному хості (наприклад, кілька веб-програм працюють на локальному інтерфейсі, але різні порти http://localhost:20001
, http://localhost:20002
тощо).
Встановіть HAProxy
Спочатку встановіть HAProxy у вашу систему:
sudo apt install haproxy
Потім увімкніть і запустіть systemd демон HAProxy:
sudo systemctl enable --now haproxy.service
Налаштуйте HAProxy
Розмістіть свої сертифікати SSL у /etc/ssl/haproxy
. Каталог і сертифікати мають бути доступні лише для користувача root. Наприклад, якщо у вас є домени domain1.com
, domain2.com
, для яких ви хочете розмістити веб-сервіси, ви повинні мати сертифікат і пари ключів для кожного домену в каталозі з відповідним іменуванням, наприклад:
- domain1.com.pem
- domain1.com.pem.key
- domain2.com.pem
- domain2.com.pem.key
Потім відредагуйте файл /etc/haproxy/haporxy.cfg
і додайте необхідні розділи.
Визначте backend для веб-програм і OpenVPN.
Наприклад, якщо є 2 веб-сайти, які слухають порти 20001, 20002, а OpenVPN – порт 1194, конфігурація буде такою:
|
|
Налаштуйте балансування HTTPS
Далі нам потрібно створити інтерфейс, який буде прив’язаний до localhost:8443
і керуватиме перенаправленням на основі домену. Це дозволить розміщувати веб-програми для кількох доменів. Також слід створити бекенд для localhost:8443
, він буде використовуватися пізніше для підключення з інтерфейсу порту, який буде прослуховуватися на вхідному порту 443.
У цьому прикладі підключення перенаправляється до відповідної веб-програми на основі перевірки SNI домену, наприклад:
|
|
Налаштуйте frontend для публічного порту 443
Це основний frontend, який прослуховується на загальнодоступному порту 443 і керує перенаправленням на необхідний сервер на основі SNI.
Спочатку він перевіряє, чи SNI закінчується деякими з математичних доменів (domain1.com або domain2.com). Цей вид перевірки дозволяє розмістити будь-який субдомен у майбутньому (наприклад, dev.domain1.com
, prod.domain2.com
тощо). І врешті-решт, якщо перевірка SNI не пройдена, це означає, що підключення має бути до OpenVPN, це правило визначено як стандартне.
|
|
Приклад повної конфігурації
|
|
Додатково
Як перевірити конфігурацію HAProxy
HAProxy може перевірити файл конфігурації та повідомити вам, якщо є якась помилка.
Щоб перевірити конфігурацію, запустіть:
sudo haporxy -c -f /etc/haproxy/haproxy.cfg
Як застосувати зміни HAProxy
Щоб застосувати зміни до конфігурації HAProxy, просто перезапустіть демон:
sudo systemctl restart --now haproxy.service
Висновок
Використання HAProxy для обробки завершення SSL і мультиплексування трафіку через порт 443 може бути ефективним способом приховати використання VPN і обійти мережеві обмеження. Це налаштування може бути особливо корисним у середовищах, де відкритий лише порт 443 або трафік VPN активно відстежується та обмежений. Ретельно налаштувавши HAProxy, ви можете створити гнучке та безпечне рішення, яке відповідає вашим потребам.
Переваги
-
Мультиплексування портів: використання порту 443 як для VPN, так і для веб-трафіку дозволяє обійти мережеві обмеження, які дозволяють лише порт 443.
-
Приховування використання VPN: завдяки обслуговуванню OpenVPN на порту 443 трафік VPN змішується зі звичайним трафіком HTTPS, що ускладнює його виявлення та блокування.
-
Гнучкість: ви можете працювати з кількома службами на одній IP-адресі та порту, зменшуючи кількість відкритих портів і спрощуючи правила брандмауера.
Що треба мати на увазі
-
Виявлення: хоча цей метод може допомогти обійти деякі обмеження, складні інструменти моніторингу мережі все ще можуть потенційно виявляти трафік OpenVPN на основі шаблонів трафіку та поведінки, навіть на порту 443.
-
Продуктивність: HAProxy має розшифровувати та перевіряти трафік SSL, що може збільшити витрати. Переконайтеся, що ваш сервер має достатньо ресурсів для обробки додаткового навантаження.
-
Безпека: завершення SSL на HAProxy означає, що він виконує шифрування та дешифрування. Переконайтеся, що HAProxy і сервер, на якому він працює, захищені й оновлюються.