2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

RIP, OSFP, BGP, MPLS/VPLS
Dark-Fox
Сообщения: 5
Зарегистрирован: 25 авг 2021, 19:47

2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Dark-Fox »

Привет.

Возможно ли полностью реализовать хотелку на микротике?

Используется два провайдера по 100Мбит/с. Каждый выдает адрес по DHCP с привязкой по MAC. Подключение по витой паре Ethernet. IP адреса белые от каждого провайдера.

1. Для каждого провайдера нужно поднять туннель OpenVPN-клиент. Через туннель проходит только трафик для конкретных адресов назначения (список адресов с сетями размерностью /32.../22).

2. Для каждого провайдера нужно поднять 2-3 6in4 туннеля от брокеров, для поддержки IPv6.

3. Необходима балансировка трафика между провайдерами (WAN IPv4), OpenVPN-туннелями, и 6in4 туннелями.

4. Нужно следить пингом (или чем-то еще) за тем подняты ли туннели и интерфейсы. Если не доступны — то перенаправлять весь трафик на оставшиеся интерфейсы. При возобновлении пинга ранее недоступного интерфейса, снова вернуться к политике балансировки трафика.

5. DNS-запросы должны отправляться на определенный пул адресов вышестоящих публичных DNS-серверов, не DNSSEC.

6. Раздача адресов в LAN через DHCP, DHCPv6/SLAAC.

7. Реализовать возможность фильтрации рекламы и прочего мусора на уровне DNS-сервера, без использования публичных или иных сторонних защищенных DNS. Должен быть список блокируемых хостов с перенаправлением на 127.0.0.1 или 0.0.0.0

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

Железка RB4011iGS+RM прошивка 6.49beta54

Из перечисленного удалось сделать балансировку трафика между WAN интерфейсами (WAN1 и WAN2). При поднятии интерфейса дополнительно в таблицу маршрутизации прописываются маршруты с меткой для каждого WAN при помощи скрипта на каждом DHCP-клиенте. Далее с помощью таблицы Mangle маркируется подключение и при помощи PCC балансируется.

5 пункт удалось реализовать достаточно просто. Добавил в список кучу необходимых адресов. Но хотелось бы более подробно разобраться как это грамотно реализовывается.

7 пункт реализован при помощи скрипта, который заполняет список разрешения DNS блокируемыми хостами c перенаправлениями на 127.0.0.1. Пока этот список не заполнится, подситема DNS просто зависает. Даже VPN-клиенты не могут подключиться, это продолжается около пяти минут. Одно из четырех ядер загружено на 100%, почему не загружаются оставшиеся ядра пока что мне не понятно. Как это исправить не знаю. Вообще не нашел информации по распараллеливанию чего-либо скриптами, и распределением нагрузки на ядра процессора.

С горем пополам удалось заставить работать два VPN клиента. С кучей плясок и костылей. Маршруты мне прилетают по Push, как от этого избавиться я не знаю. Дальше при помощи /Routings filters я отсеиваю эти маршруты и маркирую. После чего по аналогии с WAN маркирую соединение в таблице Mangle и при помощи PCC что-то там балансируется. При этом используется тот же PCC что и для WAN только с разными пропорциями. Потому что входной интерфейс LAN.

Мне не удалось заставить подключаться каждый VPN клиент к конкретному WAN.
Оба VPN подключаются к одному WAN при этом если отключить этот WAN то клиенты VPN переключаются на второй. Как я не игрался с роутами и таблицами Mangle так ничего и не получилось. Либо не работает вообще ничего, либо работает что-то одно. И при маркировании маршрутов при помощи /Routings filters, полученных по Push route, маркируются все одной меткой от двух VPN клиентов. Короче ерунда полная. При использовании VRF у меня вообще ничего ни разу не заработало. Хотя маршруты так же добавлял и в main таблицу.

По IPv6 пока что ничего не удалось сделать. Как балансировать трафик IPv6 я вообще не представляю. Читал что при помощи протоколов маршрутизации, но с этим я никогда не сталкивался.
В качестве оффтопа. Эту же задачу я полностью реализовывал на OpenWRT при помощи трех маршрутизаторов. Там для балансировки IPv6 пришлось установить NATv6.
Как двигаться дальше? Я немного запутался.
Dark-Fox
Сообщения: 5
Зарегистрирован: 25 авг 2021, 19:47

Re: 2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Dark-Fox »

OMG, неужели снова придется ставить 7 версию Router OS.
Она практически голая по дополнительным пакетам, в ней не заработал у меня VPN-клиент. Но зато появилась поддержка IPv6 NAT

What's new in 7.1rc1 (2021-Aug-19 13:06):

!) added support for IPv6 NAT (CLI only);
!) added support for L2TPv3 (CLI only);
*) added "expired" user status with suggestion to change password (WinBox v3.29 required);
*) added bridge HW offload support for vlan-filtering on RTL8367 switch chip (RB4011, RB1100AHx4);
*) added password strength requirement settings;
*) added skin support for WinBox (WinBox v3.29 required);
*) fixed support for RIP (Routing Information Protocol);
*) improved general stability and performance;
*) other minor fixes and improvements;
Аватара пользователя
Chupaka
Сообщения: 3260
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: 2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Chupaka »

Приветствую.

Разделить VPN-клиентов между WAN, видимо, не получится легко, если они подключаются к одному и тому же IP: в Mangle нечем их различить.

В L2TP Client, например, есть опция Src. Address для таких случаев, а вот у OVPN Client подобного не вижу.

По поводу 100% загрузки ЦПУ - Tools -> Profile может подсказать, чем именно загружено, но в целом проблема явно в самой службе DNS - распараллелить её без помощи разработчиков не получится. Но вроде ещё в прошлом году что-то такое оптимизировали:

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

What's new in 6.47.8 (2020-Nov-25 10:10):

*) dns - improved stability with large table of static records;
Dark-Fox
Сообщения: 5
Зарегистрирован: 25 авг 2021, 19:47

Re: 2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Dark-Fox »

Загрузка на 100% одного ядра происходит когда таблица DNS заполняется статическими записями командой

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

/import file-name=AdBlock;
Записи в импортируемом файле файле:

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

/ip dns static
add address=127.0.0.1 name=xxxxx.com
add address=127.0.0.1 name=yyyyy.com
....
add address=127.0.0.1 name=zzzzz.com
Это упрощенный кусок из скрипта.

Еще заметил баг. Сразу после запуска не отрабатывает команда :delay. И получается ерунда, потому что у меня DNS не может запуститься из-за импорта /import file-name=AdBlock; При этом когда все уже загружено, то задержка :delay отрабатывает.

Все это приводит к тому, что у меня сразу после включения маршрутизатора сеть не может нормально функционировать около 7-10 минут, а это много.

Chupaka А по IPv6 не подскажите, возможно реализовать поднятие несколько 6in4, и балансировать нагрузку между ними?

И еще вопрос через VRF возможно реализовать привязку OVPN клиента к своему WAN? В первом приближении с VRF у меня вообще ничего не получилось, просто ничего не работало.
Аватара пользователя
Chupaka
Сообщения: 3260
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: 2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Chupaka »

Dark-Fox писал(а): 26 авг 2021, 16:28 Загрузка на 100% одного ядра происходит когда таблица DNS заполняется статическими записями
Это было понятно и изначально. А вот Profiler вы так и не посмотрели, поэтому новой информации не появилось :)

А вы проверяете, что у вас таких записей уже нет? Или просто при старте заново всё добавляете?..
Dark-Fox писал(а): 26 авг 2021, 16:28 Еще заметил баг. Сразу после запуска не отрабатывает команда :delay. И получается ерунда, потому что у меня DNS не может запуститься из-за импорта /import file-name=AdBlock; При этом когда все уже загружено, то задержка :delay отрабатывает.
Не отрабатывает как именно? Скрипт прекращает выполнение? Скрипт продолжается сразу же, без задержки?
Dark-Fox писал(а): 26 авг 2021, 16:28 Все это приводит к тому, что у меня сразу после включения маршрутизатора сеть не может нормально функционировать около 7-10 минут, а это много.
Много. Гляньте всё же Profiler. А в скрипт импортируемый не пробовали :delay вставлять каждые N строк, чтобы попробовать разгрузить DNS?
Dark-Fox писал(а): 26 авг 2021, 16:28 А по IPv6 не подскажите, возможно реализовать поднятие несколько 6in4, и балансировать нагрузку между ними?
В шестой версии - нет, там нет ни IPv6 NAT, ни Policy Routing (нельзя маркировать роутинг для IPv6).
Dark-Fox писал(а): 26 авг 2021, 16:28 И еще вопрос через VRF возможно реализовать привязку OVPN клиента к своему WAN? В первом приближении с VRF у меня вообще ничего не получилось, просто ничего не работало.
Я не вижу способа указать роутеру, что OVPN-клиент должен подниматься в конкретном VRF...
Dark-Fox
Сообщения: 5
Зарегистрирован: 25 авг 2021, 19:47

Re: 2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Dark-Fox »

Грузит одно ядро DNS.
При этом экспортируется всего около ~75000 адресов. Частоту процессора поднял до 2ГГц, температура не превышает 41°С, как такового прироста производительности при заполнении списка статических записей я не заметил. Зато при работе в интернете стало немного быстрей все подгружаться или это эффект плацебо))
Chupaka писал(а): 27 авг 2021, 12:35 А вы проверяете, что у вас таких записей уже нет? Или просто при старте заново всё добавляете?..
Да, вот скрипт:

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

:local hostScriptUrl "https://xxxxx";  (там очень длинный адрес на текстовый файл который собирается из нескольких списков) 
:local scriptName "stop_ad.script";
do {
:log warning "ADBlock Start Update";
/system logg disable 0;
:delay 30s;
/tool fetch check-certificate=no mode=https url=$hostScriptUrl dst-path=($scriptName);
/ip dns cache flush;
:delay 2s;
{:foreach s in=[/ip dns static find comment="ADBlock"] do={/ip dns static remove $s}}
#/ip dns static remove [/ip dns static find comment=ADBlock];
:delay 10s;
/import file-name=$scriptName;
:delay 60s;
/file remove $scriptName;
:delay 2s;
/ip dns cache flush;
/system logg enable 0;
}
:log warning "ADBlock Run Complete";
quit;
В скрипте еще поменял "/ip dns static remove [/ip dns static find comment=ADBlock];" (было до этого) на "{:foreach s in=[/ip dns static find comment="ADBlock"] do={/ip dns static remove $s}}". Мне кажется что так железно не должно получиться асинхронного выполнения. Буду тестировать дальше.

Запускается вот так:

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

[[email protected]] > /sys sch print detai
Flags: X - disabled 
 0   name="AutoADBlock1" start-time=startup interval=0s on-event=:delay 150s;\r\n/system script run AutoADBlock owner="admin" policy=read,write,policy,test 
     run-count=1 

 1   name="AutoADBlock2" start-time=startup interval=2h30m on-event=/system script run AutoADBlock owner="admin" policy=read,write,policy,test run-count=5 
     next-run=aug/28 02:34:29 
 
После добавления в on-event AutoADBlock1 задержки :delay 150s вроде отпустило немного.
Chupaka писал(а): 27 авг 2021, 12:35 Не отрабатывает как именно? Скрипт прекращает выполнение? Скрипт продолжается сразу же, без задержки?
Да, скрипт начинает свое выполнение сразу после загрузки маршрутизатора. При этом в самом скрипте специально добавил команды в разные места :delay 150s (в приведенном выше скрипте я все это лишнее убрал, так как толку не было). Получается, что некоторые команды выполняются асинхронно, не дожидаясь результата выполнения. Хотя :delay 150s я ставил в самое начало скрипта, до объявления переменных, и после, результат один — задержка не отрабатывается сразу после загрузки.
Но когда маршрутизатор загрузился, то потом все работает штатно и предсказуемо. Проверял много раз вручную запуская приведенный выше скрипт.
Chupaka писал(а): 27 авг 2021, 12:35 Я не вижу способа указать роутеру, что OVPN-клиент должен подниматься в конкретном VRF...
Вот же ж незадача. Похоже на то. Потому что практически все способы что были в интернете я перепробовал, и ничего толком не получилось.
Ладно, буду лезть в дебри глубже, потому что не верится что такая железка не умеет элементарного, с точки зрения сетевых дел. Или это вовсе не элементарное действие, привязать туннель к своему железному Ethernet-порту..

Остается только поставить самую последнюю седьмую версию RouterOS и посмотреть что там сделано, заработает там наконец VPN клиент, или нет. и заодно попробовать NAT IPv6.
Аватара пользователя
Chupaka
Сообщения: 3260
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: 2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Chupaka »

Dark-Fox писал(а): 28 авг 2021, 01:32 Грузит одно ядро DNS.
Я бы в техноподдержку написал, [email protected]
Dark-Fox писал(а): 28 авг 2021, 01:32 Или это вовсе не элементарное действие, привязать туннель к своему железному Ethernet-порту..
Ну, вообще, строго говоря, не элементарное :)
Dark-Fox писал(а): 28 авг 2021, 01:32 Остается только поставить самую последнюю седьмую версию RouterOS и посмотреть что там сделано, заработает там наконец VPN клиент, или нет.
Таких кардинальных изменений там не припоминаю...
Dark-Fox
Сообщения: 5
Зарегистрирован: 25 авг 2021, 19:47

Re: 2 WAN с балансировкой, + Multi OVPN Client + Multi 6in4

Сообщение Dark-Fox »

Потестировал NAT IPv6 в последней версии 7.1rc1 вроде работает. Удалось раздать получаемый от провайдера адрес ::/64.
Правда OVPN клиент так и не заработал. Отписался на официальном форуме.
Откатился на версию 6.49beta54, в ней VPN работает.

Подскажите, как можно отловить посылаемые маршруты OVPN клиенту через PUSH? Я хочу эти маршруты промаркировать, что бы хоть немного решить проблему балансировки трафика через несколько VPN клиентов на микротике.

Сейчас делаю так:

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

/routing filter
add chain=dynamic-in prefix-length=7-32 set-routing-mark=vpn_route
Этим я отлавливаю присылаемы мне маршруты. Только проблема в том, что таким образом маркируются все маршруты одной меткой, вне зависимости от количества интерфейсов OVPN. Другие маршруты, от других интерфейсов, при этом не затрагиваются.

Дальше этот трафик обрабатывается так:

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

/ip firewall nat
add action=masquerade chain=srcnat out-interface=ether1
add action=masquerade chain=srcnat out-interface=ether10
add action=masquerade chain=srcnat out-interface=ovpn-out1
add action=masquerade chain=srcnat out-interface=ovpn-out2
/ip firewall mangle
add action=mark-connection chain=prerouting dst-address-list=vpn_dst in-interface=bridge1 \
    new-connection-mark=vpn_con passthrough=yes
add action=mark-connection chain=prerouting dst-address-list=!vpn_dst in-interface=bridge1 \
    new-connection-mark=wan1_con passthrough=yes per-connection-classifier=\
    both-addresses-and-ports:2/0
add action=mark-connection chain=prerouting dst-address-list=!vpn_dst in-interface=bridge1 \
    new-connection-mark=wan2_con passthrough=yes per-connection-classifier=\
    both-addresses-and-ports:2/1
add action=mark-routing chain=prerouting connection-mark=vpn_con new-routing-mark=vpn_route \
    passthrough=yes
add action=mark-routing chain=prerouting connection-mark=wan1_con in-interface=!ether1 \
    new-routing-mark=wan1_route passthrough=yes
add action=mark-routing chain=prerouting connection-mark=wan2_con in-interface=!ether10 \
    new-routing-mark=wan2_route passthrough=yes
Так наиболее все быстро и отлично работает. Есть балансировка по двум провайдерам, и VPN работает, но не балансируется.
dst-address-list=vpn_dst там содержатся те же адреса (просто список IP с длиной от /7 до /32) что мне присылаются через PUSH.
Так как у меня DHCP от двух провайдеров, то для каждого провайдера в DHCP добавлен такой скрипт:

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

do {
:local rmark "wan1_route"
:local count [/ip route print count-only where comment="WAN1"]
:log warning $"bound";
:if ($bound = 1) do={
:if ($count = 0) do={
:log warning $"gateway-address";
/ip route add gateway=$"gateway-address" comment="WAN1" routing-mark=$rmark
} else={
:if ($count = 1) do={
:local test [/ip route find where comment="WAN1"]
:if ([/ip route get $test gateway]!= $"gateway-address") do={
/ip route set $test gateway=$"gateway-address"
}
} else={
:error "Multiple routes found"
}
}
} else={
/ip route remove [find comment="WAN1"]
}
};
Для второго провайдера нужно просто цифры поменять в wan1_route и WAN1.
Это позволяет добавить две таблицы маршрутизации для каждого провайдера автоматически и с правильным шлюзом.

В общем на текущий момент задача такая. Как все же заставить бегать служебный трафик каждого VPN клиента через своего провайдера, и как маркировать маршруты получаемые по PUSH? Что-то у меня с этим напряг, не могу понять как это сделать, и возможно ли это сделать в принципе.

Хотя основной вопрос, как заставить все же подключаться каждый VPN через определенный физический eth.