Я хотел бы разрешить пользователям 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