Настройка vpn соединения на Ubuntu 12.10
Всем привет.
Двое суток я блуждал по темному лесу под названием "настройка vpn в ubuntu". Выбрался побитый, грязный и уставший. Выбраться удалось... Но думаю, что чисто случайно
Итак задача: настроить соединение с виртуальной частной сетью. Звучит просто, но на деле все оказалось несколько сложнее. В одной из статей я писал о настройке wifi у себя на ноутбуке http://stasyak.ru/?p=377, тогда мне пришлось удалить глючный Network Manager и настраивать соединение с помощью программы Wicd. Однако сейчас я обнаружил у Wicd неприятную особенность - это программа не умеет работать с vpn, а это значит что настраивать vpn придется вручную (тяжелый вздох).
В общем-то начиналось все довольно бодренько.
Вкратце, для настройки нашего 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 очень хорошо написано тут.
Спасибо за внимание!