Рейтинг:2

Как подключить TAP-устройство к оверлейной сети?

флаг pe

Я хотел бы разрешить пользователям OpenVPN доступ ко всем контейнерам Docker, которые являются частью сети Overlay, как если бы они находились в одной локальной сети. Самый простой пример — 3 контейнера, распределенные по 2 хостам, и хосты подключены через оверлейную сеть, и все 3 контейнера являются частью этой оверлейной сети.

Для этого я подготовил один контейнер OpenVPN (OpenVPN в режиме моста с адаптером TAP), и в этом контейнере я создал мост br0 и подключил интерфейсы eth0 и tap0 к br0. Под этим я бы сказал, что я подключил свой TAP и всех клиентов OpenVPN к оверлейной сети (я не уверен, что это утверждение верно).

Пока что, когда мои пользователи OpenVPN подключаются к OpenVPN и пытаются пропинговать фиктивный контейнер 1 (который находится на том же хосте, что и контейнер OpenVPN), пользователи могут пинговать фиктивный контейнер 1 (и, конечно же, могут пинговать контейнер OpenVPN). также). Все идет нормально!

Однако пользователи не могут пропинговать фиктивный контейнер 2, который существует на разные хост (но является частью того же оверлея с контейнером OpenVPN, как указано выше).

Короче говоря, пользователи VPN, которые подключены к контейнеру OpenVPN (соединен мостом с оверлейной сетью Docker) и пытаются пропинговать другие контейнеры, могут пропинговать только контейнеры на том же хосте, а не на другом хосте, как если бы мост работал только на локальном мост, а не с наложенной сетью.

Также важно сказать, что изнутри самого контейнера OpenVPN я могу пропинговать фиктивный контейнер 2 (и, конечно, фиктивный контейнер 1).

Эта цифра самаризует всю историю, которую я рассказал выше. Обратите внимание на красную стрелку, обозначающую соединение, которое я хотел бы установить, но оно не работает в данный момент (пользователь VPN подключается к хосту 1 через OpenVPN, а затем пытается пропинговать фиктивный контейнер 2).

введите описание изображения здесь

Немного подробной технической информации

Контейнер OpenVPN
/etc/openvpn # IP-адрес
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    ссылка/петля 00:00:00:00:00:00 брд 00:00:00:00:00:00
    инет 127.0.0.1/8 область хоста lo
       valid_lft навсегда
2: tap0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 состояние UP группа по умолчанию qlen 1000
    ссылка/эфир 06:9b:33:89:85:81 брд ff:ff:ff:ff:ff:ff
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default qlen 1000
    ссылка/эфир 02:42:0a:08:00:04 брд ff:ff:ff:ff:ff:ff
    инет 10.8.0.4/24 глобальная область br0
       valid_lft навсегда
74: eth0@if75: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UP group default
    ссылка/эфир 02:42:0a:08:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
76: eth1@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    ссылка/эфир 02:42:ac:12:00:04 brd ff:ff:ff:ff:ff:ff ссылка-netnsid 1
    inet 172.18.0.4/16 brd 172.18.255.255 глобальная область eth1
       valid_lft навсегда
/etc/openvpn # IP-маршрут
по умолчанию через 172.18.0.1 dev eth1
10.8.0.0/24 dev br0 ссылка на область ядра proto src 10.8.0.4
172.18.0.0/16 dev eth1 ссылка на область ядра proto src 172.18.0.4

Конфигурация сервера OpenVPN:

порт 1194
прото удп
разработчик tap0
ca ca.crt
сервер сертификатов.crt
key server.key # Этот файл следует держать в секрете
dh dh.pem
ifconfig-pool-persist ipp.txt
клиент-клиент
поддержка 10 120
шифр AES-256-GCM
сжать lz4-v2
нажать "сжать lz4-v2"
постоянный ключ
упорный тун
статус /var/log/openvpn-status.log
глагол 3
явное-выход-уведомление 1

##### Аутентификация #####
# Сертификат клиента не требуется. Клиенту необходимо пройти аутентификацию, используя только имя пользователя/пароль.
проверить-клиент-сертификат
# Отключает повторное согласование ключей. Значение по умолчанию — один час, при котором пользователь отключается каждый час и вызывает повторную авторизацию конечного пользователя с использованием нового OTP.
reeg-sec 0
# Загружает и использует конфигурацию подключаемого модуля LDAP.
плагин /usr/lib/openvpn/plugins/openvpn-auth-ldap.so /etc/openvpn/auth-ldap.conf
# Загружает и использует плагин PAM-auth (в основном для 2FA).
plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so "openvpn login USERNAME password PASSWORD pin OTP"

Брак делается так:

openvpn --mktun --dev tap0
ip link set tap0 promisc on up

ip ссылка добавить имя br0 тип моста
ip link set dev br0 up
ip link set dev tap0 master br0
ip link set dev eth0 master br0
IP-адрес flash dev eth0
IP-адрес добавить 10.8.0.4/24 dev br0

OpenVPN запускается с помощью команды

VPN_SERVER_HOST_IP_ADDRESS=10.8.0.254
VPN_NETMASK=255.255.255.0
VPN_POOL_START_IP_ADDRESS=10.8.0.50
VPN_POOL_END_IP_ADDRESS=10.8.0.100

опенвпн \
    --config сервер.conf \
    --server-bridge $VPN_SERVER_HOST_IP_ADDRESS $VPN_NETMASK $VPN_POOL_START_IP_ADDRESS $VPN_POOL_END_IP_ADDRESS

Мой фиктивный контейнер 2 (очень похож на фиктивный контейнер 1, но с другими IP-адресами):

/# ip адрес
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    ссылка/петля 00:00:00:00:00:00 брд 00:00:00:00:00:00
    инет 127.0.0.1/8 область хоста lo
       valid_lft навсегда
35: eth0@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue state UP
    ссылка/эфир 02:42:0a:08:00:05 брд ff:ff:ff:ff:ff:ff
    inet 10.8.0.5/24 brd 10.8.0.255 глобальная область действия eth0
       valid_lft навсегда
37: eth1@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    ссылка/эфир 02:42:ac:12:00:03 брд ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 глобальная область eth1
       valid_lft навсегда
/ # ip-маршрут
по умолчанию через 172.18.0.1 dev eth1
10.8.0.0/24 dev eth0 ссылка на область действия src 10.8.0.5
172.18.0.0/16 dev eth1 ссылка на область действия src 172.18.0.3
vidarlo avatar
флаг ar
Вам нужно подключение L2? Если нет, нажмите и соедините *всегда* неправильный ответ.
Mohammed Noureldin avatar
флаг pe
@vidarlo да, мне это нужно. В основном у меня будет контроллер домена на другом хосте, который может обслуживать некоторые потребности L2, например, принтеры.
vidarlo avatar
флаг ar
Контроллеры домена и принтеры не требуют подключения L2. Они работают Just Fine над L3. L2 обычно подразумевается, если вы хотите использовать трафик, отличный от TCP/IP.
Mohammed Noureldin avatar
флаг pe
@vidarlo Спасибо за эту информацию. Я только что где-то читал, что у некоторых принтеров могут быть проблемы, если они не используются в L2. В любом случае, интересно, смогу ли я понять, почему он не работает с этой настройкой.
Mohammed Noureldin avatar
флаг pe
@vidarlo, не могли бы вы взглянуть на новые подробности и сообщить мне, сможете ли вы понять, что не так, и почему я не могу пропинговать контейнеры на host2 пользователями VPN?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.