Клиенты 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
comp-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
comp-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 не запускается автоматически. Если у вас он не пустой — тогда последнюю команду не нужно выполнять.

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

  1. maxfd

    Можно проще, используя встроенные возможности 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

  2. maxfd

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

    Можно проще, используя встроенные возможности 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

  3. maxfd

    Невидны тэги в угловых скобках, похожие таким образом на 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

  4. Александр Автор записи

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

    1. skeletor Автор записи

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *