top
logo


Клиенты openvpn и 2 канала интернет у сервера PDF Печать E-mail
Автор: adm   
06.09.12 08:29

Клиенты 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.
Достаточно создать один файл конфигурации openvpn на клиенте, и в нём прописать секции для каждого IP-адреса сервера. Также в этих секциях можно специфические для каждого IP-адреса настройки, но это не для данного случая. При наличии в настройках клиента опций «ping-restart m» или «keepalive n m», начнётся попытка соединения со следующим сервером через m секунд, если предыдущее подключение было нерабочим.

Т.е. в файле настроек неизменные части сохранятся, добавятся секции :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

 

 

источник: http://skeletor.org.ua/?p=665

ссылка на материал: http://thin.kiev.ua/categoryblog/666-openvpn-clients-and-2-channels-from-the-internet-server.html

{jcomments on}

Последнее обновление 06.09.12 08:37
 
Интересная статья? Поделись ей с другими:

bottom

 

Unreal Commander PfSense по русски Яндекс.Метрика