Вопрос или проблема
Я управляю экспериментальным VPN сервером в Docker контейнере.
Мой файл docker-compose.yml
:
version: '3'
services:
dockovpn:
image: alekslitvinenk/openvpn
cap_add:
- NET_ADMIN
ports:
- 1194:1194/udp # Откройте tcp, если вы определили HOST_TUN_PROTOCOL=tcp
environment:
HOST_ADDR: ${HOST_ADDR}
volumes:
- /var/lib/dockovpn:/opt/Dockovpn_data
restart: always
где HOST_ADDR
— это мой IP-адрес.
Я запускаю контейнер с помощью команды
sudo docker-compose up -d
и могу подключаться к VPN с устройств Windows, Android и iOS.
В server.conf
нет опции client-to-client
:
sudo docker exec -it dockovpn_dockovpn_1 bash
cd /opt/Dockovpn
config/server.conf
port 1194
proto %HOST_TUN_PROTOCOL%
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/MyReq.crt
key /etc/openvpn/MyReq.key
dh /etc/openvpn/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
keepalive 10 120
cipher AES-256-GCM
ncp-ciphers AES-256-GCM:AES-256-CBC
auth SHA512
persist-key
persist-tun
status openvpn-status.log
verb 4
tls-server
tls-version-min 1.2
tls-auth /etc/openvpn/ta.key 0
crl-verify /etc/openvpn/crl.pem
поэтому, согласно документации OpenVPN, клиенты не должны видеть друг друга, но они видят. Например, я могу подключиться через Remote Desktop к удаленным Windows машинам с IP-адресами, такими как 10.8.0.14 и т.д…
Как это исправить?
Ответ или решение
Ваш вопрос касается настройки сервера OpenVPN в контейнере Docker, где клиенты могут видеть друг друга, несмотря на отсутствие опции client-to-client
в конфигурационном файле сервера. Давайте разберемся, почему так происходит и как это можно исправить.
Теория
В OpenVPN параметр client-to-client
позволяет подключенным к VPN клиентам напрямую обмениваться трафиком, когда эта опция включена. Обычно, если эта опция отсутствует или недоступна, клиенты не могут видеть друг друга, так как сервер не осуществляет пересылку трафика между клиентскими сессиями. Однако, ваше наблюдение о том, что клиенты видят друг друга даже без этого параметра, указывает на возможную неправильно настроенную конфигурацию или на иные аспекты сети, которые могут влиять на это поведение.
Нетипичное поведение может быть связано с несколькими факторами:
-
Настройки параллельных служб в контейнере Docker. Есть вероятность, что настройки Docker влияют на изоляцию сетевых пространств для различных подключений. Docker использует мостовую сеть (
bridge
), которая, по умолчанию, позволяет обмениваться трафиком между контейнерами, что может иметь побочный эффект при использовании в сетях VPN. -
Правила брандмауэра или маршрутизации. Возможно, неправильно настроены правила iptables или маршрутизации на хост-машине или самом контейнере, что приводит к пробросу трафика между клиентами.
Пример
Предположим, что у нас есть два клиента, A и B, которые подключены к вашему VPN-серверу. Без client-to-client
, сервер не должен передавать пакет от A на B и наоборот. Однако, если в вашей сетевой конфигурации (например, в iptables) настроены правила, которые разрешают такой обмен, клиенты будут видеть друг друга.
Также стоит обратить внимание на служебные параметры, например, duplicate-cn
, который разрешает многократное использование одного и того же сертификата, это может привести к необычному поведению сессий, особенно в отношении маршрутизации.
Применение
Чтобы ограничить возможность клиентам видеть друг друга, выполните следующие шаги:
-
Проверка конфигурации сервера:
- Убедитесь, что
client-to-client
действительно отсутствует в вашемserver.conf
. Вы уже подтвердили это.
- Убедитесь, что
-
Правила iptables:
- Проверьте правила iptables на вашем Docker-хосте. Вы можете выполнить
iptables -L -v -n
для проверки текущих правил. Убедитесь, что не настроено разрешение трафика между клиентами VPN.
- Проверьте правила iptables на вашем Docker-хосте. Вы можете выполнить
-
Настройка контейнера Docker:
- Проверьте сетевые настройки Docker для вашего контейнера. Возможно, стоит создать отдельную пользовательскую сеть Docker где вы сможете настроить изоляцию контейнеров более детально.
-
Обновление конфигурации OpenVPN:
- Попробуйте явно установить
client-to-client
опцию в конфигурации файла и затем закомментировать ее с объяснением и описанием, чтобы не допускать ошибок в будущем.
- Попробуйте явно установить
-
Логгирование:
- Поднимите уровень логирования, например, до
verb 5
, чтобы получить подробные логи и отследить, как происходит обмен трафиком.
- Поднимите уровень логирования, например, до
-
Фильтрация:
- Разработайте и примените соответствующие iptables фильтры, которые запрещают пересечение трафика между различными клиентскими IP адресами внутри сети 10.8.0.0/24.
Эти меры должны помочь в улучшении изоляции между клиентами VPN на вашем сервере. Если после всех изменений проблема остается нерешенной, рекомендуется также проверить обновления и багрепорты OpenVPN и Docker, так как временное поведение может быть связано с недавними изменениями в этих платформах.