Вопрос или проблема
У меня есть сервис 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.
Преимущества этого подхода
- Безопасность: Ваше приложение доступно только через VPN, что существенно повышает уровень безопасности.
- Удобство: Пользователи могут подключаться к вашему сервису без необходимости настройки SSH-переадресации или других сложных механизмов.
- Гибкость: Вы можете легко добавлять новых клиентов, просто добавляя их публичные ключи в конфигурацию сервера и генерируя для них конфигурационные файлы.
Заключение
Данный способ настройки Docker Compose для работы с VPN является простым и надежным решением для обеспечения безопасного доступа к вашим сервисам. Если у вас возникнут дополнительные вопросы или необходима помощь в процессе настройки, не стесняйтесь обращаться к сообществу для получения поддержки.