Категорії
WRT

Клиенты openvpn и 2 канала у сервера

Представим себе ситуацию: у вас есть удалённый роутер с прошивкой openwrt. Центральный офис имеет 2 канала (резервирование). При пропадании одного канала, клиент должен автоматом переподключаться к резервному. Довольно простая задача и довольно простое решение.

Замечу, что здесь рассматривается подключение по протоколу tap с адресами для vpn’a 10.200.200.0/24. Если у вас tun – скрипт достаточно просто корректируется.

Суть следующая: запускаем одновременно 2 подключения на IP-адреса обеих каналов. При пропадании одного из каналов, соединение tap обрывается, соответственно маршрут пропадает. Вот именно этот момент и будем отлавливать для автоматического переподключения.

1) Конфигурации.

Ниже приведены конфигурации для клиентских подключений к хостам A (ip=AA.AA.AA.AA)

cat /etc/openvpn/AA.conf

client
proto udp
dev tap1
remote AA.AA.AA.AA:1194
nobind
persist-key
keepalive 10 120
cipher BF-CBC
compress lzo
verb 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client.crt
key /etc/openvpn/client.key

и B(ip=BB.BB.BB.BB)

cat /etc/openvpn/BB.conf

client
proto udp
dev tap2
remote BB.BB.BB.BB:1194
nobind
persist-key
keepalive 10 120
cipher BF-CBC
compress lzo
verb 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/BB.crt
key /etc/openvpn/BB.key

2) Скрипт автопереподключения

Вот содержимое скрипта для автопереподключения /scripts/openvpn_switch

#!/bin/sh

count_route=`netstat -rn | grep 10.200.200.0 | wc -l`
count_tap=`netstat -rn | grep tap | wc -l`
if [ $count_route -eq 1 -a $count_tap -eq 1 ]
then
tap_name=`netstat -rn | grep 10.200.200.0 | awk '{print $8}'`
case $tap_name in
tap1)
kill -1 `cat /var/run/openvpn.A.pid`
;;
tap2)
kill -1 `cat /var/run/openvpn.B.pid`
;;
esac
fi

Теперь добавим задачу в cron:

echo '*/1 * * * * /scripts/openvpn_switch' >> /etc/crontabs/root

3) Скрипты автозапуска.

Что бы сервисы стартовали при перезагрузке, создадим стартовые скрипты:

Для хоста A

cat /etc/init.d/openvpn_A

#!/bin/sh /etc/rc.common
START=99
start() {
/usr/sbin/openvpn --daemon openvpn_A --cd /etc/openvpn --config /etc/openvpn/A.conf --writepid /var/run/openvpn.A.pid
}

и для хоста B

cat /etc/init.d/openvpn_B

#!/bin/sh /etc/rc.common
START=99
start() {
/usr/sbin/openvpn --daemon openvpn_B --cd /etc/openvpn --config /etc/openvpn/B.conf --writepid /var/run/openvpn.B.pid
}

И напоследок создадим симлинки в директории /etc/rc.d:

#ln -s   ../init.d/openvpn_A   S99openvpn_A
#ln -s   ../init.d/openvpn_B   S99openvpn_B

4) Запуск.

Что бы заставить работать у нас 2 варианта: либо перезагрузить роутер, либо запустить вручную. Пойдём по второму пути: запускаем стартовые скрипты:

#/etc/init.d/openvpn_A start
#/etc/init.d/openvpn_A start
#/etc/init.d/cron start

По умолчанию, если файл /etc/crontabs/root пустой, то cron не запускается автоматически. Если у вас он не пустой – тогда последнюю команду не нужно выполнять.

6 коментарів “Клиенты openvpn и 2 канала у сервера”

Можно проще, используя встроенные возможности openvpn.
Достаточно создать один файл конфигурации openvpn на клиенте, и в нём прописать секции для каждого IP-адреса сервера. Также в этих секциях можно специфические для каждого IP-адреса настройки, но это не для данного случая. При наличии в настройках клиента опций “ping-restart m” или “keepalive n m”, начнётся попытка соединения со следующим сервером через m секунд, если предыдущее подключение было нерабочим.
Т.е. в файле настроек неизменные части сохранятся, добавятся секции :

cat /etc/openvpn/ABC.conf

client
proto udp
dev tap2

remote AA.AA.AA.AA:1194

remote BB.BB.BB.BB:1194

nobind
persist-key
keepalive 10 120
cipher BF-CBC
comp-lzo
verb 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client.crt
key /etc/openvpn/client.key

Не прошло принципиальное содержимое, попытаюсь ещё раз.

Можно проще, используя встроенные возможности openvpn.
Достаточно создать один файл конфигурации openvpn на клиенте, и в нём прописать секции для каждого IP-адреса сервера. Также в этих секциях можно специфические для каждого IP-адреса настройки, но это не для данного случая. При наличии в настройках клиента опций “ping-restart m” или “keepalive n m”, начнётся попытка соединения со следующим сервером через m секунд, если предыдущее подключение было нерабочим.
Т.е. в файле настроек неизменные части сохранятся, добавятся секции connection:

cat /etc/openvpn/ABC.conf

client
proto udp
dev tap2

remote AA.AA.AA.AA:1194

remote BB.BB.BB.BB:1194

nobind
persist-key
keepalive 10 120
cipher BF-CBC
comp-lzo
verb 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client.crt
key /etc/openvpn/client.key

Невидны тэги в угловых скобках, похожие таким образом на HTML тэги. Нужно угловые скобки экранировать. Параметр conntction должен быть в угловых скобках. Можно было бы отредактировать, сделал бы, но приходится применить третью попытку.

Можно проще, используя встроенные возможности openvpn.
Достаточно создать один файл конфигурации openvpn на клиенте, и в нём прописать секции <connection></connection> для каждого IP-адреса сервера. Также в этих секциях можно задавать специфические для каждого IP-адреса настройки, но это не для данного случая. При наличии в настройках клиента опций “ping-restart m” или “keepalive n m”, начнётся попытка соединения со следующим сервером через m секунд, если предыдущее подключение было нерабочим.
Т.е. в файле настроек неизменные части сохранятся, добавятся секции <connection>:

cat /etc/openvpn/ABC.conf

client
proto udp
dev tap2
<connection>
remote AA.AA.AA.AA:1194
</connection>
<connection>
remote BB.BB.BB.BB:1194
</connection>
nobind
persist-key
keepalive 10 120
cipher BF-CBC
comp-lzo
verb 0
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client.crt
key /etc/openvpn/client.key

Есть сервер Ubuntu на котором вращается OpenVPN. К нему заведен канал с доменным именем, например fop.com. Клиентам раздаются конфигы и в конфиге указано подключение к серверу OpenVPN по доменному имени.
Сейчас понадобился еще один канал для бесперебойной работы. То есть, если отвалился главный канал, чтобы автоматом перебрасывался на резервный. Как реализовать такую схему? У меня есть еще один канал который заходит в микротик, но там привязано другое доменное имя, возможно можно эти два канала объединить?

Если по доменному имени, то ставить слишком маленький TTL в А-запись домена, и, если отпал канал, тут же менять А-запись на резервный канал.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff