Docker Compose сервис доступен только через VPN

Вопрос или проблема

У меня есть сервис Docker Compose, который я хотел бы использовать исключительно через VPN-туннель.

В сервисе два контейнера: 1) “приложение” и 2) “VPN-сервер”. Приложение предоставляет сетевой сервис на определенном порту; оно не имеет ни шифрования, ни аутентификации, никаких средств безопасности. Я хочу, чтобы пользователи этого сервиса могли безопасно получать к нему доступ из сети (интернета).

(“Приложение” — это сервер игры OpenArena, но это не имеет значения.)

Моя первоначальная попытка состояла в том, чтобы контейнер Wireguard предоставлял клиентские IP-адреса из диапазона адресов сетевого моста Docker, а затем контейнер приложения слушал только на своем адресе моста Docker (в отличие от 0.0.0.0). Это не сработало.

Если бы я был единственным пользователем указанного сервиса, я бы просто использовал перенаправление порта SSH с опцией -L. Но это не масштабируется для нескольких пользователей, и мне не нужно (и не хочу), чтобы пользователи имели доступ к оболочке на хосте.

Мне кажется, что весь этот случай использования должен быть хорошо проложенной тропой с каким-то очевидным, каноническим решением, поэтому мне бы хотелось использовать нечто проверенное, а не пытаться “разрабатывать что-то свое”. Тем не менее, я не могу найти много ресурсов по этой теме. Есть идеи?

Самый простой способ сделать это — это дать контейнеру приложения разделять то же пространство имен сети, что и VPN-сервер. Например, если приложение было бы веб-сервером NGINX, вы могли бы использовать файл compose, похожий на этот:

# docker-compose.yml
services:
  vpn:
    image: procustodibus/wireguard
    cap_add:
    - NET_ADMIN
    ports:
    - 51820:51820/udp
    volumes:
    - ./conf:/etc/wireguard
  app:
    image: nginx
    network_mode: 'service:vpn'

Если вы настроите VPN-сервер на использование адреса WireGuard, скажем, 10.0.0.1, как с помощью следующего конфигурационного файла:

# conf/wg0.conf
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
Address = 10.0.0.1
ListenPort = 51820

[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
AllowedIPs = 10.0.0.2

[Peer]
PublicKey = jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=
AllowedIPs = 10.0.0.3
...

Вы можете настроить приложение привязаться к 0.0.0.0 (как к интерфейсам моста, так и к WireGuard), или только к адресу WireGuard VPN-сервера 10.0.0.1. В любом случае все VPN-клиенты будут использовать IP-адрес 10.0.0.1 для доступа к приложению — в случае NGINX переход по URL http://10.0.0.1/ на подключенном клиенте покажет домашнюю страницу контейнера NGINX.

Ответ или решение

Для обеспечения безопасного доступа к вашему Docker Compose сервису через VPN существует несколько проверенных подходов. Рассмотрим один из самых простых и эффективных способов, который включает использование контейнеров для VPN и вашего приложения, такие как OpenArena, в одном сетевом пространстве.

Конфигурация Docker Compose

Вы можете создать файл docker-compose.yml, который будет управлять двумя контейнерами: один для VPN-сервера (WireGuard), а другой для вашего приложения. Вот пример такой конфигурации:

version: '3.8'

services:
  vpn:
    image: procustodibus/wireguard
    cap_add:
      - NET_ADMIN
    ports:
      - '51820:51820/udp'
    volumes:
      - ./conf:/etc/wireguard

  app:
    image: your_openarena_image  # Замените на изображение вашего OpenArena
    network_mode: service:vpn

В данном случае мы используем network_mode: service:vpn для приложения, что позволяет ему использовать тот же сетевой пространство, что и сервер VPN.

Настройка WireGuard

Теперь давайте создадим файл конфигурации для WireGuard, который будет управлять настройками IP-адресов и клиентами. Создайте файл conf/wg0.conf и добавьте в него следующее:

[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEE=
Address = 10.0.0.1
ListenPort = 51820

[Peer]
PublicKey = fE/wdxzl0klVp/IR8UcaoGUMjqaWi3jAd7KzHKFS6Ds=
AllowedIPs = 10.0.0.2

[Peer]
PublicKey = jUd41n3XYa3yXBzyBvWqlLhYgRef5RiBD7jwo70U+Rw=
AllowedIPs = 10.0.0.3
...

В этой конфигурации 10.0.0.1 — это IP-адрес вашего VPN-сервера, которому будет доступен сервис OpenArena.

Настройки приложения

Теперь в вашем приложении (например, сервере OpenArena), вы можете настроить прослушивание на IP-адресе 10.0.0.1, что позволит пользователям, подключенным к VPN, получить доступ к игровому серверу. Убедитесь, что ваше приложение настроено на прослушивание на этом IP-адресе, а не на 0.0.0.0, который открывает доступ ко всем интерфейсам.

Подключение клиентов к VPN

После настройки сервера вам нужно будет выдавать клиентские конфигурации для управления доступом пользователей. Обратите внимание, что каждый клиент должен иметь набор своего уникального ключа, который будет добавлен в файл конфигурации сервера WireGuard.

Преимущества этого подхода

  1. Безопасность: Ваше приложение доступно только через VPN, что существенно повышает уровень безопасности.
  2. Удобство: Пользователи могут подключаться к вашему сервису без необходимости настройки SSH-переадресации или других сложных механизмов.
  3. Гибкость: Вы можете легко добавлять новых клиентов, просто добавляя их публичные ключи в конфигурацию сервера и генерируя для них конфигурационные файлы.

Заключение

Данный способ настройки Docker Compose для работы с VPN является простым и надежным решением для обеспечения безопасного доступа к вашим сервисам. Если у вас возникнут дополнительные вопросы или необходима помощь в процессе настройки, не стесняйтесь обращаться к сообществу для получения поддержки.

Оцените материал
Добавить комментарий

Капча загружается...