01.08.2008

Подключение к Корбине через l2tp

Некоторое время назад поднимал на Debian Etch подключение через Корбину. Столкнулся с тем, что вроде информации на тему l2tp много, но так чтобы всё было debian way и одним куском - нигде. Решил написать свой мануал.

Установка xl2tpd из backports.org

В /etc/apt/sources.list добавляем:

deb http://www.backports.org/debian etch-backports main contrib non-free

Добавляем pgp-ключи этого репозитария в apt-keyring:

$ gpg --keyserver hkp://subkeys.pgp.net --recv-keys 16BA136C
$ gpg --export 16BA136C | sudo apt-key add -

Создаём pin для xl2tpd (подробнее об apt pinning). Для этого в файл /etc/apt/preferences добавляем:

Package: xl2tpd
Pin: release a=etch-backports
Pin-Priority: 999

Файла /etc/apt/preferences может и не быть, в таком случае его нужно создать.

Обновляем списки пакетов, устанавливаем xl2tpd:

$ sudo aptitude update
$ sudo aptitude install xl2tpd

Ещё его сразу нужно убрать из автозапуска:

$ sudo update-rc.d -f x2ltpd remove

Инструкция по работе с репозитарием backports.org здесь.

Настройка xl2tpd

Содержимое файла /etc/xl2tpd/xl2tpd.conf:

[global]

access control = yes

[lac corbina]

name = username
require chap = yes
require pap = no
lns = 85.21.230.1
redial = yes
redial timeout = 5
require authentication = no
ppp debug = no
pppoptfile = /etc/ppp/options.xl2tpd
autodial = yes

Значение параметра lns - это адрес нашего l2tp сервера. Его приходится добавлять в виде ip, иначе после обрыва соединение не восстанавливается. Вот здесь чуть подробнее об этой проблеме.

Для Ростова-на-Дону этот адрес 85.21.230.1.

Значение параметра name - наш корбиновский логин. Пароль прописывается, как водится, в /etc/ppp/chap-secrets, об этом далее.

Настройка pppd

Содержимое /etc/ppp/options.xl2tpd:

unit 0
name username
remotename corbina
ipparam corbina
connect /bin/true
mru 1460
mtu 1460
nodeflate
nobsdcomp
noauth
persist
maxfail 0
nopcomp
noaccomp
defaultroute
replacedefaultroute

Здесь name - тоже корбиновский юзернейм. Есть ощущение, что либо здесь, либо в xl2tpd.conf он лишний, но убрать и проверить руки не дошли.

В /etc/ppp/chap-secrets добавляем строку:

"username"      *       "password"

Вместо username и password ставим свои логин/пароль.

Далее основное отличие моего метода от того, что мне удалось нарыть в сети. Люди предлагают init.d-скрипт xl2tpd. Мне эта идея не нравится, тем более, что для тех операций, которые этими изменениями производятся существует вполне определённое место.

После подъёма ppp-интерфейса нужно обновить маршруты на vpn-сервер и dns-сервера таким образом, чтобы трафик на них проходил не через ppp-соединение, а как прежде напрямую, через локальную сеть Корбины.

Файл /etc/ppp/ip-up.local:

#!/bin/sh
# PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM

CORBINA_GW=xx.xx.xx.xx

if [ $PPP_IPPARAM == "corbina" ]; then
    route add -host 85.21.230.1 gw $CORBINA_GW
    route add -host 213.234.192.8 gw $CORBINA_GW
    route add -host 85.21.192.3 gw $CORBINA_GW
fi

Файл /etc/ppp/ip-down.local:

#!/bin/sh
# PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM

CORBINA_GW=xx.xx.xx.xx

if [ $PPP_IPPARAM == "corbina" ]; then
    route del -host 85.21.230.1 gw $CORBINA_GW
    route del -host 213.234.192.8 gw $CORBINA_GW
    route del -host 85.21.192.3 gw $CORBINA_GW
fi

Здесь переменной CORBINA_GW нужно присвоить значение равное ip-адресу шлюза по умолчанию, который присваивается ethernet-интерфейсу dhcp-сервером Корбины. Выяснить можно вот так:

$ route|grep default

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

Первый маршрут - на vpn-сервер. Тут адрес должен быть такой же, как в xl2tp.conf. Остальные два по идее от города не зависят.

Настройка интерфейса

Кусок /etc/network/interfaces, отвечающий за интерфейс, смотрящий в сеть Корбины должен выглядеть так:

auto eth2
iface eth2 inet dhcp
    up invoke-rc.d xl2tpd start
    pre-down invoke-rc.d xl2tpd stop || true
    pre-down killall pppd || true

Маршруты на внутренние сервисы

В текущем состоянии всё должно работать. Недостаток в том, что трафик на внутренние сервисы Корбины будет идти через ppp-соединение, и как следствие, скорость будет порезана. Чтобы получать доступ к внутренним ресурсам на полной скорости, нужно добавить кое-какие маршруты. В итоге кусок /etc/network/interfaces, отвечающий за интерфейс, смотрящий в сеть Корбины должен приобрести вот такой вид:

auto eth2
iface eth2 inet dhcp
    up route add -host 89.179.135.67 gw xx.xx.xx.xx dev eth2
    up route add -host 195.14.50.26 gw xx.xx.xx.xx dev eth2
    up route add -net 85.21.72.80 netmask 255.255.255.240 gw xx.xx.xx.xx dev eth2
    up route add -net 85.21.34.0 netmask 255.255.255.240 gw xx.xx.xx.xx dev eth2
    up route add -net 10.0.0.0 netmask 255.0.0.0 gw xx.xx.xx.xx dev eth2
    up invoke-rc.d xl2tpd start
    pre-down route del -host 89.179.135.67 gw xx.xx.xx.xx dev eth2
    pre-down route del -host 195.14.50.26 gw xx.xx.xx.xx dev eth2
    pre-down route del -net 85.21.72.80 netmask 255.255.255.240 gw xx.xx.xx.xx dev eth2
    pre-down route del -net 85.21.34.0 netmask 255.255.255.240 gw xx.xx.xx.xx dev eth2
    pre-down route del -net 10.0.0.0 netmask 255.0.0.0 gw xx.xx.xx.xx dev eth2
    pre-down invoke-rc.d xl2tpd stop || true
    pre-down killall pppd || true

Адрес шлюза определяется точно так же, как и ранее, в пункте про настройку ppp.

Заключение

Всё это довольно коряво сделано, мне не нравится. Но работает. Опенсорсная реализация l2tp очень далека от совершенства. Вообще Корбина могла бы и позаботиться чтобы конфигурирование маршрутов происходило автоматически на стороне vpn-сервера. Или могла бы предоставить какой-нибудь более родной для GNU способ подключения.

Ссылки

  • корбиновский мануал по подключению через l2tp для Ubuntu 8.04;
  • вот здесь рассказано как сделать конфигурирование маршрутов менее зависимым от локации.

Комментарии

01.08.08 15:47 SolarWind комментирует:

Собственно, корбиновский мануал, на который дана ссылка, как раз и сделан на основе моего мануала, на который тоже дана ссылка. :-)

01.08.08 17:06 Джус комментирует:

У меня пачка локальных маршрутов через DHCP отдаётся стабильно (правда, не уверен насчёт полноты, кроме ftp.corbina.ru ничем не пользуюсь).

01.08.08 17:59 uptimebox комментирует:

Да, корбиновский мануал списан с вашенго. Но вторая ссылка дана не на сам мануал, а на комментарий к нему.

01.08.08 18:00 uptimebox комментирует:

В моём случае по DHCP приходит единственный default route.