Сейчас просматривают тему: 0 -> --, и гостей: 1

MikroTik. Правильный dst nat при использовании 2-х и более провайдеров

Ссылка на пост #1 Добавлено: 21 января 2021 11:46
Автор темы
Макс
Администраторы
Азъ: библиАтекарь
Возраст: 41 Водолей
Пол:
С нами: 16 лет 5 месяцев
Сообщений: 10607
Поблагодарил: 7252
Благодарностей: 27419
Предупреждений: 0

Награды:

       

Приступая к выполнению задачи я рассчитывал на легкую прогулку в тени дубового парка, созерцая природу и предаваясь размышлениям… Однако позже стало понятно, что это будет тернистый и сложный поход сквозь горные реки с подводными камнями, обледеневшими скалами и глубокими пещерами.
Через медитации, борьбу со стихиями и собственной тупостью преодоление себя я, все таки, достиг желанной нирваны.

В этой статье я не только предоставлю готовый набор правил, но и постараюсь максимально доступно объяснить почему и как именно они работают.

MikroTik. Правильный dst nat при использовании 2-х и более провайдеров



Конкретно в моем случае, нужно было настроить роутер так, чтобы web-сервер в локальной сети за ним был доступен по IP любого из 3-х провайдеров.

Часть 1.
Для начала пробежимся по всем настройкам, дабы самые нетерпеливые могли скопипастить не читая.

Версия RouterOS:
Код:[Выделить]
# oct/11/2016 22:02:32 by RouterOS 6.37.1 # software id = X62B-STGZ


Интерфейсы:
Код:[Выделить]
/interface list add name=WAN /interface list member add interface=ISP1 list=WAN add interface=ISP2 list=WAN add interface=ISP3 list=WAN


Не помню начиная с какой версии RouterOS появилась эта фишка. Она позволяет группировать интерфейсы, что весьма удобно (например, в правилах /ip firewall). У меня создана группа из 3-х WAN-интерфейсов.
AcidVenom подсказал, что в 6.36

IP-адреса (адреса, по понятным причинам, «левые»):

Код:[Выделить]
/ip address add address=192.168.0.1/24 comment=defconf interface=bridge network=192.168.0.0 add address=95.11.29.240/24 interface=ISP1 network=95.11.29.0 add address=5.35.59.162/27 interface=ISP2 network=5.35.59.160 add address=5.98.112.30/30 interface=ISP3 network=5.98.112.28


Роутинг:
Код:[Выделить]
/ip route add distance=1 gateway=95.11.29.254 routing-mark=ISP1-route add distance=1 gateway=5.35.59.161 routing-mark=ISP2-route add distance=1 gateway=5.98.112.29 routing-mark=ISP3-route add check-gateway=ping distance=1 gateway=8.8.8.8 add check-gateway=ping distance=2 gateway=8.8.4.4 add check-gateway=ping distance=3 gateway=1.1.36.3 add distance=1 dst-address=8.8.4.4/32 gateway=5.35.59.161 scope=10 add distance=1 dst-address=8.8.8.8/32 gateway=95.11.29.254 scope=10 add distance=1 dst-address=1.1.36.3/32 gateway=5.98.112.29 scope=10


Для организации Failover’а я настроил рекурсивную маршрутизацию, подробнее расскажу в 2-ой части.

Firewall (для данной публикации я сознательно привожу правила, разрешающие все.
Не делайте так!):
Код:[Выделить]
/ip firewall filter add action=accept chain=forward add action=accept chain=input add action=accept chain=output


dst и src nat:

Код:[Выделить]
/ip firewall nat add action=masquerade chain=srcnat out-interface-list=WAN add action=dst-nat chain=dstnat comment="HTTP" dst-port=80 \ in-interface-list=WAN protocol=tcp to-addresses=192.168.0.83 to-ports=80 add action=dst-nat chain=dstnat comment="HTTPs" dst-port=443 \ in-interface-list=WAN protocol=tcp to-addresses=192.168.0.83 to-ports=443



mangle:
Код:[Выделить]
/ip firewall mangle add action=mark-connection chain=input in-interface=ISP1 \ new-connection-mark=ISP1-conn passthrough=yes add action=mark-routing chain=output connection-mark=ISP1-conn \ new-routing-mark=ISP1-route passthrough=no add action=mark-connection chain=input in-interface=ISP2 new-connection-mark=\ ISP2-conn passthrough=yes add action=mark-routing chain=output connection-mark=ISP2-conn \ new-routing-mark=ISP2-route passthrough=no add action=mark-connection chain=input in-interface=ISP3 \ new-connection-mark=ISP3-conn passthrough=yes add action=mark-routing chain=output connection-mark=ISP3-conn \ new-routing-mark=ISP3-route passthrough=no add action=mark-connection chain=forward in-interface=ISP1 \ new-connection-mark=ISP1-conn-f passthrough=no add action=mark-routing chain=prerouting connection-mark=ISP1-conn-f \ in-interface=bridge new-routing-mark=ISP1-route add action=mark-connection chain=forward in-interface=ISP2 \ new-connection-mark=ISP2-conn-f passthrough=no add action=mark-routing chain=prerouting connection-mark=ISP2-conn-f \ in-interface=bridge new-routing-mark=ISP2-route add action=mark-connection chain=forward in-interface=ISP3 \ new-connection-mark=ISP3-conn-f passthrough=no add action=mark-routing chain=prerouting connection-mark=ISP3-conn-f \ in-interface=bridge new-routing-mark=ISP3-route


Часть 2.
Рассмотрим все подробнее.

Роутинг:
Код:[Выделить]
/ip route add distance=1 gateway=95.11.29.254 routing-mark=ISP1-route add distance=1 gateway=5.35.59.161 routing-mark=ISP2-route add distance=1 gateway=5.98.112.29 routing-mark=ISP3-route add check-gateway=ping distance=1 gateway=8.8.8.8 add check-gateway=ping distance=2 gateway=8.8.4.4 add check-gateway=ping distance=3 gateway=1.1.36.3 add distance=1 dst-address=8.8.4.4/32 gateway=5.35.59.161 scope=10 add distance=1 dst-address=8.8.8.8/32 gateway=95.11.29.254 scope=10 add distance=1 dst-address=1.1.36.3/32 gateway=5.98.112.29 scope=10


/ip route

В первых трех строчках мы указываем default gateway каждого из 3-х наших провайдеров.
Маршруты имеют одинаковый вес (distance), но работают в разных таблицах маршрутизации.

Другими словами, эти маршруты работают для пакетов промаркированных соответствующим тегом (routing-mark). Теги пакетам мы будем навешивать в /ip firewall mangle (о чем я подобно расскажу ниже).

Следующие 3 строки — указание маршрутов по умолчанию в основной таблице маршрутизации.

Здесь стоит обратить внимание на:

Параметр distance. Для каждого маршрута разный и, соответственно, «вес» маршрутов тоже разный.
ISP1 — основной, за ним ISP2 и ISP3 замыкает, т.е. при отказе провайдера ISP1 работать будем через ISP2, если и ISP2 почил в бозе, то за дело возьмется ISP3.

Несколько непонятным может быть значение параметра gateway. Как это гугловые DNS и какой-то левый IP-адрес вдруг стали маршрутами по-умолчанию? Магия заключается в параметре scope из последних трех строк, а так же в самом механизме Nexthop lookup.
На самом деле трафик отправится активному провайдеру, а дальше тот отправит его в Интернет через свои аплинки.

О параметре check-gateway=ping. Суть в том, что в самой простой схеме построения Failover, указывая check-gateway=ping в маршрутах по умолчанию, мы проверяем связь только до маршрутизатора провайдера. Если же за маршрутизатором провайдера будет недоступен Интернет, то мы этого не поймем. А с помощью финта с параметром scope мы проверяем связь уже не с провайдером, а смотрим за него, в Интернет.
Под спойлером мой подробный перевод/адаптация вики Mikrotik на эту тему.

Mikrotik. Nexthop_lookup
Пока самые охочие до знаний читают под спойлером, расскажу немого короче и проще.
Когда мы указываем scope=10 в последних трех строках, мы даем понять Mikrotik’у, что:

8.8.8.8
8.8.4.4
1.1.36.3
ему доступны не напрямую, а рекурсивно через данные статические маршруты. По одному IP на брата-провайдера.

/ip firewall mangle

правила здесь
Для пояснения правил этого раздела пригласим несколько помощников.

MANGLE — данная таблица предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов (поля TTL и TOS) (викиучебник).
Таблица mangle содержит следующие цепочки:

PREROUTING — позволяет модифицировать пакет до принятия решения о маршрутизации.
INPUT — позволяет модифицировать пакет, предназначенный самому хосту.
FORWARD — цепочка, позволяющая модифицировать транзитные пакеты.
OUTPUT — позволяет модифицировать пакеты, исходящие от самого хоста.
POSTROUTING — дает возможность модифицировать все исходящие пакеты, как сгенерированные самим хостом, так и транзитные.
CONNECTION TRACKING — специальная подсистема, отслеживающая состояния соединений и позволяющая использовать эту информацию при принятии решений о судьбе отдельных пакетов.
Packet flow Mikrotik’а

MikroTik. Правильный dst nat при использовании 2-х и более провайдеров


Я разбил правила на группы, для облегчения их понимания. В первой группе 6 правил, которые отвечают за трафик в/из самого роутера, и во второй группе 6, для транзитного трафика.

Начем с первых двух.
В первом мы сообщаем роутеру, что все входящие chain=input соединения на интерфейс ISP1 нужно маркировать action=mark-connection new-connection-mark=ISP1-conn, а так же указаваем passthrough=yes, чтобы пакет, после прохождения этого правила, не покинул таблицу и продолжил следование по правилам.

Во втором говорим Mikrotik’у, чтобы он отловил исходящие соединения chain=output помеченные как ISP1-conn и присвоил им метку роутинга(для помещения в соответствующую таблицу маршрутизации, вы ведь помните первые три маршрута?), а также сообщаем passthrough=no , как бы говоря — нечего делать здесь пакету после этого правила, т.е. пакет покинет таблицу.

Все описанное выше справедливо и для ISP2 и для ISP3. Таким образом мы добились того, что роутер ответит именно с того интерфейса, на который к нему прийдет запрос.

Переходим к завершающим шести правилам.
Уже понятно, они также разбиты на подгруппы по 2, для каждого из наших ISP.
Первое из них поручает роутеру следить за цепочкой FORWARD и если происходит соединение через интерфейс ISP1, то оно маркируется action=mark-connection новым тегом new-connection-mark=ISP1-conn-f (обратите внимание! отличным от тега трафика самого маршрутизатора, в данном случае мы маркируем транзитный трафик). passthrough=no, т.к. мы не хотим, чтобы пакет, после попадания в это правило, обрабатывался в таблице как-то еще.

Второе навешивает нужную метку роутинга new-routing-mark=ISP1-route в цепочке PREROUTING, т.е. ДО принятия решения о маршрутизации, и отслеживает трафик пришедший к нам из локальной сети in-interface=bridge.
Здесь нас выручает механизм CONNECTION TRACKING, позволяющий поймать промаркированные правилом выше соединения из локальной сети(от WEB-сервера) и навесить им необходимый тег роутинга.

Это позволяет транзитному трафику(здесь к/от web-сервера) идти именно тем путем, которым он и пришел, т.е. пришел через ISP1 — уходи через него же.

Заключение
Очень рад, если мои объяснения понятны, а данный труд станет полезен.
Ушел медитировать, всем удачи!

Автор: Евгений Романенко
maxya Тётя шура тут
«Все постоянно твердят об авторских правах, но никогда - об авторских обязанностях.» © Жан-Люк Годар

Мой телевизор: Samsung LE-32C550J1WXUA, Samsung UE55D6100, Samsung UE65°ES8007

Мой ресивер: Sat-Integral S-1248 HD Heavy Metal, Vu+ Ultimo 4K

Мои спутники: 4°W+4.8°E+9°E+13°E+36°E+75°E+85°E+90°E

Cказали Спасибо: 1 : zmej74
Информация

Посетители, находящиеся в группе Гости, не могут оставлять сообщения в данной теме.

    XML error in File: https://www.tricolor.tv/rss/

    XML error: error parsing attribute name at line 533

Футбол

Італія. Серія А, 34 тур
28 квітня 2024
13:30 Інтер Інтер -:- ТоріноТоріно
Франція. Ліга 1, 31 тур
28 квітня 2024
14:00 Мец Мец -:- ЛілльЛілль
Іспанія. Ла Ліга, 33 тур
28 квітня 2024
15:00 Кадіс Кадіс -:- МальоркаМальорка
Франція. Ліга 1, 31 тур
28 квітня 2024
16:00 Лорьян Лорьян -:- ТулузаТулуза
16:00 Страсбур Страсбур -:- НіццаНіцца
16:00 Клермон Клермон -:- РеймсРеймс
Англія. Прем'єр-ліга, 35-й тур
28 квітня 2024
16:00 Борнмут Борнмут -:- БрайтонБрайтон
16:00 Тоттенгем Тоттенгем -:- АрсеналАрсенал
Італія. Серія А, 34 тур
28 квітня 2024
16:00 Болонья Болонья -:- УдінезеУдінезе
Німеччина. Бундесліга, 31 тур
28 квітня 2024
16:30 Боруссія Менхенгладбах Боруссія Менхенгладбах -:- Уніон БерлінУніон Берлін
Іспанія. Ла Ліга, 33 тур
28 квітня 2024
17:15 Гранада Гранада -:- ОсасунаОсасуна
Франція. Ліга 1, 31 тур
28 квітня 2024
18:05 Ренн Ренн -:- БрестБрест
Німеччина. Бундесліга, 31 тур
28 квітня 2024
18:30 Майнц Майнц -:- КельнКельн
Англія. Прем'єр-ліга, 35-й тур
28 квітня 2024
18:30 Ноттінгем Форест Ноттінгем Форест -:- Манчестер СітіМанчестер Сіті
Італія. Серія А, 34 тур
28 квітня 2024
19:00 Наполі Наполі -:- РомаРома
19:00 Аталанта Аталанта -:- ЕмполіЕмполі
Іспанія. Ла Ліга, 33 тур
28 квітня 2024
19:30 Вільярреал Вільярреал -:- Райо ВальєканоРайо Вальєкано
Франція. Ліга 1, 31 тур
28 квітня 2024
20:00 Ліон Ліон -:- МонакоМонако
Німеччина. Бундесліга, 31 тур
28 квітня 2024
20:30 Дармштадт Дармштадт -:- ГайденгаймГайденгайм
Італія. Серія А, 34 тур
28 квітня 2024
21:45 Дженоа Дженоа -:- КальяріКальярі
21:45 Фіорентина Фіорентина -:- СассуолоСассуоло
Іспанія. Ла Ліга, 33 тур
28 квітня 2024
22:00 Реал Бетіс Реал Бетіс -:- СевільяСевілья
Франція. Ліга 1, 31 тур
28 квітня 2024
22:00 Марсель Марсель -:- ЛансЛанс

Обновлено: 05:47 28.04.2024

Телепрограмма

СТБ
05:10 - Т/с "След". "Жизнь и смерть Витаса".
06:30 - Т/с "След". "Серая мышь".
07:30 - Т/с "След". "С высоты птичьего полета".
08:25 - Т/с "След". "Та, которая питается кровью".
Sport 1
07:40 - Хоккей. Чемпионат Швейцарии. Национальная лига. Финал. Лозанна - Цюрих. Матч 6.
09:45 -  Легкая атлетика. Мадридский марафон в Испании. Прямая трансляция.
12:30 - Бокс голыми кулаками. BKFC Knucklemania 4 в Лос-Анджелесе, США.
ICTV
05:00 - "Единые новости". Телемарафон.
06:00 - "Единые новости". Телемарафон.
07:00 - "Единые новости". Телемарафон.
08:00 - "Единые новости". Телемарафон.
Кинопремьера
05:45 - Х/ф "Марлоу".
07:35 - Х/ф "Папы".
09:20 - Х/ф "Миллионер на три дня".
Вся телепрограмма

Мы в Вконтакте

Мы в Facebook

Голосование

Какой провайдер спутникового ТВ вы смотрите?

НТВ Плюс
Радуга ТВ
Виасат Украина
Xtra TV
Триколор ТВ
Континент ТВ
Телекарта
Рикор ТВ
Взрослый
Все понемногу

Случайное фото

Sat-integral club

Re: ПО Sat-Integral S-1432 HD COMBO/S-1412 HD ROCKET версии 1.32/1.86

а навіщо ютубу(гуглу) підтримувати пристрої, які непоказують їхню рекламу !?... от і змінюють ...

Re: ПО Sat-Integral S-1432 HD COMBO/S-1412 HD ROCKET версии 1.32/1.86

Цитата: банан от Вчера в 18:54:10музика вічна !...  в мене теж та сама чорна заставка... скоро ...

Re: ПО Sat-Integral S-1432 HD COMBO/S-1412 HD ROCKET версии 1.32/1.86

Цитата: Yuriy Protas от Вчера в 16:42:09Недовго музика грала. музика вічна !...  в мене теж та ...

Re: ПО Sat-Integral S-1432 HD COMBO/S-1412 HD ROCKET версии 1.32/1.86

Схоже,YouTube накрився мідним тазом. Стоїть знак оклику і пише: НАСТУПНИЙ ЗМІСТ НЕДОСТУПНИЙ У ЦІЙ ...

Re: Безкоштовний плейлист IPTV

Чебур. https://oxy.st/d/xIOh

PHP: mail() через внешние SMTP msmtp

Ситуация следующая. ...

webhook telegram Read timeout expired

Вы выполняете ...