Дозвольте Docker-контейнерам підключатися до клієнтів OpenVPN на інтерфейсі хост-тунелю


12

У мене є така настройка:

  • Хост CentOS, який працює докер-службою
  • Мережа мостів, встановлених користувачем
  • 2 Докер-контейнери, підключені до визначеної користувачем мостової мережі
  • Установка OpenVPN (зараз працює на хості. Також може працювати в докерному контейнері)
  • Деякі клієнти підключені до OpenVPN

Як я можу дозволити контейнерам docker в мережі докерного мосту спілкуватися з клієнтами openvpn в мережі tun0?

Мені б хотілося мати можливість прозорого зв’язку на основі tcp між docker1 (10.10.0.3) та клієнтами, підключеними до vpn (діапазон 172.19.0.x).

Що мені потрібно налаштувати на стороні докера (мережа / iptables / ...) та на хості (iptables?)


1
Можливо, пізно, але у вашому випадку я вважаю, що вам потрібно tap, горіх tun, я працюю над цим більше 12 годин, не маючи успіху досі.
Мохаммед Нурелдін

@MohammedNoureldin Ви знайшли рішення? Я також зараз розглядаю можливість переключитися на пристрій. Що страшно - це те, що з контейнера ovpn я можу отримати доступ до клієнтів vpn. І від клієнтів vpn я можу отримати доступ до інших контейнерів у тій же мережі Docker. Але пересилання між "eth0" і tun0 всередині контейнера ovpn не працює. Я думаю, це пов’язано з природою tun0 порівняно з краном.
Гюйгенс

@Huygens, так, я вирішив це, будь ласка, задайте окреме питання та дайте посилання на мене, і я зроблю все можливе, щоб вам допомогти.
Мохаммед Нурелдін

1
Привіт @MohammedNoureldin Я знайшов 2 відсутні інструкції, щоб він працював. Вони знаходилися на відкритих чоловічих сторінках 👍. Я скоро опублікую відповідь на це питання для інших.
Гюйгенс

1
@Huygens, добре знати, насправді я ще не встиг опублікувати відповідь, але мені цікаво подивитися, що працювало у вашій справі.
Мохаммед Нурелдін

Відповіді:


7

Контекст

Я використовував дуже хороший контейнер 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 та встановлювати правильну маршрутизацію. Це можна підсумувати за допомогою цих команд:

$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via <IP address of OpenVPN server container>

У будь-якому випадку, ось варіанти, які я використовував для налаштування сервера:

$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://<FQDN> -N -d -c -p "route <docker net IP> <docker net range>" -e "topology subnet"

Це повинно генерувати файл конфігурації сервера, подібний до:

server 192.168.255.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/vpn.example.com.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/vpn.example.com.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun

proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log

user nobody
group nogroup
client-to-client

### Push Configurations Below
push "dhcp-option DNS 8.8.8.8"
push "route 172.20.20.0 255.255.255.0"

### Extra Configurations Below
topology subnet

Конкретний приклад

Зараз я візьму конкретний приклад. У цьому прикладі я запускаю вищезгаданий сервер OpenVPN всередині Docker на хості vpn.example.com. Цей контейнер приєднаний до мережі Docker-мережі docker-net-vpn. Ось команди (у цьому прикладі я генерую конфігурацію сервера безпосередньо на сервері і пропускаю генерацію CA, будь ласка, дотримуйтесь параноїдної документації вищезгаданого проекту):

$ docker network create --attachable=true --driver=bridge --subnet=172.20.20.0/24 --gateway=172.20.20.1 docker-net-vpn
$ docker run --rm --net=none -it -v $PWD/files/openvpn:/etc/openvpn kylemanna/openvpn:2.4 ovpn_genconfig -u udp://vpn.example.com -N -d -c -p "route 172.20.20.0 255.255.255.0" -e "topology subnet"
$ docker run --detach --name openvpn -v $PWD/files/openvpn:/etc/openvpn --net=docker-net-vpn --ip=172.20.20.2 -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo iptables -A FORWARD -i tun+ -j ACCEPT
$ sudo ip route add 192.168.255.0/24 via 172.20.20.2

Перша команда створює нову виділену мережу 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. Тому наступна команда може бути більш обмежувальною (настільки кращою для безпеки), але все ж повинна дозволяти маршрутизувати наш трафік:

$ NET_VPN_BRIDGE="br-$(docker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12)"
$ sudo iptables -A FORWARD -i tun+ -o ${NET_VPN_BRIDGE} -j ACCEPT

Гей, я не можу змусити це працювати, я можу простежити до 192.168.255.6 і я отримую:, 1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !Hале я не можу пінг або дійти до відкритих портів.
GuySoft

Привіт @GuySoft, про що повідомляє traceroute, це те, що ваш останній скачок (172.20.20.1) не може досягти хоста 192.168.255.6. Отже, це означає, що ваша таблиця маршрутів, ймовірно, неправильна. Чи можемо ми поспілкуватися, щоб побачити, де проблема?
Гюйгенс

Це почало працювати, я думаю, що відбувається в тому, що на обох машинах був встановлений докер, і на обох машинах була підмережа 172.20.20.1, через яку речі зіткнулися, мені потрібно знайти спосіб, щоб докер не створив підмережу, яка би зіткнулася на клієнтській машині .
GuySoft

Якщо ви використовуєте Docker Compose, ви можете вказати діапазон IP-адрес, який повинна використовувати мережа. Див. Документацію про складання. Це також можна зробити з командного рядка за допомогою docker network….
Гюйгенс

Я думаю, я не отримую частину, де з'єднання з хостом (хост ip + порт openvpn) перекладається на контейнер openvpn (172.20.20.2)
jtomasrl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.