суббота, 7 мая 2011 г.

Создание устойчивого соединения VPN в Ubuntu 11.04 средствами runit

В одной из прошлых заметок я обещал описать процесс создания VPN соединения во время загрузки, а также возможность создания устойчивого соединения VPN. И если первый пункт (создание соединения на этапе загрузки) реализовать можно стандартными средствами (использование файла описания /etc/network/interfaces, загрузка через /etc/rc.local, загрузочный скрипт в /etc/init.d), то контроль постоянного соединения реализовать достаточно сложно. В данной заметке я покажу как объединить две задачи в одну и решить ее используя пакет runit.


Для начала напишем скрипт, который проверяет наличие соединения VPN и если соединение отсутствует, то устанавливает новое соединение.

У меня получился вот такой набросок:

#!/bin/bash

exec 2>&1

GATEWAY=192.168.10.1
CONNAME=myvpnconnection

# Проверяет соединение до указанного хоста используя icmp echo запрос
check_connection() {
        ping -c 1 $GATEWAY 2>&1 >/dev/null
}

if ! check_connection
then
        echo Маршрут до $GATEWAY не существует. Устанавливаем новое соединение. $(date)

        # Убедимся, что текущее соединение VPN закрыто.
        poff $CONNAME 2>&1 >/dev/null

        # Устанавливаем новое соединение
        pon $CONNAME 2>&1 >/dev/null
fi
sleep 10

Скрипт действует достаточно прямолинейно: проверят доступ до хоста, который будет "виден" только в случае установленного VPN соединения. Если хост недоступен, то в первую очередь выполняется попытка прекращения текущего соединения и выполняется повторный подъем соединения.

В первую очередь, вы должны настроить возможность установки VPN соединения по запросу. Как это сделать подробно описано здесь. Протестируйте скрипт и убедитесь, что его запуск устанавливает соединение VPN. Алгоритм определения существующего соединения VPN вы можете изменить так, как вы считаете лучшим. Можно вместо ping выполнять разбор вывода команды ifconfig на предмет наличия определенных интерфейсов или команды route для отслеживания маршрута до хоста VPN. Это все на ваш вкус, главное - чтобы скрипт корректно поднимал VPN соединение. Если вы хотите, то отладочную информацию можете выводить в стандартный вывод при помощи echo. В дальнейшем она окажется в лог файле.

Итак, поготовительная работа завершена, теперь нам нужно демонизировать скрипт, чтобы соединение VPN было постоянным. Вначале устанавливаем пакет runit.

$ sudo apt-get install runit

Создаем структуру каталогов для нашего сервиса

$ sudo mkdir -p /etc/sv/myvpnconnection/log

Скопируйте созданный скрипт для создания VPN соединения в /etc/sv/myvpnconnection/run и сделайте скрипт исполняемым.

В каталоге /etc/sv/myvpnconnection/log создайте исполняемый файл run следующего содержания:

#!/bin/sh
mkdir -p /var/log/myvpnconnection
exec svlogd -tt /var/log/myvpnconnection

И все! Теперь для создания постоянного соединения VPN достаточно лишь сделать ссылку на наш каталог /etc/sv/myvpnconnection из каталога /etc/service и VPN соединение уничтожить будет практически невозможно!

$ sudo ln -s /etc/sv/myvpnconnection /etc/service/

Что мы имеем в результате? Супервизор runsvdir запускает скрипт run сразу же после создания ссылки. Скрипт выполняется и устанавливает соединение, если соединение еще не установлено или же просто ожидает 10 секунд, если соединение VPN уже есть и выходит. Как только супервизор получает сигнал о завершении работы потомка-скрипта он сразу-же запускает его повторно. Вся информация выводимая скриптом логгируется в файле /var/log/myvpnconnection/current.

По своему опыту могу сказать, что именно этот путь дает наиболее надежные и устойчивые VPN соединения!

Комментариев нет:

Отправить комментарий