OpenVPN и два параллельных туннеля (от одного клиента к одному и тому же серверу)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

OpenVPN и два параллельных туннеля

Сообщение Goodvin »

Доброго времени суток.

Вводная:
1. Есть контора, у которой имеется
- центральный офис (Ц), внутреняя сеть 10.2.1.0/255.255.255.0
- удаленный офис-филиал (Ф), внутренняя сеть 10.10.1.0/255.255.255.0
2. В обоих офисах есть два выхода в интернет через двух разных провайдеров: пров1 быстрый и дорогой, пров2 медленный и дешёвый.


Задача:
- поднять из удаленного офиса в ценетральный офис ДВА openvpn-туннеля, один пров1 (внешний IP XXX.XXX.XXX.XXX) , второй через пров2 (внешний IP YYY.YYY.YYY.YYY) для того, чтобы пустить разные виды трафика по разным туннелям (например, почту по медленному каналу, а видеоконференцию по быстрому каналу).
Трафик планируется делить посредством iptables, идентифицируя пакеты по портам и раскидывая их на нужный интерфейс (туннель).

Что имеем:
1. в центральном офисе поднят OpenVPN-сервер (конфиг /etc/openvpn/server.conf):

Код:

port 1194 proto udp dev tun ca ca.crt cert vpnserver.crt key vpnserver.key dh dh1024.pem server 10.50.1.0 255.255.255.0 ifconfig-pool-persist ipp.txt client-config-dir ccd route 10.10.1.0 255.255.255.0 route 10.50.1.0 255.255.255.0 keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log verb 3 tun-mtu 1500


2. На сервере имеется файл /etc/openvpn/ccd/client1:

Код: Выделить всё

ifconfig-push 10.30.1.8 10.30.1.1
iroute 10.10.8.0 255.255.252.0


3. В удаленном офисе поднят openvpn, вот клиентский конфиг /etc/openvpn/client1.conf:

Код:

client dev tun1 proto udp remote XXX.XXX.XXX.XXX 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key comp-lzo verb 3 tun-mtu 1500


Канал через провайдера пров1 поднимается, всё работает отлично.

Вопрос:
как поднять второй канал с этого же клиента к томуже самому серверу через другого провайдера пров2 ?


Проблема в том, что клиентские сертификаты и ключи привязаны к имени машины, и соответственно, на сервере клиенту задаются настройки из файла
/etc/openvpn/ccd/<CN из сертификата>, и для второго туннеля клиенту выдадутся IP-адреса и маршруты, аналогичные первому туннелю.

Как быть ?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Goodvin писал(а):
04.02.2008 16:02
Проблема в том, что клиентские сертификаты и ключи привязаны к имени машины, и соответственно, на сервере клиенту задаются настройки из файла

Дык, а в чём трабл создать 2 сертификата клиентских?
Типа client_isp1, client_isp2?
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

KiWi писал(а):
04.02.2008 16:45
Goodvin писал(а):
04.02.2008 16:02
Проблема в том, что клиентские сертификаты и ключи привязаны к имени машины, и соответственно, на сервере клиенту задаются настройки из файла

Дык, а в чём трабл создать 2 сертификата клиентских?
Типа client_isp1, client_isp2?
Если я ничего не путаю, то сервер смотрит на CommonName из сертификата и в соответствии с этим CommonName использует файл с клиентскими настройками из каталога /etc/openvpn/ccd/
И если я правильно понял прочитанную документацию, при создании двух разных сертифкатов CommonName в обоих сертификатах будет один и тот же, ибо привязан к имени машины.
Разве не так ?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Goodvin писал(а):
04.02.2008 17:09
KiWi писал(а):
04.02.2008 16:45
Goodvin писал(а):
04.02.2008 16:02
Проблема в том, что клиентские сертификаты и ключи привязаны к имени машины, и соответственно, на сервере клиенту задаются настройки из файла

Дык, а в чём трабл создать 2 сертификата клиентских?
Типа client_isp1, client_isp2?
Если я ничего не путаю, то сервер смотрит на CommonName из сертификата и в соответствии с этим CommonName использует файл с клиентскими настройками из каталога /etc/openvpn/ccd/
И если я правильно понял прочитанную документацию, при создании двух разных сертифкатов CommonName в обоих сертификатах будет один и тот же, ибо привязан к имени машины.
Разве не так ?

Нет, common name ~ username в клиентских сертификатах.
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

Сенкс, пошел пробовать.
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

Сделал второй комплект сертификатов/ключей.
Подсети двух туннелей решил делить вот так:

туннель через пров1: 10.50.1.8/255.255.255.252
туннель через пров1: 10.50.2.8/255.255.255.252

Переделал серверные конфиги вот так:
/etc/openvpn/server.conf

Код:

port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh1024.pem server 10.50.0.0 255.255.0.0 ifconfig-pool-persist ipp.txt client-config-dir ccd client-to-client keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log verb 3 tun-mtu 1500

/etc/openvpn/ccd/client1

Код: Выделить всё

ifconfig-push 10.50.1.10 10.50.1.9

/etc/openvpn/ccd/client2

Код: Выделить всё

ifconfig-push 10.50.2.10 10.50.2.9


Что получаю:
1. Оба туннеля поднимаются, клиентские концы туннелей получают адреса соответственно 10.50.1.10 и 10.50.2.10
2. На vpn-сервере таблица маршрутов получается вот такая:

Код: Выделить всё

vpnserver:/etc/openvpn # route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.50.0.2       0.0.0.0         255.255.255.255 UH    0      0        0 tun0
xxx.xxx.xxx.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.2.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
yyy.yyy.yyy.0   0.0.0.0         255.255.255.0   U     0      0        0 eth2
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
10.50.0.0       10.50.0.2       255.255.0.0     UG    0      0        0 tun0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         10.2.0.2        0.0.0.0         UG    0      0        0 eth0


3. Со стороны VPN-сервера пингуется клиентский конец только того туннеля, который был поднят последним.
Подскажите, в чем может быть причина ?

4. И откуда взялся Gateway 10.50.0.2 ?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Goodvin писал(а):
04.02.2008 18:52
3. Со стороны VPN-сервера пингуется клиентский конец только того туннеля, который был поднят последним.
Подскажите, в чем может быть причина ?

Роуты... Клиентские роуты.

Странно, что второй vpn не падает... Или у сервера 2 ip-адреса?
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

KiWi писал(а):
05.02.2008 00:29
Goodvin писал(а):
04.02.2008 18:52
3. Со стороны VPN-сервера пингуется клиентский конец только того туннеля, который был поднят последним.
Подскажите, в чем может быть причина ?

Роуты... Клиентские роуты.

Интуитивно догадываюсь, что причниа в этом.
Но увидеть, что в моих роутах неправильно - пока не смог.

KiWi писал(а):
05.02.2008 00:29
Странно, что второй vpn не падает... Или у сервера 2 ip-адреса?
Да, у сервера их два.
Как я писал выше, от разных провайдеров.
Один туннель поднимается к одному адресу, второму ко второму.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Goodvin писал(а):
05.02.2008 09:28
Интуитивно догадываюсь, что причниа в этом.
Но увидеть, что в моих роутах неправильно - пока не смог.

1. Покажи "ip a" для сервера(в частности -- какие IP висят на tun0).
2. Покажи роуты клиента.
Спасибо сказали:
BlizZz
Сообщения: 104
ОС: OpenSuSE 11.0, Ubuntu 8.10

Re: OpenVPN и два параллельных туннеля

Сообщение BlizZz »

Goodvin писал(а):
04.02.2008 18:52
3. Со стороны VPN-сервера пингуется клиентский конец только того туннеля, который был поднят последним.
Подскажите, в чем может быть причина ?

А в логах то openvpn'а что-нибудь видно?
Как вариант, может быть проблема с маршрутизацией обратных UDP пакетов через неправильный шлюз, openvpn такого не любит :) .
Лучше было бы поднять 2 сервера на разных портах и прибиндить каждый к конкретному IP.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Заставляете старого человека делать всё самому...
Имеем /etc/openvpn/openvpn.conf на сервере:

Код:

mode server port 1194 proto tcp-server tls-server dev tap0 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key dh /etc/openvpn/easy-rsa/keys/dh1024.pem server 172.31.127.0 255.255.255.0 ifconfig-pool-persist /etc/openvpn/ipp.txt push "route-gateway 172.31.127.1" client-config-dir /etc/openvpn/ccd client-to-client keepalive 10 120 comp-lzo max-clients 2 user openvpn group openvpn persist-key persist-tun status /tmp/openvpn-status.log log-append /var/log/openvpn.log verb 3


/etc/openvpn/ipp.txt

Код: Выделить всё

klotho_isp1,172.31.127.3
klotho_isp2,172.31.127.4


Клиентские конфиги:
/etc/openvpn/deverra_isp1.conf:

Код:

client dev tap proto tcp remote 89.208.38.100 1194 resolv-retry infinite nobind persist-key persist-tun comp-lzo ns-cert-type server user nobody group nogroup ca /etc/openvpn/deverra_isp1/ca.crt cert /etc/openvpn/deverra_isp1/klotho_isp1.crt key /etc/openvpn/deverra_isp1/klotho_isp1.key


/etc/openvpn/deverra_isp2.conf:

Код:

client dev tap proto tcp remote 89.208.38.101 1194 resolv-retry infinite nobind persist-key persist-tun comp-lzo ns-cert-type server user nobody group nogroup ca /etc/openvpn/deverra_isp2/ca.crt cert /etc/openvpn/deverra_isp2/klotho_isp2.crt key /etc/openvpn/deverra_isp2/klotho_isp2.key


Далее на клиенте добавляем роуты на сервер:

Код: Выделить всё

ip r a 89.208.38.100 dev ppp1
ip r a 89.208.38.101 dev ppp2


Поднимаем openvpn.

Удаляем маршруты из основной таблицы маршрутизации:

Код: Выделить всё

ip r d 172.31.127.0/24
ip r d 172.31.127.0/24


Далее меняем приоритет основной таблицы маршрутизации(лень писать -- оно у меня уже было изменено) и добавляем правила:

Код: Выделить всё

ip ru add from 172.31.127.3 lookup 103 prio 32762
ip ru add to 172.31.127.3 lookup 103 prio 32763
ip ru add from 172.31.127.4 lookup 104 prio 32764
ip ru add to 172.31.127.4 lookup 104 prio 32765


И добавляем роуты в нужные таблицы:

Код: Выделить всё

ip ro add 172.31.127.0/24 dev tap0 table 103 src 172.31.127.3
ip ro add 172.31.127.0/24 dev tap1 table 104 src 172.31.127.4


В итоге -- с сервера всё пингуется, на клиента осталось распихать трафик по 2 таблицам маршрутизации.

Всё, что может иметь отношении(на клиенте):

Код:

# ip ru 0: from all lookup local 32760: from all lookup main ... 32762: from 172.31.127.3 lookup 103 32763: from all to 172.31.127.3 lookup 103 32764: from 172.31.127.4 lookup 104 32765: from all to 172.31.127.4 lookup 104 ... 32767: from all lookup default # ip ro ... 89.208.38.100 dev ppp1 scope link 89.208.38.101 dev ppp2 scope link # ip ro sh t 103 172.31.127.0/24 dev tap0 scope link src 172.31.127.3 # ip ro sh t 104 172.31.127.0/24 dev tap1 scope link src 172.31.127.4 # ip a ... 148: tap0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 link/ether 00:ff:f6:27:b7:7d brd ff:ff:ff:ff:ff:ff inet 172.31.127.3/24 brd 172.31.127.255 scope global tap0 149: tap1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100 link/ether 00:ff:b9:d4:cf:55 brd ff:ff:ff:ff:ff:ff inet 172.31.127.4/24 brd 172.31.127.255 scope global tap1
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

Прошу прощения за долгое молчание - был заморочен, проводил эксперименты на макете из 4 серверов, который специально для этого построил.

Проблему, описанную выше, на сегодня решил так: на сервере для каждого туннеля поднял собственную копию демона openvpn на отдельном порту.
Все остальные варианты кроме этого не давали желаемого результата.
За время экспериментов неплохо подтянул матчасть, ликвидировав пробелы в знаниях касательно VPN-ов.

За помощь всем спасибо, все советы оказались полезными.

KiWi:
мне tap не подходит, эзернет-бридж не годится, нужны tun-ы..
Уже заработало.

Осваиваю дальше, начал возиться с маршрутизацией и разделением потоков трафика.
При возникновении дальнейших проблем буду делиться и спрашивать.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Goodvin писал(а):
06.02.2008 20:19
KiWi:
мне tap не подходит, эзернет-бридж не годится, нужны tun-ы..

Да это без разницы...
tun -- это Layer3, arp -- тоже Layer3. :-)
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

Пользуюсь информацией из документации, то бишь из комментариев к дефолтному конфигу:

# "dev tun" создаст маршрутизируемый IP туннель,
# "dev tap" создаст ethernet туннель.
# Используйте "dev tap0" если вам нужен мост
# и объедините полученный tap0 виртуальный интерфейс
# в режиме моста с вашим ethernet интерфейсом.
# Если вы хотите управлять правами доступа
# через VPN, вы должны создать правила файервола
# для TUN/TAP интерфейса.
# На не-Windows системах, вы можете указать
# явный номер устройствам, как например, tun0.
# В Windows, используйте для этого "dev-node".
# В большинстве систем, VPN не будет работать
# пока вы частично или польностью не отключите
# файервол для TUN/TAP интерфейса.
;dev tap
dev tun
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Goodvin писал(а):
06.02.2008 21:02
Пользуюсь информацией из документации, то бишь из комментариев к дефолтному конфигу:

dev tap0 остался по историческим причинам(на сервере когда-то был мост).
Спасибо сказали:
BlizZz
Сообщения: 104
ОС: OpenSuSE 11.0, Ubuntu 8.10

Re: OpenVPN и два параллельных туннеля

Сообщение BlizZz »

KiWi писал(а):
06.02.2008 17:41
Заставляете старого человека делать всё самому...
Имеем /etc/openvpn/openvpn.conf на сервере:

В итоге -- с сервера всё пингуется, на клиента осталось распихать трафик по 2 таблицам маршрутизации.

Всё конечно замечательно, но работает только если на клиенте тоже 2 исходящих канала.
В случае одного адреса, на сервере ещё придется разруливать обратные пакеты в правильный канал. И вот как раз для UDP режима одним сервером уже не обойтись.

Сам недавно возился с похожей проблемой.
На сервере было несколько интернет каналов, причем все с динамическим IP. Вообщем, с openvpn там довольно сложно все получалось из-за проблемы с маршрутизацией UDP, потому сделал все на IPSec.
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

История продолжается и появились дополнительные вопросы.

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

Во-вторых, повились новые вопросы.

Вопрос номер раз:
каким способом организовать гарантированное восстановление туннеля после его падения ?

Что делал:
1. Туннели ходят по UDP
2. Использую в серверном конфиге параметр

Код: Выделить всё

keepalive 10 60

Происходит следующее:
после сбоя в сети провайдера туннель падает и через некоторое время клиентская сторона пытается его снова поднять.
Однако серверная сторона OpenVPN-а почему-то считает, что соединение с этим клиентом всё еще живо и не дает этому клиенту поднять новый туннель.

Вопрос:
Подскажите, как это забороть ?
Или направьте почитать в нужную сторону.
Или поделитесь своим опытом по сабжу.
В гугле и в официальной документации ответа пока не нашел.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Как вариант -- tcpdump туннеля и смотрят на "ping-like messages".
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: OpenVPN и два параллельных туннеля

Сообщение gcc »

у меня было два тонеля-клиента конектились к серверам которые были в разных подсетях, все работало

по гуглите про марштрутизацию, вдруг будет или в списке рассылку может подскажут...
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

gcc писал(а):
18.03.2008 22:48
у меня было два тонеля-клиента конектились к серверам которые были в разных подсетях, все работало

по гуглите про марштрутизацию, вдруг будет или в списке рассылку может подскажут...
С маршрутизацией всё в порядке, этот вопрос давно прояснён - все пакеты ходят куда надо.
Актуален вопрос про переподнятие туннеля после сбоя.


KiWi писал(а):
18.03.2008 20:43
Как вариант -- tcpdump туннеля и смотрят на "ping-like messages".

Интересная мысль, посмотрю.
ТОлько вот как сделать этот самый "-- tcpdump туннеля", если туннель не отвечает и не подаёт признаков жизни ?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: OpenVPN и два параллельных туннеля

Сообщение KiWi »

Goodvin писал(а):
19.03.2008 19:02
gcc писал(а):
18.03.2008 22:48
у меня было два тонеля-клиента конектились к серверам которые были в разных подсетях, все работало

по гуглите про марштрутизацию, вдруг будет или в списке рассылку может подскажут...
С маршрутизацией всё в порядке, этот вопрос давно прояснён - все пакеты ходят куда надо.
Актуален вопрос про переподнятие туннеля после сбоя.


KiWi писал(а):
18.03.2008 20:43
Как вариант -- tcpdump туннеля и смотрят на "ping-like messages".

Интересная мысль, посмотрю.
ТОлько вот как сделать этот самый "-- tcpdump туннеля", если туннель не отвечает и не подаёт признаков жизни ?

tcpdump -ni tap0
Или tun0, или какой там интерфейс? Сам интерфейс же остается включенным?
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: OpenVPN и два параллельных туннеля

Сообщение Goodvin »

[бьет себя тапком по лбу]
Точно! Я ведь могу смотреть на оставшийся tun с серверной стороны.
Сенкс, пошел смотреть.
Спасибо сказали: