Соединение OpenVPN с сервером и несколькими клиентами?
Я настраиваю мост, который соединит две или более разрозненные физические сети в одном общем «пространстве Ethernet» (например, я хочу, чтобы все работало так, как будто оно подключено к одному коммутатору Ethernet). Обе мои сети будут находиться за NAT, и поэтому я настраиваю сервер в облаке с общедоступным IP-адресом, который будет принимать соединения от клиентов (которые будут иметь дополнительные интерфейсы Tap0 и eth0, но меня там еще нет).
РЕДАКТИРОВАТЬ (причина): мне нужна рабочая трансляция на клиентских сайтах. Это значительно упростит все, что люди будут делать на этих сайтах. (/РЕДАКТИРОВАТЬ).
Теперь я разобрался с мостом TAP через VPN. Я сделал это в соответствии с руководством OpenVPN по мосту (https://openvpn.net/community-resources/ethernet-bridging/). У меня есть сценарии запуска и остановки моста как на двух клиентских узлах тестирования, так и на сервере. Я сократил настройку до трех фиксированных частных IP-адресов IPV4:
сервер: мост br0 (один интерфейс, Tap0) 192.168.104.2 клиент1: мост br0 (один интерфейс, Tap0) 192.168.104.3 клиент2: мост BR0 (один интерфейс, Tap0) 192.168.104.5
Я могу запустить сервер openvpn, и клиент подключается. После этого я могу хорошо пинговать сервер с одного клиента. Или другой клиент. НО. В моей конфигурации сервер принимает только одно соединение от клиента, который подключается первым! Время второго соединения истекло, и сервер даже не распечатал обнаруженную попытку «соединения» (я использовал UDP для OpenVPN).
Для меня это похоже на режим однорангового сервера. Теперь я копнул еще глубже в справочнике OpenVPN и нашел следующее:
Начиная с OpenVPN 2.0, поддерживается режим многоклиентского сервера TCP/UDP, который можно включить с помощью опции сервера --mode . В режиме сервера OpenVPN будет прослушивать входящие клиентские подключения на одном порту. Все клиентские соединения будут маршрутизироваться через единый интерфейс Tun или Tap.
Далее, для перевязки:
--server-bridge ['nogw'] Вспомогательная директива, аналогичная --server, которая предназначена для упрощения настройки режима сервера OpenVPN в конфигурациях моста Ethernet.
Конечно, я использую директиву «server-bridge» в конфигурации моего сервера. Обратите внимание, что в документации ничего не говорится о «мультиклиентском» режиме! Теперь мой вопрос: действительно ли на сервере OpenVPN поддерживается многоклиентское соединение TAP ? Очевидно, что сервер перестает прослушивать новые соединения, когда я использую --server-bridge, и я не могу найти причину, почему.
Дополнительная проблема для меня заключается в том, что ЕСЛИ будет поддерживаться мультиклиент, то мне нужно каким-то образом указать серверу, чтобы он открывал НОВЫЙ интерфейс TapX для каждого соединения (чтобы их можно было подключить к мосту br0 на сервере, например:
сервер: мост br0 (tap0, Tap1, Tap2, Tap3 ... TapN) 192.168.104.2
Я просто не могу найти способ сделать это, так как в руководстве по мосту есть некоторые запутанные ошибки конфигурации. Например:
dev tap
dev-node tap-bridge
При чем здесь «отводной мост»? Должен ли это быть br0 (как он упоминается в сценарии запуска моста на той же странице руководства?
В настоящее время я вижу только «решение побольше», когда N серверов работают для N клиентов, обеспечивают Tap0, Tap1, Tap2, ... TapN-1, все соединены под мостом br0 на сервере и, конечно же, прослушивают N UDP. порты.
Я что-то пропустил? Ниже приведены мои файлы конфигурации для сервера и обоих клиентов. Обратите внимание, что оба клиента абсолютно одинаковые, разница лишь в ключах, которые я не публикую. Обратите внимание, что общие имена появляются в журналах сервера при подключении, поэтому я знаю, что тот, кто подключается первым, блокирует сервер.
Также обратите внимание, что от предложенного маршрута «сначала создать рабочую настройку TUN, а затем изменить файлы конфигурации» остались избыточные вещи, как это предлагается в руководстве OpenVPN по мостовому соединению.
Конфигурация сервера:
server-bridge nogw
port 1195
proto udp
dev tap
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
topology subnet
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "redirect-gateway def1 bypass-dhcp"
dh none
ecdh-curve prime256v1
tls-crypt tls-crypt.key
crl-verify crl.pem
ca ca.crt
cert server_wKZztg0TXq0FsUvZ.crt
key server_wKZztg0TXq0FsUvZ.key
auth SHA256
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
tls-server
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
client-config-dir /etc/openvpn/ccd
script-security 2
status /var/log/openvpn/status.log
up /etc/openvpn/server/bridge-start
down /etc/openvpn/server/bridge-stop
verb 3
конфигурация клиента 1:
client
proto udp
explicit-exit-notify
remote serverIPdeleted 1195
dev tap0
resolv-retry infinite
nobind
persist-key
remote-cert-tls server
verify-x509-name server_wKZztg0TXq0FsUvZ name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
ignore-unknown-option block-outside-dns
pull-filter ignore redirect-gateway
script-security 2
up /etc/openvpn/client/bridge-start
down /etc/openvpn/client/bridge-stop
verb 3
конфигурация клиента 2:
client
proto udp
explicit-exit-notify
remote ServerIPDeleted 1195
dev tap0
resolv-retry infinite
nobind
persist-key
remote-cert-tls server
verify-x509-name server_wKZztg0TXq0FsUvZ name
auth SHA256
auth-nocache
cipher AES-128-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256
ignore-unknown-option block-outside-dns
pull-filter ignore redirect-gateway
script-security 2
up /etc/openvpn/client/bridge-start
down /etc/openvpn/client/bridge-stop
verb 3
РЕДАКТИРОВАНИЕ (по запросу): мои сценарии моста с некоторыми добавленными комментариями.
- Скрипт запуска серверного моста
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
# adapted from tutorial
#################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0 tap1 tap2 tap3 tap4"
# Commented because I want to bridge clients networks!
#eth="eth0"
eth_ip="192.168.104.2"
eth_netmask="255.255.255.0"
eth_broadcast="192.168.104.255"
for t in $tap; do
openvpn --mktun --dev $t
done
brctl addbr $br
# below is commented for a reason, see above
#brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
# again commented with a reason above
#ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i tap1 -j ACCEPT
iptables -A INPUT -i tap2 -j ACCEPT
iptables -A INPUT -i tap3 -j ACCEPT
iptables -A INPUT -i tap4 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT
- Скрипт остановки моста сервера
#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged together
tap="tap0 tap1 tap2 tap3 tap4"
ifconfig $br down
brctl delbr $br
#for t in $tap; do
# openvpn --rmtun --dev $t
#done
- Сценарий запуска клиентского моста. Скрипт для другого клиента отличается только IP и MAC адресом. Я назначил MAC-адреса, чтобы позже включить отдельный DHCP-сервер. Клиенты работают, главный вопрос, почему они оба не подключаются к серверу. Любые проблемы с MAC-адресами, IP-адресами, маршрутами обучения будут обнаружены в выходных данных сервера, ЕСЛИ второй клиент ВООБЩЕ подключится (это не так), поэтому я считаю, что проблема не в этом. Оба клиента работают хорошо, пока я пытаюсь подключиться только к одному клиенту. Второй (то, что будет вторым) даже не подключается.
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br="br0"
brmac="00:00:00:10:04:03"
ip="192.168.104.3"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
#The below line is commented FOR NOW until I get it
# to work!
#eth="eth0"
eth_ip=$ip
eth_netmask="255.255.255.0"
eth_broadcast="192.168.104.255"
#for t in $tap; do
# openvpn --mktun --dev $t
#done
brctl addbr $br
ip link set $br address $brmac
#brctl addif $br $eth
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done
# commented for now
#ifconfig $eth 0.0.0.0 promisc up
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast
iptables -A INPUT -i tap0 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT
- Клиентский сценарий остановки моста.
#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged together
tap="tap0"
ifconfig $br down
brctl delbr $br
#for t in $tap; do
# openvpn --rmtun --dev $t
#done
1 ответ
В конце концов я пошел по пути «используй молоток побольше». Настройка заняла некоторое время, но теперь на стороне сервера у меня есть 8 серверов OpenVPN, занимающих 8 портов UDP, с 8 дырами в брандмауэре и устройствами Tap0-Tap7, объединенными под одним мостом br0. Все работает безупречно и довольно надежно. Сценарии моста настроены как отдельная служба, которая запускается в подходящее время перед любым сервером OpenVPN для настройки всех перехватывающих устройств, которые затем подключаются к мосту. Когда клиенты подключаются к своим серверам, трафик проходит беспрепятственно. Никаких настроек уровня 3 в файлах конфигурации openvpn нигде нет.