четверг, 13 марта 2008 г.

Настройка PPTP VPN в Linux

Для начала разберемся с тем, какой такой павлин-мавлин перед нами.

VPN переводится с английского как виртуальная частная сеть (virtual private network). По сути это прямое соединение между некоторым количеством компьютеров, которого на самом деле физически просто нет. При помощи VPN можно объединить компьютеры, находящиеся в различных уголках планеты, подобно тому, как соединяются компьютеры в пределах офиса, школы, игрового клуба и т.д. И хотя сеть эта - виртуальная, для ее построения все же необходимо физическое соединение между компьютерами. Обычно в роли несущего соединения выступает Интернет или другая локальная сеть, а связь между всеми компьютерами виртуальной сети осуществляется через один общедоступный компьютер: VPN-сервер. Таким образом, отдыхая на канарах, можно подключиться к локальной сети офиса и представить, что вы снова на своей любимой работе. А можно создать сеть между друзьями и залазить к ним в компьютеры как к себе домой. Если вы - параноик, то можно даже создать зашифрованную частную сеть внутри зашифрованной частной сети внутри вашей домашней сети, чтобы никто не подслушал, о чем вы переписываетесь с сестрой, сидящей в соседней комнате. Но я бы не советовал прибегать к таким крайним мерам просто исходя из соображений здравого смысла.

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

Вот тут хотелось бы внести еще одну ясность: VPN бывают разные. И чтобы подключиться к виртуальной сети, нужно, чтобы у вас было установлено программное обеспечение, позволяющее работать именно по протоколу, используемому в вашем типе VPN. На сегодня, как это не печально, подавляющее число пользователей ПК имеют ОС Windows. Эта операционка по умолчанию поддерживает VPN-подключения по протоколу PPTP, разрабатываемому, естественно, компанией Microsoft и дружественными ей. Поэтому провайдеры заставляют подключаться к интернету именно по протоколу PPTP. Им так проще. И всем так проще. Кроме нас с вами :) Но, это тоже не беда. Добрые люди создали открытые (и бесплатные!) программы для подключения к PPTP-серверу из под Linux.

На сегодня способов подключиться к серверу PPTP существует по крайней мере несколько. В Gnome есть плагин pptp для network manager (network-manager-pptp). В KDE имеется замечательная программка Kvpnc, позволяющая создавать подключения к различным VPN-серверам. Есть также программа pptpconfig, предоставляющая богатый возможностями графический интерфейс для настройки pptp-подключения. Однако, все эти графические оболочки создавали для меня дополнительные трудности и в лучшем случае работали, но не так, как надо. Поэтому я решил пойти на крайние меры и настроить все вручную. Оказалось, это намного проще, быстрее и надежнее. Основным руководством к действиям послужила вот эта инструкция.

Итак, займемся делом! Поскольку все будем настраивать вручную, все действия выполняем в консоли.

1. Устанавливаем клиентскую программу.

Для этого выполняем всего одну команду.

$ sudo apt-get install pptp-linux

2. Создаем общий файл настроек.

В этом файле буду располагаться настройки для всех pptp подключений. Это на тот случай, если вы подключитесь к еще одному провайдеру ;-)

$ sudo sh -c 'echo "lock noauth nobsdcomp nodeflate" > /etc/ppp/options.pptp'

3. Записваем имя пользователя и пароль в отдельный файл.

$ sudo sh -c 'echo "$DOMAIN\\$USERNAME PPTP $PASSWORD *" >> /etc/ppp/chap-secrets'

Здесь $DOMAIN - название домена, в котором расположен ваш аккаунт. $USERNAME - логин, $PASSWORD - пароль соответственно.
Если вы ничего не знаете о домене, просто пропустите его вместе с двумя обратными косыми.

Чтобы всякие злобные вредители не прочитали ваши секреты, убедитесь, что
файл паролей не общедоступен.

$ sudo chmod o-rw /etc/ppp/chap-secrets

4. Создаем файл настроек подключения

$ sudoedit /etc/ppp/peers/$TUNNEL

$TUNNEL - название подключения. Придумайте его сами. Вместо vim можно написать название любого любимого вами текстового редактора.

В файл пишем следующие строки:

pty "pptp $SERVER --nolaunchpppd"
name $DOMAIN\\$USERNAME
remotename PPTP
require-mppe-128
file /etc/ppp/options.pptp
ipparam $TUNNEL

Где $SERVER - это адрес VPN-сервера. Сохраняем файл и приступаем к тестированию.

5. Пробуем!

$ sudo pon $TUNNEL debug dump logfd 2 nodetach

Эта команда запустит подключение в отладочном режиме. nodetach означает, что вся отладочная информация будет выводиться прямо в консоль. Если в конце вы увидите следующие строки

Script /etc/ppp/ip-up started (pid 9658)
Script /etc/ppp/ip-up finished (pid 9658), status = 0x0

это означает, что подключение успешно выполнено. В противном случае попробуйте еще пару раз. Возможно просто произошел какой-то сбой при подключении.

Для запуска подключения в штатном режиме достаточно выполнить:

$ sudo pon $TUNNEL

Чтобы отключиться:

$ sudo poff $TUNNEL

6. Последние штрихи

Чтобы соединение было стабильным и автоперезапускаемым в случае обрыва, в файл настроек подключения нужно добавить следующие строки:

persist
holdoff 10
maxfail 0

И чтобы соединение запускалось автоматически при загрузке операционной системы, добавим его в файл сетевых интерфейсов /etc/network/interfaces

auto ppp0
iface ppp0 inet ppp
provider $TUNNEL

В идеале все должно сразу же заработать. Однако, жизнь - не такая простая штука, как нам того хотелось бы. Лично у меня возникли проблемы с моим персональным фаирволом, и мне пришлось еще немного попотеть, прежде чем все получилось. А у вас заработало?

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

  1. Сложно-то как. Неужто в дебиане нету ничего типа pptp-command?

    А вообще, для чайников идеален kvpnc.

    ОтветитьУдалить
  2. Я бы его не назвал бы идеальным, хотя он и довольно приятен. К примеру, я там нигде не нашел возможность повесить автоподключение при загрузке. :-( Если б эта возможность там была - я бы на нем и остановился бы. А так все равно пришлось во всем разбираться :-)
    Впрочем, имея под рукой четкую инструкцию, это не так уж сложно сделать. Имхо. А если возникает проблема с подключением - то и kvpnc ничем не поможет. Тут уж нужно читать логи, думать и эксперементировать.

    ОтветитьУдалить
  3. Огромное Вам спасибо! Очень долго искал как сделать автоматическое соединение VPN, даже в автозапуск добавлять пытался ;)

    Таперь всё работает.

    ОтветитьУдалить
  4. Очень рад, что Вам помогла моя статья :-)

    ОтветитьУдалить
  5. Спасибо Вам за такой лаконичный и красивый материал. У меня все сразу заработало. Оценка 5+

    ОтветитьУдалить
  6. На втором шаге не разрешает создать файл настроек:
    bash: /etc/ppp/options.pptp: Permissin denied
    Что делать ? :)

    ОтветитьУдалить
  7. Прошу прощения, я допустил ошибку в этой команде:

    $ sudo echo "lock noauth nobsdcomp nodeflate" > /etc/ppp/options.pptp

    Вообще эта команда выводит (echo) строку "lock noauth nobsdcomp nodeflate" в файл "/etc/ppp/options.pptp". Команда запускается через sudo, чтобы действие выполнялось от суперпользователя (root), потому как обычный пользователь обычно не имеет прав писать в указанный файл и каталог. Стрелка (>) указывает, в какой файл перенаправляется вывод предыдущей команды (печать строки). Ошибка состояла в том, что влияние команды sudo не распространяется на перенаправление вывода, и попытка записи производилась от имени текущего пользователя, в чем Вам, естественно, было отказано.

    Решить проблему можно воспользовавшись любым удобным дял Вас способом редактирования файла от имени суперпользователя. Если исправить мой вариант, то нужно писать так:

    sudo sh -c 'echo "lock noauth nobsdcomp nodeflate" > /etc/ppp/options.pptp'

    ОтветитьУдалить
  8. noipdefault у кого не заработает добавляйте, особливо во всяких dd-wrt

    ОтветитьУдалить
  9. в конце выдает couldn't open pty slave /dev/pts/0 no sych file or directory
    couldn't get channel number I/O error
    и status=0X7f еще ругается sh: pptp: command not found

    ОтветитьУдалить
  10. Хм..
    В каком конце и кто выдает?
    А что выдает следующее?
    $ sudo apt-get install pptp-linux
    $ whereis pptp
    $ echo $PATH

    ОтветитьУдалить
  11. выдает команда pon ... ... debug ...
    whereis pptp
    pptp:
    echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

    install я пропустил потому как pptp уже был установлен кем-то до меня

    ОтветитьУдалить
  12. Если pptp установлен, то почему whereis и sh его не находят?
    Попробуйте пожалуйста следующее, чтобы все-таки уточнить картину:
    $ stat /usr/sbin/pptp
    Если не найдет, то
    $ dpkg -l | grep pptp
    $ sudo updatedb ; whereis pptp
    Если и так не найдет, то все же рекомендую установить pptp из репозитория.
    $ sudo aptitude install pptp-linux

    ОтветитьУдалить
  13. Для сравнения - вот что у меня:

    $ stat /usr/sbin/pptp
    File: `/usr/sbin/pptp'
    Size: 56500 Blocks: 120 IO Block: 4096 обычный файл
    Device: 301h/769d Inode: 504352 Links: 1
    Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
    Access: 2008-12-02 00:07:58.000000000 +0200
    Modify: 2008-06-01 22:19:53.000000000 +0300
    Change: 2008-08-09 17:07:27.000000000 +0300

    $ dpkg -l | grep pptp
    ii pptp-linux 1.7.2-1 Point-to-Point Tunneling Protocol (PPTP) Client

    $ whereis pptp
    pptp: /usr/sbin/pptp /usr/share/man/man8/pptp.8.gz

    ОтветитьУдалить
  14. Добрый день.
    Да статья действительно хорошая.
    И вроде бы все коннектится интерфейс поднимается.
    Но вот я столкнулся с такой проблемой, нет доступа во внешнюю сеть. Пинги не проходят (с KVPNC все нормально), фильтрации трафика у меня нет.
    Есть варианты что это может быть?
    Спасибо.

    ОтветитьУдалить
  15. Спасибо.

    Если я правильно понял, у Вас пинги не идут в сеть, к которой подключен vpn-сервер. Для того, чтобы это было возможно, у вас должен быть настроен фильтр, направляющий пакеты в ту сеть через vpn-соединение. Вероятно, KVPNC делает это автоматически. В данном же случае придется делать это вручную. Я использую для таких целей Shorewall, потому что для меня он намного проще и понятнее, чем iptables. Как использовать последний, я так и не разобрался. Хотя для Вас, возможно, будет удобнее решить эту задачу именно через iptables. Думаю, это вопрос одной недлинной команды.

    ОтветитьУдалить
  16. Привет.

    Добавил строки
    persist
    holdoff 10
    maxfail 0
    в options.pptp
    У меня ВПН соединение начало постоянно рваться и восстанавливаться. Если убрать, то ВПН не рвется. В чем может быть проблема?

    ОтветитьУдалить
  17. Все, разобрался :)

    ПС: Спасибо за статью :)

    ОтветитьУдалить
  18. http://debian.co.nr/wiki/doku.php?id=vpn

    Тут гораздо более быстрый и простой способ.
    А для автозагрузки просто добавить cable-start в любой стартовый скрипт :)

    ОтветитьУдалить
  19. Всем привет!
    Пытаюсть настроить клиента на ред хате, но попал в засаду - у меня нет команд pon и poff. Что можно сделать?

    ОтветитьУдалить
  20. может это?
    $ sudo apt-get install pptp-linux

    ОтветитьУдалить
  21. Итак... сам намучался с VPN для дебиана... наткнулся на скрипт... доработал его... выкладываю -
    ________________________________________________
    #!/bin/sh

    # Скрипт настройки VPN соединения в Debian
    # настроен для провайдера Linevo.net
    # 10.10.1.23 - VPN сервер провайдера
    # 255.255.0.0 - Маска локальной в сети
    #
    # Если настройки вашей сети отличаются, от указанных выше, измените их в скрипте ...
    #
    clear
    echo "Welcome to VPN Installer system for Debian"
    echo "WARNING! You must run this script on the root login"
    echo "WARNING! YOU MUST INSTALL PPTP-LINUX (apt-get install pptp-linux), BEFORE RUNNING THIS SCRIPT!"
    echo "Installer create VPN connection to Internet provider http://linevo.net "
    echo "Are you ready(Y/N)?"
    read oke
    apt-get install pptp-linux resolvconf
    printf "Enter your internet login: \n"
    read inet_login
    printf "Enter your internet password: \n"
    read inet_pass
    printf "Enter your LocalNet Gateway IP: \n"
    read user_gate
    echo "Ok.. All data collected."
    echo "Creating config files:"
    echo "creating /etc/ppp/chap-secrets..."
    echo "${inet_login} PPTP ${inet_pass}" > /etc/ppp/chap-secrets
    echo "creating /etc/ppp/options.pptp..."
    printf "nodeflate\nnobsdcomp\nnoauth\n" > /etc/ppp/options.pptp
    echo "creating /etc/ppp/peers/vpn..."
    printf "pty \"pptp 10.10.1.23 --nolaunchpppd\"\nconnect /bin/true\nname ${inet_login}\nremotename PPTP\nfile /etc/ppp/options.pptp\nipparam vpn" > /etc/ppp/peers/vpn
    echo "creating /etc/ppp/ip-up.d/vpn..."
    echo "creating /etc/ppp/ip-down.d/vpn..."
    printf "#!/bin/sh\n\
    \n\
    route add -net 10.10.1.0 netmask 255.255.1.0 gw ${user_gate}\n\
    route add -net 10.10.0.0 netmask 255.255.0.0 gw ${user_gate}\n\
    route add -net 192.168.0.0 netmask 255.255.0.0 gw ${user_gate}\n\
    route del default\n\
    route add default dev ppp0" > /etc/ppp/ip-up.d/vpn
    chmod 755 /etc/ppp/ip-up.d/vpn
    printf "#!/bin/sh\n\
    \n\
    route del -net 10.10.1.0 netmask 255.255.255.0 gw ${user_gate}\n\
    route del -net 10.10.0.0 netmask 255.255.0.0 gw ${user_gate}\n\
    route del -net 192.168.0.0 netmask 255.255.0.0 gw ${user_gate}\n\
    route add default gw ${user_gate} dev eth0" > /etc/ppp/ip-down.d/vpn
    chmod 755 /etc/ppp/ip-down.d/vpn
    echo "Configuration completed..."
    echo "Use command *pon vpn* to connect VPN"
    echo "For disconect VPN use command *poff -a*"
    echo
    echo "Thank you for using this script..."
    pon vpn
    _____________________________________
    это для нашей сети... каждый под себя сможет поправить роуты и адрес тунеля.... больше ничего не надо....
    подымается командой pon vpn, опускается poff -a при желании можно добавить в конец /etc/network/interfaces

    auto ppp0
    iface ppp0 inet ppp
    provider vpn. скрипт и интерфейс запускаются от рута или от sudo.

    ОтветитьУдалить
  22. а как сделать чтобы это соединение было не поумолчанию
    и роуты при загрузке добавлялись для этого соединения
    где прописать
    rote add -net dev < мое ppp соединение> ?

    ОтветитьУдалить
  23. Проще настроить через vpnpptp: http://code.google.com/p/vpnpptp/
    Пакет vpnpptp работает и в Debian, и в Ubuntu и много где еще.

    ОтветитьУдалить
  24. Сделал всё, как написано. В отладочном режиме матюкается. #pon provider проходит, но отображаются только отдельные сранички из локалки.
    Дебиан 6.0.6 установлен на виртуальной машине. Вобщем сеть видна полностью, только когда установлено соединение из Виндовса :(

    ОтветитьУдалить
  25. sudo apt-get install pptp-linux
    Чтобы выполнить эту команду, нужно подключение к Интернету, которого у нас нету. Нет интернета-нет pptp-linux. Нет pptp-linux - нет Интернета... Яйцо - курица

    ОтветитьУдалить
    Ответы
    1. VPN используется не только для подключения к Интернет.
      Ну а если уж Вы попали в такую "неразрешимую" ситуацию - тогда требуется либо диск со всеми необходимыми пакетами, либо временное подключение к сети. Можно воспользоваться мобильным телефоном либо сходить за Интернетом к соседу или другу. В конце концов, вы можете скачать нужные пакеты где угодно, где есть подключение, и принести их домой. Ну, а как Вы хотели? OS тоже надо скачивать из интернета, а если она у вас не установлена, то вы ее никак и не скачаете - тоже замкнутый круг :)

      Удалить
  26. Спасибо, способ работает и в 2017 :)

    ОтветитьУдалить