У меня есть следующие настройки:
- Хост CentOS, на котором запущена служба Docker
- Пользовательская сеть Docker Bridge
- 2 Docker-контейнера, подключенных к этой определенной пользователем мостовой сети
- Установка OpenVPN (в настоящее время выполняется на хосте. Может также выполняться в контейнере Docker)
- Некоторые клиенты подключены к OpenVPN
Как можно разрешить Docker-контейнерам в сети Docker Bridge взаимодействовать с клиентами openvpn в сети Tun0?
Я хотел бы иметь возможность иметь основанную на tcp связь между docker1 (10.10.0.3) и клиентами, подключенными к vpn (диапазон 172.19.0.x) прозрачным способом.
Что мне нужно настроить на стороне докера (network / iptables / ...) и на хосте (iptables?)
tap
, гайкаtun
, я работал над этим более 12 часов безуспешно до сих пор.Ответы:
контекст
Я использовал очень хороший контейнер Docker от Kyle Manna ( https://github.com/kylemanna/docker-openvpn ). Я использую так называемую «параноидальную» документацию для настройки моего сервера OpenVPN, но, на мой взгляд, это должен быть стандартный, а не параноидальный способ.
конфигурация
Чтобы разрешить двунаправленное соединение между выбранными контейнерами Docker и клиентами VPN, необходимо создать сеть Docker, к которой вы собираетесь присоединить контейнер, к которому VPN-клиенты должны иметь доступ. Сервер VPN будет одним из таких контейнеров.
Сервер VPN должен иметь
client-to-client
,topology subnet
,dev tun0
(или другое устройство тун) иpush "route <docker net IP> <docker net mask>"
сконфигурирован.Хост VPN-сервера должен быть настроен на поддержку пересылки IP-пакетов из одной подсети в другую. Это означает, что для sysctl ip_forward необходимо установить значение 1 (это должно иметь место при установке Docker), разрешить пакетам с устройства tun проходить через цепочку iptables FORWARD и настроить правильную маршрутизацию. Это можно суммировать с помощью следующих команд:
В любом случае, вот параметры, которые я использовал для настройки сервера:
Это должно создать файл конфигурации сервера, похожий на:
Конкретный пример
Сейчас я приведу конкретный пример. В этом примере я буду запускать упомянутый выше сервер OpenVPN внутри Docker на хосте vpn.example.com. Этот контейнер подключен к Docker-сети docker-net-vpn. Вот команды (в этом примере я генерирую конфигурацию сервера непосредственно на сервере и пропускаю генерацию CA, пожалуйста, следуйте документации по параноику вышеупомянутого проекта):
Первая команда создает выделенную новую сеть Docker, которая определяет новую подсеть. Мы подключим сервер OpenVPN к этой сети.
Второй создает конфигурацию OpenVPN, используя ту же подсеть, как определено в 1-й команде.
Третий создает сервер OpenVPN. Он подключен к недавно созданной сети Docker и использует фиксированный IP.
Четвертая и пятая команды настраивают переадресацию IP.
Последняя команда добавляет новый маршрут к конфигурации VPN-клиента через фиксированный IP-адрес контейнера OpenVPN.
Запись
Я не пробовал, но должно быть возможно ограничить правило FORWARD для iptables. Создание сети Docker создало новое мостовое устройство. Этот мост назван
br-<ID>
с идентификатором, являющимся первыми 12 символами идентификатора сети Docker. Этот идентификатор можно получить с помощьюdocker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Поэтому следующая команда может быть более строгой (поэтому лучше с точки зрения безопасности), но все же должна позволять маршрутизировать наш трафик:источник
1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H
но я не могу пропинговать или достигнуть открытых портов.docker network…
.