, последнее обновление:

Beeline, L2TP на сервере и VPN

Этот гайд был написан в 2014 году и может не отражать текущее положение вещей!

В связи с моим переездом в Екатеринбург, у меня сменился провайдер интернетов. Так как тут не было подключено ни одного годного ethernet-провайдера, а был всего-лишь пчелайн с очень неприятным L2TP, пришлось искать способы настроить мой “сервер” (хотя на самом деле это ноутбук за 8 тысяч) для раздачи интернета. Итак-с…

Первое, что стоит запомнить - инструкции в интернете, в большинстве своем, очень неполные. А для дебиана я вообще не смог найти ничего удобоваримого. Практически все инструкции были про PPTP-соединение, которое на относительно новых тарифах недоступно. Единственная более-менее годная инструкция для настройки L2TP-соединения предназначена для CentOS, которую я не держу у себя на сервере. Но она послужила отправной точкой для раскапывания годных параметров.

Подготовка.

Для начала нам необходимо выяснить:

  • Адреса DNS-серверов. У меня они находились в подсети 172.18.49.0/24.
  • Подсеть PPP-шлюза. Именно подсеть, потому что пчелайн любит делать гейты на сразу нескольких IP-адресах, видимо, для балансировки нагрузки. У меня это 172.18.48.0/24.
  • Гейтвей для eth0, то есть для локальной сети. У меня это 10.124.81.1.

ACHTUNG: эти параметры сугубо специфичны для района проживания!

В Linux это можно выяснить с помощью команды route или ip r. Тут был DIR-300 с пчелайновской прошивкой, который выдал мне вот это:

Pasted image 20211208132713.png

Первая строчка как раз и обозначала текущий PPP-шлюз.

Адреса DNS я выяснил «методом DHCP», то есть я получил в Linux настройки интернета, а потом сделал cat /etc/resolv.conf. Это были адреса 172.18.49.10 и 172.18.49.18.

Настройка xl2tpd и pppd.

Приводим /etc/xl2tpd/xl2tpd.conf к такому виду:

[global]
access control = yes
 
[lac beeline]
lns = tp.internet.beeline.ru
redial = yes
redial timeout = 1
require chap = yes
require authentication = no
name = YOUR_USERNAME
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
require pap = no
autodial = yes
tx bps = 100000000
flow bit = no

Вместо YOUR_USERNAME нужно подставить имя пользователя.

Теперь /etc/ppp/options.xl2tpd:

asyncmap 0000
name YOUR_USERNAME
remotename l2tp
ipparam beeline
connect /bin/true
mru 1460
mtu 1460
nodeflate
nobsdcomp
persist
maxfail 0
nopcomp
noaccomp
noauth
novj
novjccomp
noipx
nomp
refuse-eap
refuse-pap
unit 0
replacedefaultroute
defaultroute

Роутинг.

Теперь самое время запилить шелл-скриптики, которые будут добавлять нужные нам роуты. Делаем /etc/ppp/ip-up.d/beeline, который будет настраивать нам роуты при поднятии соединения:

#!/bin/bash

ip r a 172.18.49.0/24 via 10.124.81.1 dev eth0 # DNS
ip r a 172.18.48.0/24 via 10.124.81.1 dev eth0 # PPP-gateway
ip r a 10.0.0.0/8 via 10.124.81.1 dev eth0     # Local network
ip r d $5 dev $1
ip r d default dev eth0
ip r d default dev eth0
ip r a default dev $1                          # Гейтвей по-умолчанию должен быть ppp0

Заменяем подсети и гейтвей на свои.

Тут у меня 2 раза удаляется дефолтный роут через eth0, так как он, зачем-то, опять добавлялся при установке соединения.

Далее сохраним этот файл и дадим ему бит исполняемости (chmod +x).

Теперь восстановление роутов при падении или отключении соединения, файл /etc/ppp/ip-down.d/beeline:

#!/bin/bash

route del $5
route del default
route add default gw 10.124.81.1

Заменяем гейтвей на свой. Не забываем сделать chmod +x /etc/ppp/ip-down.d/beeline.

Проверка.

Запускаем xl2tpd:

# Service xl2tpd start

Если все пройдет хорошо - то у вас последнее в /var/log/daemon.log от xl2tpd будет что-то вроде такого:

Apr 29 13:33:49 eburg xl2tpd[2731]: Connecting to host tp.internet.beeline.ru, port 1701
Apr 29 13:33:49 eburg xl2tpd[2731]: Connection established to 172.18.48.171, 1701.  Local: 31861, Remote: 56245 (ref=0/0).
Apr 29 13:33:49 eburg xl2tpd[2731]: Calling on tunnel 31861
Apr 29 13:33:49 eburg xl2tpd[2731]: Call established with 172.18.48.171, Local: 12300, Remote: 31248, Serial: 12 (ref=0/0)
Apr 29 13:33:49 eburg xl2tpd[2731]: start_pppd: I'm running:
Apr 29 13:33:49 eburg xl2tpd[2731]: "/usr/sbin/pppd"
Apr 29 13:33:49 eburg xl2tpd[2731]: "passive"
Apr 29 13:33:49 eburg xl2tpd[2731]: "nodetach"
Apr 29 13:33:49 eburg xl2tpd[2731]: ":"
Apr 29 13:33:49 eburg xl2tpd[2731]: "name"
Apr 29 13:33:49 eburg xl2tpd[2731]: "YOUR_USERNAME"
Apr 29 13:33:49 eburg xl2tpd[2731]: "debug"
Apr 29 13:33:49 eburg xl2tpd[2731]: "file"
Apr 29 13:33:49 eburg xl2tpd[2731]: "/etc/ppp/options.xl2tpd"
Apr 29 13:33:49 eburg xl2tpd[2731]: "/dev/pts/0"

Если после этого начинают сыпать строчки вида:

Apr 28 10:15:57 eburg xl2tpd[2731]: Can not find tunnel 17161 (refhim=0)
Apr 28 10:15:57 eburg xl2tpd[2731]: network_thread: unable to find call or tunnel to handle packet.  call = 60961, tunnel = 17161 Dumping.

то это значит, что вы напортачили с роутингом. Скорее всего, вы прописали плохие роуты для PPP-подсети.

Пара слов о VPN.

Для подключения по SSH к своим серверам я использую только свой VPN. Спасибо L2TP, VPN over TCP работал… Ну, никак он не работал. Я пробовал играться и с MTU, и с опциями, но так и не смог заставить работать и не рвать соединение через 10 секунд-10 минут. Я не стал углубляться в причины этой фигни, и поэтому просто перевел свой VPN на использование UDP. Соединение держится уже третий день подряд. Из минусов - иногда не грузятся сайты, и приходится много раз жмякать F5, чтобы оно загрузилось, спасибо UDP.

Не стоит мне говорить, что VPN over TCP имеет большой оверхед по производительности. Я это знаю. Просто с TCP пакетики не терялись, какая бы плохая сеть не была, хоть 3G.