Ключевые слова:pptp, vpn, linux, ppp, (найти похожие документы)
From: vadim303 <http://vadim303.wordpress.com>
Date: Sun, 29 Feb 2008 17:02:14 +0000 (UTC)
Subject: Настройка PPTP клиента в Linux
Оригинал: http://vadim303.wordpress.com/linux/linux-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$LINEnStarting 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,
Полная и рабочая инструкция