12 февраля 2011 г.

Настройка VPN в Linux с использованием PPTP.

Всем известно, что некоторые провайдеры раздают интернет через VPN. Именно VPN, а не просто PPTP мотивируется, наверное, наличием шифрования, при такой же легкой настройке. Но настройка легка только в Windows.

Собственно, первая проблема с которой я когда-то столкнулся после установки линукса - подключение по VPN. Гугл выдавал множество вариантов, но принцип был в основном одним и тем же, причем, успешно настроить этот богомерзкий VPN мне так и не удавалось.

Решение все-таки было найдено. Как оказалось со стороны конфигов ppp все было правильно, не правильными были роуты (route, маршруты). Дело в том, что ppp требует ставить себе default route (однако, на debian'е у ppp есть конфиг replacedefaultroute. Как раз 70% того что выдает гугл, содержит эту опцию, следовательно конфиг работает только под Debian-Ubuntu-... ). Решение было очевидно - прописывать все необходимые роуты при старте системы.



Теперь расскажу всю настройку VPN в целом. Нам потребуются пакеты:
  • ppp
  • pptp
А так же необходима поддержка ppp в ядре. Если вы не собирали ядро сами, то скорее всего ppp в ядре у вас есть.
В файл /etc/ppp/options.pptp пишем (под рутом):

noauth    # не авторизовываться пока не будет получен gateway
refuse-eap           # Не использовать проверки
refuse-pap           ## Возможно, что на стороне провайдера стоит
refuse-chap         ## обязательным проверка по некоторым из этих
refuse-mschap    ## алгоритмов
nobsdcomp    # в этой и следующей строке отключаем компрессию
nodeflate
persist    # восстановление связи при обрыве
maxfail 10    # десять попыток восстановления
defaultroute   # подменяем дефолтный роут (о проблемах с этим я писал выше)
#replacedefaultroute    # раскоментить если у вас Debian-like дистрибутив (например, Ubuntu)

Далее нам потребуется еще один файл, в этом файле описываются все особенности касательно провайдера. Создаем /etc/ppp/peers/название_соединения (тоже под рутом):

pty "pptp Адрес_VPN_провайдера --nolaunchpppd"    # собственно адрес VPN-сервера
connect /bin/true    
name Ваш_Юзернейм    
password "Ваш_Пароль"
remotename название_соединения   # имя данного файла
file /etc/ppp/options.pptp   # указываем путь до конфига который создали выше

Далее, если у нас не Debian-like дистрибутив (у нас закоменчена опция replacedefaultroute) следует прописать роуты локальной сети (об этом я говорил выше), обычно их можно найти на сайте провайдера.

Напомню что список текущих роутов получается командой route -n. Прописываются и удаляются роуты через команду route. Более подробно написано в man route (который я очень рекомендую почитать). Так же следует помнить, что прописав роуты они скинутся после перезагрузки системы. Так что, лучше создать скрипт который будет добавлять роуты и добавить его в автозагрузку (у разных дистрибутивов автозагрузка в разных местах)

Собственно, настройка закончена. VPN включается по команде pon название_соединения, а выключается по команде poff название_соединения.



Приведу альтернативный пример настройки всего этого под Gentoo, соответственно с использованием конфигов Gentoo. Файл /etc/conf.d/net:

config_eth0=( "айпи_локальной_сети netmask маска_локальной_сети" )
gateways_eth0="адрес_шлюза"     # gateway
routes_eth0=( 
        # прописываем роуты локальной сети. Пример ниже:
        "-net айпи_адрес_роута netmask маска_сети_роута gw адрес_шлюза"
 )
dns_servers_eth0="днс_сервер"
config_ppp0=( "ppp" )
link_ppp0="pty 'адрес_VPN_провайдера --nolaunchpppd --nobuffer'"
username_ppp0='юзернейм'
password_ppp0='пароль'
pppd_ppp0=(
        noauth    # узнаете эти строки? :3
        refuse-eap
        refuse-pap
        refuse-chap
        refuse-mschap
        debug
        nobsdcomp
        nodeflate
        mtu 1474
        mru 1474
        persist
        logfile /var/log/pppd.log   # можно так же добавить файл для логов pppd
        maxfail 10
        defaultroute
)
depend_ppp0() {
        need net.eth0
}
Скрипт будет запускаться при старте системы. Или это можно делать руками, как с любым скриптом в Gentoo:   /etc/init.d/net.ppp0 start (или restart, stop).
Еще я забыл сказать, что нужно создать файл /etc/init.d/net.ppp0. Это делается простым копированием net.lo:    cp /etc/init.d/net.lo /etc/init.d/net.ppp0 (и все из под рута).



Собственно все.

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