Настройка vpn соединения на Ubuntu 12.10

Написано 18 Июнь, 2013 в категории Linux,Ubuntu/Debian/Mint

Всем привет.

Двое суток я блуждал по темному лесу под названием "настройка vpn в ubuntu". Выбрался побитый, грязный и уставший. Выбраться удалось... Но думаю, что чисто случайно

Итак задача: настроить соединение с виртуальной частной сетью. Звучит просто, но на деле все оказалось несколько сложнее. В одной из статей я писал о настройке wifi у себя на ноутбуке http://stasyak.ru/?p=377, тогда мне пришлось удалить глючный Network Manager и настраивать соединение с помощью программы Wicd. Однако сейчас я обнаружил у Wicd неприятную особенность - это программа не умеет работать с vpn, а это значит что настраивать vpn придется вручную (тяжелый вздох).

В общем-то начиналось все довольно бодренько. В интернетах встречаются толковые статьи на эту тему, например:
http://leolik.blogspot.ru/2008/05/vpn-ubuntu.html или http://rat.admin.lv/?p=63

Вкратце, для настройки нашего pptp-соединения делаем следующее:
1. Устанавливаем пакет для работы по pptp-протоколу:

sudo apt-get install pptp-linux

2. У меня соединение использовало chap-аутентификацию, поэтому сохраняем свои логин/пароль вот так:

$ sudo nano /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
 
myvpnlogin PPTP myvpnpassword *

PPTP - это имя удаленной машины, задается произвольно, но должно совпадать со значением параметра remotename в настройках pptp-клиента, о которых мы поговорим ниже.

3. Теперь настроим параметры подключения pptp-клиента:

[moon:~] % sudo cat /etc/ppp/peers/work
maxfail 0
lcp-echo-interval 60
lcp-echo-failure 4
 
pty "pptp 85.xxx.xxx.xxx --nolaunchpppd"
name myvpnlogin
remotename PPTP
require-mppe-128
 
file /etc/ppp/options.pptp
ipparam work

а теперь построчная расшифровка этой белиберды:
maxfail 0 - всегда переподключаться при разрывах соединения;
lcp-echo-interval 60 - интервал опроса vpn-сервера (ставил значение из приведенных выше статей);
lcp-echo-failure 4 - после 4 неудачных запросов считаем, что vpn-сервер нас отключил;
pty "pptp 85.xxx.xxx.xxx --nolaunchpppd" - создаем интерфейс (обычно это ppp0), где 85.xxx.xxx.xxx адрес vpn-сервера;
name myvpnlogin - указываем логин для подключения;
remotename PPTP - имя vpn-сервера должно совпадать с тем что мы указали в /etc/ppp/chap-secrets;
require-mppe-128 - используемое в vpn шифрование (у вас может отличаться);
file /etc/ppp/options.pptp - внешний файл настроек (как правило эти настройки общие с другими pptp соединениями);
ipparam work - имя нашего соединения.

3. Файл общих настроек лучше не редактировать, однако имеет смысл убедиться, что в нем присутствуют параметры:

usepeerdns
require-mschap-v2
lock
noauth
nobsdcomp
nodeflate

4. Запускаем vpn так: "sudo pppd call work" или так: "sudo pon work". Проверяем, сделав пинг, на один из внутренних vpn-адресов. Если пинги идут - все ок. Если не идут, то возможно не создался интерфейс ppp0 (проверить командой ifconfig) или соединение запрещено в файрволе или еще какая-нибудь хрень.
У меня на этом этапе проблем не возникло и vpn послушно заработал... Зато также послушно отключился интернет.

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

5. Статическая маршрутизация ядра.
Вот так выглядит таблица маршрутизации ДО включения vpn-соединения

[moon:~] % route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1

единственная строка - это дефолтный маршрут через шлюз 192.168.1.1 на интерфейс eth1
дефолтный маршрут означает что все мои запросы будут идти через него,
шлюз 192.168.1.1 может показаться необычным, но не удивляйтесь, просто wifi у меня раздает роутер, а это его внутрисетевой ip, интерфейс eth1 - это собственно моя wifi-карточка.

Создаем интерфейс для pptp-соединения:

[moon:~] % sudo pppd call work

Мы создали новый интерфейс ppp0. А таблица маршрутизации становится такой:

[moon:~] % route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1
1.1.1.12         0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
85.xxx.xxx.xxx   192.168.1.1     255.255.255.255 UGH   0      0        0 eth1

Интернет по-прежнему работает. Теперь необходимо задать vpn-подсеть c которой мы хотим работать, чтобы заработало и vpn-соединение.

[moon:~] % sudo route add -net 1.1.0.0 netmask 255.255.254.0 dev ppp0;
[moon:~] % route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1
1.1.0.0         0.0.0.0         255.255.254.0   U     0      0        0 ppp0
1.1.1.12         0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
85.xxx.xxx.xxx   192.168.1.1     255.255.255.255 UGH   0      0        0 eth1

И все заработало.

Автоподключение vpn при загрузке ноутбука делать не стал, дабы не огрести еще одну кучу проблем. Сделал простенький скрипт запуска, чем сейчас и пользуюсь.
Чисто теоретически может потребоваться отключить vpn, но это необходимо крайне редко, поэтому предпочитаю пользоваться обыкновенным kill -9 для pppd.

В процессе работы с программой route не раз получал невразумительные ошибки, вроде "SIOCADDRT: No such process". Что это может означать описано тут
Тут неплохо описаны флаги и поля из таблицы маршрутизации.
Неплохие примеры по работе с route находятся тут.
О самом протоколе pptp очень хорошо написано тут.

Спасибо за внимание!