Skip to main content

Mikrotik + Beeline

Версия (если таковая имеется) документа/статьи – 0.01, цель – запуск маршрутизатора в сети Beeline со схемой Dual Access и полноценной поддержкой IPTV через приставку. Все as is, если что-то поломали – сами себе злобные буратины, настройки все производились с маршрутизатором из коробки (out-of-box), никаких доп. действий, если не описано иное – не производилось.

Захотелось наконец заменить Asus WL-500gP V2 на что-то благообразное, выбор пал на Mikrotik RB951G-2HnD. С целью уменьшения домашнего кабельного хозяйства был также закуплен Mikrotik RB260GS, простой управляемый свитч о пяти портах. Все было коллективно закуплено в магазине WiFi Mag, вполне годная контора с правильными ценами и вменяемыми менеджерами на онлайн-поддержке.

Было установлено последнее обновление. Был установлен модуль IGMP proxy. Были прочитаны все интернеты на тему правильного подключения данной железки, RB951G-2HnD, в сеть Билайн. Особенность подключения – кривизна в двух ключевых вещах: коряво настроенный DHCP, который “забывает” отдать правильный default-gw при подключении (ну – не забывает, а RouterOS просто придерживается стандарта RFC3442 в режиме strict, строго следую букве, но не духу), ну и сделанная через известное место схема подключения Dual Access с поднятием l2tp-соединения, с зацикливанием. В результате могу сказать одно – вполне годная вещь, но советовать такое в виде замены асусов-дилинков-тплинков-прочего никому не буду – больше проблем огрести можно, нежели практического результата – к такой штуке нужно приходить самому 😉

Вдаваться сильно в технические детали смысла нет, для шпаргалки просто опишу черновые скрипты, в которых, ИМХО, и так все понятно. Все – as is и к использованию по вкусу, утверждения ниже по тексту обсуждать не готов, только по существу или в плюсике готов отослать к rfc 😉

Для начала создаем профиль ppp-соединения:

/ppp profile
add change-tcp-mss=yes name=beeline only-one=yes remote-address=\
192.168.123.123 use-compression=no use-encryption=no use-mpls=no \
use-vj-compression=no

В принципе – все прозрачно и очевидно, кроме одной важной вещи – remote-address=192.168.123.123 – наш фейковый, не настоящий адрес, который будет всегда unreachable.

Далее создаем собственно l2tp-соединение:

/interface l2tp-client
add add-default-route=yes allow=chap connect-to=89.179.17.141 \
    default-route-distance=2 disabled=no keepalive-timeout=disabled max-mru=\
    1414 max-mtu=1454 name=beeline password=<password> profile=beeline user=\
    <username>

Здесь есть несколько деталей. Во-первых – connect-to=89.179.17.141 – сейчас можете поставить именно такой, это абсолютно не важно, реальное соединение будет работать по фактическому адресу, который мы получим уже в скрипте чуть ниже. Во-вторых, default-route-distance=2, add-default-route=yes, величины некритичные – так как именно этот “кривой” маршрут никогда не будет использован, в последней итерации я вообще просто их убрал. В-третьих max-mru=1414, max-mtu=1454 – это чистая математика l2tp тоннеля без шифрования поверх IP – то есть если у вас после успешного подключения бОльшая часть сайтов попросту не работает – сами себе злобные буратины, читающие в первую очередь беллитристику в интернетах от недогиков, вычисляторов значений эмпирическим методом 😉

Идем далее. Прописываем занятный-слабочитаемый-скрипт-выгруженный-из-экспорта-конфигруации-который-можно-воткнуть-прямо-в-консоль:

/system script
add name=beeline policy=\
    reboot,read,write,policy,test,password,sniff,sensitive source=":local vpnI\
    face  \"beeline\"\
    \n:local ethIface  \"ether1-gateway\"\
    \n:local vpnserverNS \"tp.internet.beeline.ru\"\
    \n:local vpnserverIP \"0.0.0.0\"\
    \n# check if L2tp already running\
    \n:if ([/interface l2tp-client get \$vpnIface running] = false) do={\
    \n# and has an IP address on WAN - looks like cable is connected\
    \n:if ([/ip dhcp-client get [/ip dhcp-client find interface=\$ethIface] st\
    atus] = \"bound\") do={\
    \n# refresh default route\
    \n/ip route remove [/ip route find comment=common] \
    \n/ip route add gateway=[[/ip route get [/ip route find dst-address=10.0.0\
    .0/8] gateway]] distance=20 comment=common\
    \n/ip dns cache flush\
    \n:set vpnserverIP [:resolve \$vpnserverNS]\
    \n# refresh to new l2tp server (current)\
    \n/ip route remove [/ip route find comment=l2tp-server]\
    \n/ip route add dst-address=\"\$vpnserverIP/32\" gateway=[[/ip route get [\
    /ip route find dst-address=10.0.0.0/8] gateway]] distance=1 comment=l2tp-s\
    erver\
    \n/interface l2tp-client set [/interface l2tp-client find name=\"\$vpnIfac\
    e\"] connect-to=[:resolve \$vpnserverIP] default-route-distance=2\
    \n}\
    \n}"

Исходим из того, что наш WAN-интерфейс называется ether1-gateway, l2tp-соединение beeline, в этой итерации я исхожу из предположения, что серый адрес, который я получу от пчел, находится в подсети 10.0.0.0/8, что не правильно, и будет переделано на нечто более универсальное. Во-первых, оно ищет наш маршрут по умолчанию, который нам забыли отдать, и добавляет его. Во-вторых, оно выбирает произвольный адрес l2tp-сервера, и вписывает две вещи – прямой маршрут до него, изменяет настройки l2tp-соединения. Это, пожалуй, и все.

Предпоследний шаг. Добавляем расписание запуска.

/system scheduler
add name=beeline on-event="/system script run beeline" policy=\
    reboot,read,write start-time=startup

Мне удобно сделать это один раз, следующая итерация будет делать ЭТО по вкусу раз в минуту.

Перезагружаемся (/system reboot). Обнаруживаем, что: соединение – поднято, маршруты – прописаны, но канонический ping www.ru не работает. Добавляем последние штрихи:

/ip route
add distance=2 gateway=beeline

Проверяем пинг. Все работает.

Дальше – настраиваем по вкусу маскарад в цепочке forward (у меня src-nat), не забываем добавить настройки IGMP proxy для телевизора:

/routing igmp-proxy
set quick-leave=yes
/routing igmp-proxy interface
add interface=bridge-local
add alternative-subnets=0.0.0.0/0 interface=ether1-gateway upstream=yes

И важное правило в firewall (видимо, полезно напомнить, что правила работают сверху вниз):

add chain=input comment=\
    "beeline tv igmp" \
    protocol=igmp

Удачной настройки! Happy tuning 🙂