30 окт. 2010 г.

Настройка openvpn-туннеля к PirateISP (Швеция)

Получил я приглашение от PirateISP на закрытое бета-тестирование их VPN-анонимайзера, который они замутили на OpenVPN. При настройке подключения возникли две проблемы, и об их решении мы сегодня поговорим. 
Во-первых, провайдером присылается сертификат, зашифрованный паролем, который вводился при регистрации. И, соответственно, опенвпн его при поднятии туннеля спрашивает. Неудобно, к тому же и пароль "кучерявый" у меня. Эта проблема решается простым добавлением в конфигурационный файл строчки  askpass /etc/openvpn/pass, где /etc/openvpn/pass есть файл, в котором, собственно, пароль и записан. 
Вторая проблема - некорректная обработка процессом опенвпн-а случая, когда маршрут по умолчанию задан не шлюзом, а интерфейсом, то есть:
inspire:/home/delayer# route -n | grep 0.0.0.0
0.0.0.0         0.0.0.0          0.0.0.0         UG    0      0        0 ppp200
При таком раскладе опенвпн (версия 2.1.3-2) не может отработать push-нутую сервером команду redirect-gateway, которая подменяет текущий маршрут по умолчанию новым, проходящим внутри туннеля, и задает дополнительный статический маршрут на удаленный vpn-сервер через старый маршрут по умолчанию, дабы туннель после смены дефгейтвея не отвалился сам по себе. При этом туннель все же поднимается, но трафик через него наотрез ходить отказывается.
Эту проблему удалось решить, подменяя перед запуском опенвпн-а маршрут по умолчанию через ppp-интерфейс маршрутом по умолчанию через шлюз, являющийся внешним ip-адресом означенного ppp-интерфейса. К сожалению, сделать это сразу (например, при начальной конфигурации интерфейсов при запуске ОС) не представляется возможным, ибо мой ISP дает мне хоть и "белый", но динамический IP-адрес. Поэтому приходится выкручиваться, определяя каждый раз выданный адрес снова и подставляя его в качестве маршрута.
Конечно, проделывать все вышеописанные идеи в консоли долго и неспортивно, поэтому был набросан небольшой bash-скрипт, позволяющий одной командой поднимать и опускать наш туннель к шведам.
cat /usr/local/bin/pisp.sh
#!/bin/bash

# Дано ;)
SUDO=/usr/bin/sudo
ROUTE=/sbin/route
OVPN_INIT=/etc/init.d/openvpn
EXP=/usr/bin/expect
PirateISP=pirateisp
FLUSH=/usr/bin/flush

# Получение внешнего IP
Rtel_IP=`/sbin/ifconfig ppp200 | grep "inet addr:" | awk {'print $2'} | sed "s/addr://"`

# Функция поднятия туннеля, включает в себя операции
# по изменению маршрутов по умолчанию
function up_tunnel {
    $SUDO $ROUTE del default dev ppp200
    $SUDO $ROUTE add default gw $Rtel_IP
    $SUDO $OVPN_INIT start $PirateISP
}

# Обратная предыдущей функция опускания туннеля
function down_tunnel {
    $SUDO $OVPN_INIT stop $PirateISP
    $SUDO $ROUTE del default gw $Rtel_IP
        $SUDO $ROUTE add default dev ppp200
}
# Выбор действия
case "$@" in
# Старт туннеля и запуск торрент-клиента
# (ради чего всё и писалось =) )
    flush)
        up_tunnel
        sleep 5
        $FLUSH
    ;;
# Поднятие туннеля
    start)
        up_tunnel
    ;;
# Отключение соединения
    stop)
        down_tunnel
    ;;
# Справка
    *)
          echo "Usage: $0 {start|stop|flush}" >&2
          exit 1
      ;;
esac
Теперь, набрав pisp.sh start, я через несколько секунд получаю openvpn-туннель с белым адресом, который Яндекс определяет как стокгольмский. Ввиду закрытости бета-теста народу немного, поэтому скорости отличные (по сравнению с тем же IPredator'ом, где, по слухам, больше 200kbps не дождешься). Такая скорость, по мнению Яндекса, у меня напрямую (IP: 94.181.193.48):
А такая - через PirateISP (IP: 194.14.172.146):
Я.Интернет. Измерьте вашу скорость.
Вот и сказочке конец, а кто слушал - молодец =).