четверг, 24 октября 2013 г.

Поднимаем опенвпн (openvpn) тунель между парой микротиков

Если нужно поднять тунель между двумя Микротиками, то вам сюда.
Ниже я расскажу как поднять опенвпн туннель между двумя mikrotik.
Другие туннели не интересны, так как используют заранее известные порты и не обеспечивают достаточного шифрования.

Итак, на RouterOS до 6.5 могут быть проблемы с импортом сертификатов.
Если есть проблема такого плана:
/certificate import file-name=mkt-server.crt
passphrase: *******
action timed out - try again, if error continues contact MikroTik support and send a supout file (13)

то нужно накатывать более свежую прошивку. Мне помогла прошивка 6.6rc1.
Кстати, второй конец туннеля у меня на 6.1 успешно импортировал сертификат... хм, ну да ладно!:)

Итак, первым делом я поставил на ближайшей FreeBSD пакет openvpn22 из портов.
Затем сделал копию /usr/local/share/doc/openvpn/easy-rsa/2.0 в удобное место для экспериментов.

Далее, подправил vars и создал сертификаты, обо всем этом написано в доках по опенвпну:
sh build-ca
sh build-key-server mkt-server
sh build-key mkt-client-1

Затем один единый файл с сертификатами и ключами:
cat ca.crt mkt-client1.crt mkt-client1.key > mkt-client1.mkt
cat ca.crt mkt-server.crt mkt-server.key > mkt-server.key

Эти файлы по протоколу FTP или через winbox загрузил на маршрутизаторы микротик. На каждую сторону - свой.

Затем на маршрутизаторе open-vpn-серверере сделал команду:
/certificate import file-name=mkt-server.mkt

а на маршрутизаторе open-vpn-клиенте - команду:
/certificate import file-name=mkt-client1.mkt

чтобы импортировать сертификаты и ключи.

На маршртизаторе-сервере создал пользователя, пул адресов для open-vpn и настроил сервер.
На клиентской стороне соответственно настроил /interface ovpn-client.
Я получил настроенный шифрованный канал для передачи информации по общественным сетям.

понедельник, 14 октября 2013 г.

Как автоматически переключать каналы на сервере?

На сервере FreeBSD (Linux) нужно настроить автоматическое переключение каналов в случае падения основного канала на резервный. Думал-думал. Можно изящно сделать было на базе quagga (bgpd) и двух бгп-сессий. Но, в моем случае надо такое решение тщательно потестировать, а я не мог - в локалке сервера круглосуточно работают пользователи. И в моем случае один из каналов работает на mpd5 - туннель pptp. А второй ethernet.

Придумал простой способ: пускать регулярно один пинг с соурс-адресом каждого из обоих интерфейсов наружу, например на гугл-днс и по результату прохождения пинга принимать решение работает канал или нет. Чтобы схема работала нужно чтобы был на сервере настроен соурс-роутинг, то есть в зависимости от соурс-адреса пакет уходит на соответствующий шлюз (то есть в соответствующий маршрут).

Скрипт пускает пинг с разными соурс-адресами на днс-сервера гугла, и, если результат команді пинг успешный, то переменной задается значение 1. А потом проверяются занчения переменных, и по результатам проверок меняются маршруты. Естественно на обоих каналах организован НАТ.

Скрипт, который я написал для этого вот:

#!/bin/sh

rcpt="admin@example.com"

## PPTP link
ip1="87.k.m.p"
gw1="x.x.x.x"

## ETHERNET link
ip2="91.x.y.z"
gw2="91.x.y.n"

## default:
gw_default="$gw1"

## check what current default gw
current_dgw=`netstat -rn|grep ^default|awk '{print $2}'`;

gw1_good=0
gw2_good=0

## assign new value if ping ok:
ping -S $ip1 -c1 -i5 8.8.8.8 > /dev/null 2>&1 && gw1_good=1
ping -S $ip2 -c1 -i5 8.8.8.8 > /dev/null 2>&1 && gw2_good=1

if [ $gw1_good = 1 ] && [ $gw2_good = 1 ]; then
        if [ $current_dgw != $gw_default ]; then
                echo "Ping probe to both gateways OK. \
                Changed default route to default $gw_default."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        fi
        route change default $gw_default >/dev/null 2>&1
        exit;
fi

if [ $gw1_good = 0 ] && [ $gw2_good = 1 ]; then
        route change default $gw2 >/dev/null 2>&1
        echo "Ping probe via $gw1 failed. \
                Changed default route to $gw2."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        exit
fi

if [ $gw1_good = 1 ] && [ $gw2_good = 0 ]; then
        route change default $gw1 >/dev/null 2>&1
        echo "Ping probe via $gw2 failed. \
                Changed default route to $gw1."|\
                mail -s "WARNING: SRV routing changes" $rcpt
        exit
fi