Как настроить Интернет подключение (соединение) к Beeline в Linux?

Аватар пользователя admin

В один прекрасный момент, я сменил своего Интернет-провайдера и обнаружил, что мой старый маршрутизатор не может работать по L2TP с нужной мне скоростью. В пыльной кладовке завалялся старый компьюетр с Core2Duo процессором, из которого и было решено сделать маршрутизатор, вставив туда ещё одну сетевую карту, в дополнении к сетевой карте на материнской плате. Однако, оказалось, что настроить соединение с Beeline не так-то просто. На просторах интернета мной было найдено немало рецептов, но увы, не один из них не оказался полностью рабочим - во всяком случае у меня. В итоге надёргав там и тут я всё-таки смог настроить подключение по L2TP к Beeline, и хочу поделиться моим способом с вами.

1. Системные требования

  1. Компьютер с процессором Intel Core2Duo и жестким диском на 110Gb. Как известно L2TP довольно сильно нагружает маршрутизаторы из-за шифрования данных, но Core2Duo хватает за глаза.
  2. ОС Linux дистрибутив CentOS 6.5. Дистрибутив, как видите,  свежим не назовёшь, т.е. все современные дистрибутивы должны работать

2. Настройка

2.1. Установка и настройка xl2tpd.

Чтобы установить xl2tpd, необходимо подключить репзозиторий EPEL, а для этого в свою очередь необходимо установить пакет epel-release. Разумеется необходимо поставить и те пакеты, от которых зависит xl2tpd. После подключения и установки (с помощью yum), нам необходимо перез запуском xl2tpd настроить его должным образом. В моём случае файл /etc/xl2tpd/xl2tpd.conf  выглядит так:

[global]
access control = yes
auth file = /etc/ppp/chap-secrets

[lac beeline]
lns = tp.internet.beeline.ru
;lns = tp.corbina.net
redial = yes
redial timeout = 10
require chap = yes
require authentication = no
name = xxxxxxxxx
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
require pap = no
autodial = yes
tunnel rws = 8
tx bps = 100000000
flow bit = no

Где "xxxxxxxxxx" - это логин (обычно номер абонентского договора. Как видно из настроек, нам ещё понадобится внести изменения в два файла /etc/ppp/chap-secrets и /etc/ppp/options.xl2tpd. В файле /etc/ppp/chap-secrets хранится логин и пароль для авторизации в Beeline:

# Secrets for authentication using CHAP
# client	server	secret			IP addresses
xxxxxxxxxx	*	password		*

Где "xxxxxxxxxx" - это логин, а "password" - это пароль, который назначили вам в Beeline и который вы можете изменить в вашем Личном кабинете не сайте Beeline.

Файл /etc/ppp/options.xl2tpd у меня выглядит так:

asyncmap 0000
name xxxxxxxxxx
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

Здесь, как видите, вам также понадобится указать вместо "xxxxxxxxxx" ваш логин. После этого, можно указать операционной системе, что мы хотим запускать xl2tpd при старте системы:

chkconfig --add xl2ptd
chkconfig xl2tpd on

И собственно запустить его:

service xl2ptd start

2.2. Настройка сетевого интерфейса

Итак, у нас две сетевые карты. У меня на eth0 внутренний адрес домашней сети, а карту eth1 я отдал для подключения к Beeline. Всё что вам нужно сделать - это настроить eth1 на получение адреса по DHCP. Т.е. у меня файл /etc/sysconfig/network-scripts/ifcfg-eth1 выглядит так:

DEVICE=eth1
ONBOOT=yes
NM_CONTROLLED=yes
HWADDR=xx:xx:xx:xx:xx:xx
IPV6INIT=no
TYPE=Ethernet
BOOTPROTO=dhcp

Где xx:xx:xx:xx:xx:xx - это мой MAC адрес, который я, по понятным причинам, скрыл.

2.3. Поднятие L2TP соединения

Теперь мы переходим к самому интересному. Для тех кому лень и кому нужен готовый рецепт, даю свой скрипт, который тупо делает то, что нужно. Для остальных объясняю на пальцах весь процесс, на тот случай, если кому интересно или если по какой-то причине у кого-то работать не будет и он будет пытаться понять почему. Итак...

  1. На первом шаге при загрузке системы (или выполнении команды ifup eth1) происходит запрос и получение адреса по DHCP. В системе появляется интерфейс eth1 с каким-либо левым IP адресом из внутренней сети Beeline. Например, у меня это 10.x.x.x (последние цифры скрыты). Также для этого адреса нам выдаётся шлюз (он же default router) из этой-же сети 10.x.x.x. В дальнейшем нам понадобится этот адрес, который мы условно назовём XXX.XXX.XXX.XXX.
  2. На втором этапе запускается xltpd, который поднимает интерфейс ppp0 (L2TP-туннель) ещё с одним IP адресом на самом интерфейсе, который мы назовём условно ZZZ.ZZZ.ZZZ.ZZZ и адресом удалённой стороны (PPP - это соединение точка-точка, поэтому адресов только два и связь установлена только между ними). На этом же этапе появляется ещё один IP-адрес, который имеет для нас важное значение - это адрес L2TP-сервера, который выполняет роль сервера авторизации. Этот адрес можно получить только посмотрев аргументы процесса pppd, что и делается в приведённом мной скрипте командой:
    ps ax|grep pppd|grep l2tp|sed -e 's/.*remotenumber //' -e 's/ .*//'

    Мы условно назовём полученный нами адрес YYY.YYY.YYY.YYY.

  3. На третьем этапе мы прописываем отдельный маршрут до этого L2TP-сервера командой:
    route add -host YYY.YYY.YYY.YYY gw XXX.XXX.XXX.XXX

    Делается это для того, чтобы у нас сохранилась связь с L2TP-сервером, когда мы будем менять шлюз (default router) на другой.

  4. Также мы добавляем два маршрута до DNS-серверов. Адреса этих DNS-серверов взяты мной из данных, присланных DHCP-сервером. Доступ до DNS-серверов также должен сохраняться несмотря ни на какие изменения, которые мы делаем с шлюзом (default router):
    route add -host 213.234.192.8 gw XXX.XXX.XXX.XXX
    route add -host 85.21.192.3 gw XXX.XXX.XXX.XXX
  5. Добавляем ещё один маршрут. Этот маршрут говорит, что мы идём к нашей точке доступа - адресу интерфейса ppp0 (ZZZ.ZZZ.ZZZ.ZZZ) через адрес XXX.XXX.XXX.XXX, т.е. шлюз (default router) полученный по DHCP:
    route add -host ZZZ.ZZZ.ZZZ.ZZZ gw XXX.XXX.XXX.XXX

    Это нужно для того, чтобы опять же мы сохранили связь с удалённой стороной L2TP-туннеля при смене шлюза (default router).

  6. Теперь наконец мы меняем шлюз (default router) на тот IP-адрес, который мы получили при поднятии L2TP-туннеля:
    route del default
    route add default dev ppp0

Вот собственно и всё. Теперь в самой системе шлюзом по умолчанию стал адрес удалённой стороны L2TP-туннеля. При этом, благодаря прописанным ранее маршрутам, мы сохраняем связь с сервером авторизации L2TP и DNS-серверами Beeline через бывший шлюз (default router) интерфейса eth1.

И в заключении привожу мой скрипт поднятия всего этого, который я вызываю в /etc/rc.local, а затем каждую минуту через cron на случай, если что-то случится с туннелем и он рухнет. Тогда скрипт выполнет его автоподнятие. К сожалению, обнаружилось, что это происходит не всегда, например, когда у нас в подъезде пропало электричество, а у меня компьютер на UPS, то для того, чтобы снова всё заработало, требуется перезагрузить компьютер.

Скрипт написан на bash, и довольно подробно ещё раз прокомментирован внутри.

#!/bin/bash

DEFROUTER_DEV=`/sbin/route -n | awk '/^0.0.0.0/ {print $8}'`
if [ "$DEFROUTER_DEV" == "ppp0" ]
then
  # Уже всё поднято
  exit
fi

# Получаем текущий default router
DEFROUTER=`/sbin/route -n | awk '/^0.0.0.0/ {print $2}'`
# Получаем текущий адрес L2TP туннеля
L2TP_POINT=`/sbin/route -n | awk '/ppp0/ {print $1}'`
# Получаем текущий адрес tp.internet.beeline.ru (L2TP-сервера на который мы зацепились)
L2TP_SERVER=`ps ax|grep pppd|grep l2tp|sed -e 's/.*remotenumber //' -e 's/ .*//'`
if [ "$L2TP_SERVER" == "" ]
then
  # Не поднялся pppd, может проблема с сетью
  exit
fi

# Добавляем маршрут до L2TP-сервера. Он понадобится при замене default router'а.
# Если снести default router без этого машрута всё рухнет, ибо станет недоступным
# L2TP-сервер
route add -host $L2TP_SERVER gw $DEFROUTER

# Также добавляем статические маршруты до DNS-серверов
route add -host 213.234.192.8 gw $DEFROUTER
route add -host 85.21.192.3 gw $DEFROUTER

# Теперь ещё говорим, что мы идём к нашей точки L2TP-туннеля через адрес полученный по DHCP
route add -host $L2TP_POINT gw $DEFROUTER

# Заменяем default router на адрес ppp0 интерфейса
route del default
route add default dev ppp0

2.4. И на закуску

Вы можете обнаружить, что часть сайтов у вас открывается, а часть нет. Проблема как всегда в MTU, который может быть разным у разных провайдеров. В этом случае, вам почти наверняка поможет добавление в /etc/sysconfig/iptables правила:

-I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu  

Благодарности

И наконец, выражаю мою благодарность автору вот этого документа, штудирование которого и позволило мне в итоге добиться результата

0
Ваш рейтинг: Нет

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

В интернете таких инструкций

В интернете таких инструкций я нашел всего три штуки. Эта оказалась рабочей. Спасибо автору!

Но есть некоторые проблемы. Система debian 8 без иксов.

1.

/etc/xl2tpd/xl2tpd.conf

вместо

lns = tp.internet.beeline.ru

пришлось прописать IP адреc 10.x.x.x который можно вичислить командой ping при подключении к интернету через обычный роутер или в системе Windows.

То бишь почему-то перед поднятием l2tp компьютер не определяет ip адреса доменных имен.

2.

В дебиане нет каталога /etc/sysconfig. Но судя по всему там сеть по умолчанию и так правильно настроена.

3.

В скрипте есть ошибки

перед

!/bin/bash нет #

при запуске скрипта выдается две ошибки на

line 4 bad exception

line 16 bad exception

 

Аватар пользователя admin

Спасибо за ваш отклик.

Спасибо за ваш отклик. Решётку я поставил - по всей видимости ошибка CUT+PASTE.

Что касается всего остального, то могу лишь заметить - инструкция писалась для CentOS, а не Debian, о чём, собственно, говориться в самом начале в системных требованиях. Тем не менее, вы смогли вполне успешно адаптировать её для Debian, а значит:

  1. Я не зря писал эту инструкцию
  2. Вы - молодец!

if [ "$DEFROUTER_DEV" ==

if [ "$DEFROUTER_DEV" == "ppp0" ]
if [ "$L2TP_SERVER" == "" ]

подозреваю, что переменные  $DEFROUTER_DEV  $L2TP_SERVER не должны заключаться в кавычки. Именно на этих строках вылезают ошибки.

 

Аватар пользователя admin

У меня не вылезают. В кавычки

У меня не вылезают. В кавычки именно должны заключаться. Дело в том, что в этих переменных (теоретически) может оказаться пусто. Тогда неопределённое значение будет сравниваться со строкой, что как раз и приведёт к выдаче ошибки. Поэтому при сравнении со строкой переменные ОБЯЗАТЕЛЬНО должны заключаться в кавычки. Так было в bash всегда. Вот вам тестовый скрипт на bash:

#!/bin/bash

#KAKA="tmp"

if [ "$KAKA" == "" ]
then
  echo "YES"
else
  echo "NO"
fi

Проверьте как он у вас работает. У меня без каких-либо ошибок. Снимите комменатрий со строки KAKA="tmp" и убедитесь, что и в этом случае он работает корректно. Если у вас это не так, то либо у вас в качестве bash в Debian'е работает совсем не bash (возможно стоит какая-либо альтернатива, залинкованная на него), либо это какие-то особенности работы именно в Debian, хотя это было бы крайне странно. Я пишу скрипты на bash уже много лет и они всегда одинаково работают не только в Linux, но и во FreeBSD и даже в Solaris.

Огромнейшее спасибо за супер

Огромнейшее спасибо за супер понятные объяснения и конфиги :) Разобрался буквально за час как все накатить. Единственное L2TP_SERVER=`ps ax|grep pppd|grep l2tp|sed -e 's/.*remotenumber //' -e 's/ .*//'` эта строка не захотела работать пришлось заменить на L2TP_SERVER=`dig +short tp.internet.beeline.ru | tail -1`