Заметки на память

Клиент VPN

Мой провайдер предоставляет доступ в интернет посредством VPN. В истории этого протокола я не разбирался, но сложилось впечатление, что к созданию приложило руку Microsoft. Как бы то ни было, но Linux в плане настройки изначально сильно не дружил с VPN. Но времена меняются и рецептов для соединения Linux-станции с VPN-сервером в сети появилось предостаточно, в том числе и на русском. Но одни у меня не заработали, другие были не слишком удобны в использовании, третьи… вобщем пришлось для себя собирать рецепт по кусочкам из разных мест.

Внимание! Всё ниже сказанное относится к сети Cinet города Королёва применительно к дистрибутиву Slackware 11.0 (ядро 2.6.17.13). Настройки для вашего провайдера могут отличаться. Пытайте админов. 🙂

Итак, вот что у меня в результате получилось:

Во первых нам понадобятся установленные пакеты: пакет из дистрибутива Slackware ppp-2.4.4-i486-1.tgz (путь: /дистрибутив/slackware/n/) и пакет PPTP Client (домашняя страница). Для Slackware специально подготовленного пакета pptp не было, так что я взял исходник pptp-1.7.1.tar.gz. Далее стандартная комбинация:

$ tar -xvvzf pptp-1.7.1.tar.gz
$ cd pptp-1.7.1
$ make
$ sudo make install

Замечу, что установка PPTP Client предполагает что pppd установлен в /usr/sbin.Если это не так — читайте INSTALL.

Далее, создаём файл /etc/ppp/peers/имя_соединения (я соединение назвал cinet) со следующим содержимым:

name ваш_логин
remotename PPTP
debug
lock
deflate 0
defaultroute
pty "pptp адрес_vpn_сервера --nolaunchpppd"

Свой логин я не скажу 🙂 а vpn сервер в моём случае это vpn.cinet.lan. Здесь может быть и ip-адрес, но это неудачное решение — а если провайдер его сменит? Раз провайдер даёт имя серверу, лучше пользовать именно его. Только одно но: важно, чтобы при установке соединения не потерялся маршрут к локальному dns (если кто забыл, например я 🙂 , то адрес dns прописывается в /etc/resolv.conf). Указание debug можно всегда удалить, но если что-то не работает, то эта опция включает подробный вывод ошибок в лог, который обычно помогает определить в чём проблема. Указание defaultroute при установке соединения, как и положено, перенаправляет весь трафик на шлюз vpn. Но при этом у меня становятся недоступны адреса в локальной сети, в т.ч. и dns-сервер. Как это обойти читаем чуть дальше.

Пароль для соединения прописывается в файле /etc/ppp/chap-secrets строкой вида:

ваш_логин * "ваш_пароль" *

В файле /etc/ppp/options.pptp идут настройки характерные для моего провайддера. У вас они могут быть и другие. В частности, бывает нужно включать шифрование — тогда смотрите опции mppe, в добавок должна быть поддержа mppe ядром (включена начиная с 2.6.15. Если у вас ниже — читайте страницу PPTP Client-а). Если не знаете параметры mtu и mru , то их обычно можно поставить 1000. Ещё вычитал про параметр persist — он заставляет пересоединяться при потери соединения. Пока я его работу не проверял, так что в конфиге он закомментирован. Когда с ним поэкспериментирую — расскажу. Но это всё лирика, а вот и содержимое моего файла /etc/ppp/options.pptp :

lock
mtu 1490
mru 1490
deflate 0
auth
+chap
-pap
nobsdcomp
nodeflate
defaultroute
#persist

Теперь что касается сохранения маршрута к локальным адресам. В моём случае все локальные адреса удовлетворяют маске 10.*.*.*. Поэтому можно перед соединением с vpn удалить маршрут по умолчанию (он будет установлен на vpn-шлюз по ходу установки соединения) и добавить маршрут к адресам локальной сети:

# route del default
# route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.0.0.50

здесь 10.0.0.0 — адрес локальной сети, 255.0.0.0 — её маска удовлетворяющая вышеописанному случаю, ну и 10.0.0.50 — адрес шлюза в моей локальной подсетке.
В принципе теперь достаточно дать команду

# pppd call имя_соединения

и весь интернет в наших руках. Лишь бы денег хватило 🙂 Но во-первых — это надо делать с правами рута, а во-вторых слишком много каждый раз набирать. Конечно в таких случаях пишется скрипт и прописываются права на его исполнение с помощью команды sudo обычному пользователю (права пишутся в файле /etc/sudoers). Я поначалу так и сделал. Но потом возникла необходимость в отключении соединения или его рестарте, а также автоматическом запуске соединения при загрузке системы. Вобщем в результате был написан скрипт похожий на те, что лежат в /etc/rc.d и служат для запуска и остановки разных служб при старте и выключении системы. Разве у нас не тот случай? Для поддержания работы соединения, сама команда соединения была обрамлена циклом и вынесена в отдельный скрипт. Итак, собственно скрипты:
Файл /etc/rc.d/rc.vpn:

#!/bin/sh

GATEWAY="10.0.0.50"
LINE="========================================"

VPNFLAG="/tmp/vpn-connected"
export VPNFLAG
VPNLOG="/var/log/vpn.log"
export VPNLOG

start() { # установка соединения с vpn-сервером
    echo -n "Starting VPN connection... "
    # проверяем: включено ли уже соединение
    if [ ! -f $VPNFLAG ]; then
        # не включено - включаем
        echo -e "\n$LINE\nStarting at `date`" >> $VPNLOG
        # устанавливаем флаг необходимости переподключения
        echo `date` > $VPNFLAG
        # подготавливаем маршруты к поднятию нового интерфейса
        route del default 2>/dev/null
        route add -net 10.0.0.0 netmask 255.0.0.0 gw $GATEWAY 2>/dev/null
        # запускаем цикл проверки и установки соединения в фоне
        /sbin/vpn.sh &
        echo "done."
    else
        # уже включено - ничего не делаем
        echo "already been stated."
    fi
}

stop() { # закрытие соединения с vpn-сервером
    echo -n "Stopping VPN connection... "
    echo -e "\nStopping at `date`\n$LINE" >> $VPNLOG
    # удаляем флаг необходимости переподключения
    if [ -f $VPNFLAG ]; then
        rm -f $VPNFLAG
    fi
    # проверяем запущен ли pptp
    pptp_num=`ps axw | grep "pptp:" | wc -l` # считаем число процессов содержащих строку pptp:

    if [ $pptp_num -gt 1 ]; then
        # если больше 1 (вместе с фильтром grep "pptp:"), то убиваем соединения
        killall pppd 2>/dev/null
        # восстанавливаем маршруты
        route del default 2>/dev/null
        route add default dev eth0 2>/dev/null
        echo "done."
    else
        echo "VPN not started."
    fi
}

case "$1" in
'start') # установка соединения с vpn-сервером
    start
    ;;
'stop') # закрытие соединения с vpn-сервером
    stop
    ;;
'restart') # перезапуск соединения с vpn-сервером
    stop
    sleep 3
    start
    ;;
'boot')
    # при загрузке системы нужно очистить флаг соединения
    # на тот случай если перед этим система была завершена некорректно
    if [ -f $VPNFLAG ]; then
        rm -f $VPNFLAG
    fi
    start
    ;;
*) # вывод информации об использовании скрипта
    echo -e "Usage: `basename $0` {start|stop|restart}"
esac

Файл /sbin/vpn.sh:

#!/bin/sh

# пока включён флаг нужно поддерживать включённым соединение с VPN:
while [ -f $VPNFLAG ]; do
    pptp_num=`ps axw | grep "pptp:" | wc -l` # считаем число процессов содержащих строку pptp:
    # должно быть 3 (вместе с фильтром grep "pptp:"):
    if [ $pptp_num -lt 3 ]; then
        # меньше 3-х. значит что-то не так с соединением.
        echo "let's go:" >> $VPNLOG
        # на всякий случай убиваем все оставшиеся процессы:
        killall pptp 2>/dev/null
        sleep 3
        # стартуем pptp
        pppd call cinet >> $VPNLOG
        echo -e "run at `date`" >> $VPNLOG
    fi
    # ждём 5 минут прежде чем проверять соединение снова
    sleep 300
done

Ещё я добавил установку соединения при загрузке. В файле /etc/rc.d/rc.M, сразу после строк запуска /etc/rc.d/rc.inet2 добавил строки:

# Start VPN
if [ -x /etc/rc.d/rc.vpn ]; then
  . /etc/rc.d/rc.vpn boot
fi

Ну и разрыв соединения при перезагрузке ситемы. Для этого в файле /etc/rc.d/rc.6 непосредственно перед убийством процессов pppd (# Try to shutdown pppd) добавляем строки:

# Stop VPN
if [ -x /etc/rc.d/rc.vpn ]; then
  /etc/rc.d/rc.vpn stop
fi

Вот вроде пока это всё, что касается настройки VPN на моей машине.

Использованные материалы при создании всего этого:

8 комментариев »

  1. […] Уж столько раз приходилось это делать и почему-то каждый раз практически занова собирать по кусочкам информацию в интернете и каждый раз получалось что-то новое. Решил, что пора прийти наконец к какому-то знаменателю и упорядочить этот вобщем-то тривиальный процесс, на тот случай если придётся настраивать снова Статья лежит здесь: Клиент VPN […]

    Уведомление от Настройка клиента VPN « Заметки на память — Ноябрь 14, 2006 @ 11:07:14

  2. Thank you for putting up a reference to my blog. I really wish I could read and understand your blogs. 😦

    комментарий от ayaz — Ноябрь 22, 2006 @ 17:02:35

  3. I can read in English, but writing in English is too difficult for me 😦

    комментарий от vadim303 — Ноябрь 22, 2006 @ 20:24:38

  4. mate you are pretty good with howto =) keep typing!

    комментарий от hrobak — Октябрь 3, 2007 @ 17:34:33

  5. добрый день,
    я подклюился с синет недавно и не могу подключиться к интернету из fedora 8 X_64. Сейчас соединяется через PPoE и нет статичный IP gateway и.т.п.
    Я попровал как вы рекомендовали но не могу подключится и даже из форума не кто не отвечает. при запуске команду
    route add -net 10.77.50.213 netmask 255.255.255.255 gw 10.*.*.* выводит ошибку SIOCADDRT: No such process.

    Прошу подскажите как все таки настроит.

    спасибо заранее

    Шамим

    комментарий от Шамим — Январь 7, 2008 @ 12:40:14

  6. Спасибо за информацию 🙂
    😉

    комментарий от don-metall — Февраль 21, 2008 @ 12:30:11

  7. Thank you. I am planning to give it a try in my very favorite arch installation through yaourt and AUR. фільми онлайн

    комментарий от best-films — Декабрь 31, 2008 @ 10:46:17

  8. Спасибо, пост очень помог.
    P.s. Поздравляю автора и всех кто ведёт дискуссию с новым 2009 годом, счастья Вам!

    комментарий от Snikeles — Январь 2, 2009 @ 00:35:16


RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Создайте бесплатный сайт или блог на WordPress.com.

%d такие блоггеры, как: