Представим себе ситуацию: у вас есть удалённый роутер с прошивкой 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
По умолчанию, если файл /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
Клиенты 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}