Как настроить Интернет подключение (соединение) к Beeline в Linux?
В один прекрасный момент, я сменил своего Интернет-провайдера и обнаружил, что мой старый маршрутизатор не может работать по L2TP с нужной мне скоростью. В пыльной кладовке завалялся старый компьюетр с Core2Duo процессором, из которого и было решено сделать маршрутизатор, вставив туда ещё одну сетевую карту, в дополнении к сетевой карте на материнской плате. Однако, оказалось, что настроить соединение с Beeline не так-то просто. На просторах интернета мной было найдено немало рецептов, но увы, не один из них не оказался полностью рабочим - во всяком случае у меня. В итоге надёргав там и тут я всё-таки смог настроить подключение по L2TP к Beeline, и хочу поделиться моим способом с вами.
1. Системные требования
- Компьютер с процессором Intel Core2Duo и жестким диском на 110Gb. Как известно L2TP довольно сильно нагружает маршрутизаторы из-за шифрования данных, но Core2Duo хватает за глаза.
- ОС 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 соединения
Теперь мы переходим к самому интересному. Для тех кому лень и кому нужен готовый рецепт, даю свой скрипт, который тупо делает то, что нужно. Для остальных объясняю на пальцах весь процесс, на тот случай, если кому интересно или если по какой-то причине у кого-то работать не будет и он будет пытаться понять почему. Итак...
- На первом шаге при загрузке системы (или выполнении команды ifup eth1) происходит запрос и получение адреса по DHCP. В системе появляется интерфейс eth1 с каким-либо левым IP адресом из внутренней сети Beeline. Например, у меня это 10.x.x.x (последние цифры скрыты). Также для этого адреса нам выдаётся шлюз (он же default router) из этой-же сети 10.x.x.x. В дальнейшем нам понадобится этот адрес, который мы условно назовём XXX.XXX.XXX.XXX.
- На втором этапе запускается 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.
- На третьем этапе мы прописываем отдельный маршрут до этого L2TP-сервера командой:
route add -host YYY.YYY.YYY.YYY gw XXX.XXX.XXX.XXX
Делается это для того, чтобы у нас сохранилась связь с L2TP-сервером, когда мы будем менять шлюз (default router) на другой.
- Также мы добавляем два маршрута до 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
- Добавляем ещё один маршрут. Этот маршрут говорит, что мы идём к нашей точке доступа - адресу интерфейса 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).
- Теперь наконец мы меняем шлюз (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
Благодарности
И наконец, выражаю мою благодарность автору
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 6600 просмотров
В интернете таких инструкций
В интернете таких инструкций я нашел всего три штуки. Эта оказалась рабочей. Спасибо автору!
Но есть некоторые проблемы. Система debian 8 без иксов.
1.
/etc/xl2tpd/xl2tpd.conf
вместо
пришлось прописать IP адреc 10.x.x.x который можно вичислить командой ping при подключении к интернету через обычный роутер или в системе Windows.
То бишь почему-то перед поднятием l2tp компьютер не определяет ip адреса доменных имен.
2.
В дебиане нет каталога /etc/sysconfig. Но судя по всему там сеть по умолчанию и так правильно настроена.
3.
В скрипте есть ошибки
перед
при запуске скрипта выдается две ошибки на
line 4 bad exception
line 16 bad exception
Спасибо за ваш отклик.
Спасибо за ваш отклик. Решётку я поставил - по всей видимости ошибка CUT+PASTE.
Что касается всего остального, то могу лишь заметить - инструкция писалась для CentOS, а не Debian, о чём, собственно, говориться в самом начале в системных требованиях. Тем не менее, вы смогли вполне успешно адаптировать её для Debian, а значит:
if [ "$DEFROUTER_DEV" ==
подозреваю, что переменные $DEFROUTER_DEV $L2TP_SERVER не должны заключаться в кавычки. Именно на этих строках вылезают ошибки.
У меня не вылезают. В кавычки
У меня не вылезают. В кавычки именно должны заключаться. Дело в том, что в этих переменных (теоретически) может оказаться пусто. Тогда неопределённое значение будет сравниваться со строкой, что как раз и приведёт к выдаче ошибки. Поэтому при сравнении со строкой переменные ОБЯЗАТЕЛЬНО должны заключаться в кавычки. Так было в bash всегда. Вот вам тестовый скрипт на bash:
Проверьте как он у вас работает. У меня без каких-либо ошибок. Снимите комменатрий со строки KAKA="tmp" и убедитесь, что и в этом случае он работает корректно. Если у вас это не так, то либо у вас в качестве bash в Debian'е работает совсем не bash (возможно стоит какая-либо альтернатива, залинкованная на него), либо это какие-то особенности работы именно в Debian, хотя это было бы крайне странно. Я пишу скрипты на bash уже много лет и они всегда одинаково работают не только в Linux, но и во FreeBSD и даже в Solaris.
Огромнейшее спасибо за супер