Представим себе ситуацию: у вас есть удалённый роутер с прошивкой 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 в А-запись домена, и, если отпал канал, тут же менять А-запись на резервный канал.