Мой провайдер предоставляет доступ в интернет посредством 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 на моей машине.
Использованные материалы при создании всего этого:
- прежде всего информация по параметрам соединения предоставленная провайдером — без неё никак. Разве что методом тыка, но тыкать можно долго 🙂 ;
- Несколько веток о настройке VPN в разных дистрибутивах, в частности: Настройка VPN клиента в linux, есть предложение сделать универсальный скрипт , [HOWTO] Настройка VPN в Debian GNU/Linux , [HOWTO] Настройка VPN в ALT Linux 2.4 Master, Полная и рабочая инструкция
[…] Уж столько раз приходилось это делать и почему-то каждый раз практически занова собирать по кусочкам информацию в интернете и каждый раз получалось что-то новое. Решил, что пора прийти наконец к какому-то знаменателю и упорядочить этот вобщем-то тривиальный процесс, на тот случай если придётся настраивать снова Статья лежит здесь: Клиент VPN […]
Уведомление от Настройка клиента VPN « Заметки на память — 14 ноября, 2006 @ 11:07:14
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
I can read in English, but writing in English is too difficult for me 😦
комментарий от vadim303 — 22 ноября, 2006 @ 20:24:38
mate you are pretty good with howto =) keep typing!
комментарий от hrobak — 3 октября, 2007 @ 17:34:33
добрый день,
я подклюился с синет недавно и не могу подключиться к интернету из 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
Спасибо за информацию 🙂
😉
комментарий от don-metall — 21 февраля, 2008 @ 12:30:11
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
Спасибо, пост очень помог.
P.s. Поздравляю автора и всех кто ведёт дискуссию с новым 2009 годом, счастья Вам!
комментарий от Snikeles — 2 января, 2009 @ 00:35:16