L7. Маршрутизация с помощью RegExp

RIP, OSFP, BGP, MPLS/VPLS
obesbash
Сообщения: 6
Зарегистрирован: 23 апр 2018, 23:00

L7. Маршрутизация с помощью RegExp

Сообщение obesbash »

Предыстория.
У меня территориально забанен частично google, в частности play market.
Задание.
Сделать чтобы в локальной сети был постоянно доступен play market.
Решение.
Так как заворачивать весь трафик через VPN - Глупо, то было решено подключить на микротике VPN (я использовал AltVPN, не рекламы ради), по протоколу L2VPN и заворачивать только гугловский трафик на VPN. Сделать это было решено с помощью Layer7 Protocols.

1)Добавляем регулярное выражение:

Код: Выделить всё

/ip firewall layer7-protocol
add name=google regexp="^.+(google).*$"
Потом в mangle отлавливаем пакеты в которых содержится упоминание google

Код: Выделить всё

/ip firewall mangle
add action=mark-routing chain=prerouting layer7-protocol=google new-routing-mark=google_mark passthrough=yes


И заворачиваем все наши помеченные пакеты на шлюз VPN(l2tp-out1)

Код: Выделить всё

/ip route
add distance=1 gateway=l2tp-out1 routing-mark=google_mark
Проблема.
При такой настройке трафик с упоминанием google "отлавливается", но не хочет ходить через VPN, не знаю почему. Если, к примеру, этот же трафик(layer7-protocol=google) помечать не как mark-routing, а как mark-packet и через firewall дропать или редиректить, то всё работает. А вот стоит этот трафик(layer7-protocol=google) пометить как mark-routing и заставить идти его через шлюз VPN - ничего не получается.

Что я делаю не так, помогите пожалуйста.

P.S. В NAT есть маскарад для all ppp, в Filter нет никаких запрещающих правил.
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: L7. Маршрутизация с помощью RegExp

Сообщение Chupaka »

Так сделать, увы, невозможно: данные (которые ловит регулярное выражение) начинают идти по TCP-соединению после трёхстороннего рукопожатия, когда соединение уже установлено. В этот момент уже поздно "заворачивать" его на нужный канал (VPN). Выбирать, отправлять ли канал в VPN, нужно на первом же пакете, а он содержит (для TCP) только IP-адреса и порты источника и назначения.

Можно попробовать реализовать смешанную технику: по Regexp отлавливать IP-адреса и добавлять их в Address-List, а его уже маршрутизировать в VPN. Или добавить в Address-List нужные домены (все, включая поддомены). В любом случае, придётся как-то поддерживать актуальный список нужных подсетей.

Можно начать со списка подсетей Гугла: https://bgp.he.net/AS15169#_prefixes

Насколько я понимаю, ресурсы Google Play и Youtube лежат на одних и тех же серверах (Google CDN), так что разделить толком не получится, только если через сторонний прокси с поддержкой маршрутизации через SNI.
obesbash
Сообщения: 6
Зарегистрирован: 23 апр 2018, 23:00

Re: L7. Маршрутизация с помощью RegExp

Сообщение obesbash »

Спасибо за аргументированный и развёрнутый ответ, очень приятно видеть такое человеческое отношение =)

После многочасовых попыток и экспериментов, пришел к выводу, что выражение regexp="^.+(google).*$" не корректно работает. Оно добавляет в address-list много "левых" адресов, в том числе адрес собственного ip шлюза полученного от провайдера.

Сделал следуя вашему совету и старому дедовскому методу - добавил всё вручную в address list. Частично воспользовался новой функцией RouterOS - добавление динамических ip по доменному имени. Обратил внимание, с помощью WireShark, что все обращения к GooglePlay идут на пул адресов google, которые заканчиваются на .95.

Потратил много времени, зато теперь всё работает. Еще раз спасибо
Аватара пользователя
Chupaka
Сообщения: 4086
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: L7. Маршрутизация с помощью RegExp

Сообщение Chupaka »

Рад слышать :)

По поводу странной работы L7 - под него, если не указывать протокол TCP, может попадать и куча остального трафика, например, DNS-ответы про домены Гугла. Эти ответы идут роутеру - потому его адрес и добавляется, так что всё объяснимо :)