Микротик шлюз для второй сети

Микротик шлюз для второй сети Хостинг

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

Устройства от латвийской компании MikroTik —
гибкие в настройке, функциональные решения для домашних и корпоративных
сетей. Операционную систему RouterOS можно так же установить на
различные аппаратные платформы, включая x86.

Дано:


Микротик шлюз для второй сети

Микротик шлюз для второй сети

Описание конфигурации по умолчанию


Микротик шлюз для второй сети

Управление учётными записями

Терминал. Управление учётными записями

Теперь определимся с сетевыми интерфейсами, перейдя в меню Interfaces.
Как было описано выше, первый и второй порт роутера используем под wan
порты, а остальное выпускаем в локальную сеть, указывая для портов с 3го
по 4й в поле Master Port 5й порт. Для удобства к названию портов были
приписаны описания
(ether1-wan1, ether2-wan2, ether3-slave, ether4-slave, ether5-lan-master). Последний
порт был выбран мастером не случайно. Если возникнет необходимость
добавить еще один wan интерфейс, то мы просто уберем зависимость
третьего порта от мастер-порта и настроим его под свои нужды.
Необходимость переназначать мастер порт не возникнет, в отличии от
варианта с присвоением роли мастер-порта третьему порту роутера.


Микротик шлюз для второй сети

Терминал. Настройка интерфейсов

При необходимости использовать wi-fi-интерфейс потребуется создать
bridge интерфейс и добавить в него мастер-пор ethernet интерфейсов и
wi-fi интерфейс  (на своём оборудовании wi-fi я отключил, так как в нём
не было необходимости). В данной статье используется так называемая
switch-коммутация портов, которая обладает большей производительностью
по сравнению с bridge-коммутацией. В приведенном роутере используется
один switch-микроконтроллер на 5 портов. При наличии более одного
switch-контроллера на каждый контроллер назначается один мастер порт,
затем они объединяются в bridge, если есть необходимость объединить их в
одно пространство. Подробнее о различиях способов коммутации портов
можно прочитать здесь.
Ниже приведен пример создания bridge-интерфейса и добавление в него мастер-интерфейса.


Микротик шлюз для второй сети

Создание bridge- интерфейс


Микротик шлюз для второй сети

Добавление порта в bridge-интерфейс

Терминал. Работа с bridge-интерфейсом


Микротик шлюз для второй сети

Адрес для wan1


Микротик шлюз для второй сети

Адрес для wan2


Микротик шлюз для второй сети

Адрес роутера в локальной сети


Микротик шлюз для второй сети

Терминал. Идентификация и DNS серверы

Теперь переходим на вкладку Filter Rules и добавляем набор
стандартных правил. В графической оболочке принцип настройки такой же
как и при добавления правила NAT — на вкладке General выбираем параметры
и цепочку, а на вкладке Action выбираем действие. Ниже привожу набор
команд для термина, из которых понятно что и как настроить в каждом
правиле. Так же можно скопировать и выполнить в окне терминала (кнопка
New Terminal) одним списком.


Микротик шлюз для второй сети

Маршрут до гейтов провайдеров. Балансировка нагрузки

В каждом маршруте для помеченных соединений я указывал IP адреса
интерфейсов wan1 и wan2. В зависимости от типов настроенных соединений
для wan’ов можно указывать IP интерфейса или сам интерфейс. Для
статичных адресов метод с интерфейсами не заработал, так как адреса
статикой были присвоены на бродкастные интерфейсы и с другой стороны wan
интерфейса находятся медиаконвертеры провайдеров без proxy-arp на
интерфейсах. В поле Routing Mark выбираем соответствующую метку.


Микротик шлюз для второй сети

Маршрут для помеченных соединений через wan1


Микротик шлюз для второй сети

Маршрут для помеченных соединений через wan2

Терминал. Добавляем маршруты


Микротик шлюз для второй сети

Помечаем соединения для wan1


Микротик шлюз для второй сети

Помечаем соединения для wan2


Микротик шлюз для второй сети

Добавляем метку маршрутизации для соединений через wan1


Микротик шлюз для второй сети

Добавляем метку маршрутизации для соединений через wan2

Терминал. Помечаем соединения и маршруты


Микротик шлюз для второй сети

Создаём списки. Добавляем адреса

Теперь переходим на вкладку Mangle и создаём по правилу на каждый
список чтобы пометить маршруты. На вкладке General поле Chain =
prerouting и внизу ставим галочку на Connection State — new. Далее на
вкладке Advanced в поле Dst. Address List выбираем список адресов
(over-wan1) и на вкладке Action в поле Action выбираем mark routing, в
поле New Routing Mark выбираем метку (wan1-rt). Таким же образом создаём
правило для следующего списка.

Теперь можно проверить доступность ресурсов из адресных списков
запустив трассировку до узла. Соединение должно идти через шлюз
определенного для выбранного wan провайдера.

Вот  и всё на этом. Удачи Вам!

Время на прочтение

Стояла задача обеспечить отказоустойчивость работы сетевого маршрутизатора, который должен был поддерживать несколько локальных сетей, три канала в интернет от разных провайдеров, DMZ и десяток VPN соединений для удаленных пользователей.

Под отказоустойчивостью подразумевалась мгновенная замена оборудования в случае выхода из строя. Я остановил выбор на Mikrotik RouterOS, так как имел положительный опыт эксплуатации данной ОС. Так же на выбор повлияло удобство настройки и администрирования благодаря утилите Winbox.

Данный пример отказоустойчивости работает в боевых условиях несколько лет и себя оправдал. За время эксплуатации конфигурация несколько раз переделывалась, но вариант, который ниже, в моих условиях оказался оптимальным. Сейчас выключение одного из роутеров не влияет на работу, они полностью взаимозаменяемы.

В качестве железа было решено использовать обычные PC с процессорами Core 2 Duo, 1 Гб памяти и HDD Flash от Трансенд в качестве накопителя. Оба маршрутизатора разместились в симпатичных MiniTower корусах на полке в серверном шкафу. Версия Mikrotik на тот момент устанавливалась 4.16, но сейчас работает на 5.22

Не буду описывать настройку всего маршрутизатора, а остановлюсь только на отказоустойчивости. Для лучшего восприятия информации ограничимся одним провайдером и 3-мя внутренними локальными сетями.

Протоколом для обеспечения отказоустойчивости был выбран VRRP. Принцип его в том, что маршрутизаторы имеют приоритет: Master и Slave и через некоторый интервал времени проверяют доступность друг друга. Если Master выйдет из строя — Slave его заменит.

Так как сетевых интерфейсов на маршрутизаторе по числу PCI всего 3 (1 интегрированный не использовали), а подсетей много — использовался также VLAN. При чем на физический интерфейс вешался VRRP, а уже на него VLAN-ы. Все настройки проводились на одном маршрутизаторе. Второй настраивается автоматически.

Настройка интерфейсов

Физичиские ethernet интерфейсы

/interface ethernet
set 0 arp=enabled auto-negotiation=yes cable-settings=default
disable-running-check=yes disabled=no full-duplex=yes l2mtu=1600
mtu=1500 name=lan speed=1Gbps

set 1 arp=enabled auto-negotiation=yes cable-settings=default
disable-running-check=yes disabled=no full-duplex=yes l2mtu=1600
mtu=1500 name=wan speed=1Gbps

/interface vrrp
add arp=enabled authentication=none disabled=no interface=lan
interval=2s mtu=1500 name=vrrp-lan
preemption-mode=yes priority=101 v3-protocol=ipv4 version=3 vrid=2

Из настроек VRRP интересны 3 параметра
1) interface=lan интерфейс, на который вешается VRRP
2) priority=101 приориет роутера. Мастер или Слейв. Главный тот — у кого больше.
3) preemption-mode=yes если этот режим выключен: после того, как слейв станет мастером, он им и останется, даже когда мастер вернется в строй.

VLAN локальной сети

/interface vlan
add arp=enabled disabled=no interface=vrrp-lan mtu=1500 name=vlan101
use-service-tag=no vlan-id=101
add arp=enabled disabled=no interface=vrrp-lan mtu=1500 name=vlan102
use-service-tag=no vlan-id=102
add arp=enabled disabled=no interface=vrrp-lan mtu=1500 name=vlan103
use-service-tag=no vlan-id=103

VRRP используется только на локальном интерфейсе. Его задачей является контроль работоспособности маршрутизатора в целом и наличие связи с локальной сетью. В случае возникновения проблем, все остальное переключалось скриптом. Такое решение было обусловлено тем, что у меня плохо работал IpSec при VRRP+VLAN на WAN интерфейсе.
VRRP на Mikrotik позволяет использовать маршрутизаторы в режимах балансировки нагрузки или отказоустойчивости. В режиме балансировки отказоустойчивость тоже соблюдается, но для нашей задачи достаточно просто отказоустойчивости, иначе пришлось бы вешать VRRP на все интерфейсы.

/ip address
add address=192.168.101.1/24 disabled=no interface=vlan101 network=192.168.101.0
add address=192.168.102.1/24 disabled=no interface=vlan102 network=192.168.102.0
add address=192.168.103.1/24 disabled=no interface=vlan103 network=192.168.103.0

add address=10.1.1.2/29 disabled=no interface=lan network=10.1.1.0
add address=10.1.1.1/32 disabled=no interface=vrrp-lan network=10.1.1.1

add address=77.77.77.70/30 disabled=no interface=wan network=77.77.77.68

Виртуальные интерфейсы vrrp-lan на обеих маршрутизаторах будут иметь одинаковый адрес 10.1.1.1/32
А вот физические lan инетрфейсы будут иметь разные адреса (10.1.1.2 и 10.1.1.3) и также будут находится в одной подсети между собой и vrrp-интерфейсом.

Читайте также:  Улучшите управление программным обеспечением с помощью локального репозитория Centos 7: инструкции

Теперь достаточно добавить шлюз по умолчанию в таблицу маршрутизации и первичную настройку можно считать законченной.

/ip route
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=77.77.77.69 scope=30 target-scope=10

Далее нужно настроить скрипты резервного копирования, проверки статуса Master/Slave и переноса конфигурации.

Проверка статуса роутера

Если vrrp running=false, тоесть роутер в режиме Slave — отключаем WAN. Если Master — то включаем. Также проверяем текущий статус интефейса WAN — включен он или выключен, чтобы лишний раз его не тревожить. Этот скрипт ставим выполняться в планировщик каждые 3-10 секунд.

Кроме отправки на почту (предварительно параметры отправки нужно настроить), скрипт будет создавать локальный файл с именем lastconfig.backup, который нам пригодится.

Этот скрипт ставим выполняться в планировщик 1 раз в сутки, у меня стоит ночью. Если вы делаете за день много изменений в конфигурации — ставьте как вам удобно.

Далее идут 2 скрипта: перенос настроек и применение настроек на резервном сервере. Так как они должны выполняться только на резервном сервере, то роутеры нужно как-то различать. Я различаю по МАС-адресах интегрированных сетевых интерфейсов. Резервный имеет адрес FF:FF:40:40:40:41

Копирование и применение последней актуальной понфигурации

Этот скрипт ставим в планировщик на несколько минут позже выполнения скрипта резервного копирования.

И последний скрипт — применение настроек на резервном сервере. В нем также используется МАС для идентификации роутера.

Собственно, на этом все. Напомню, мы все манипуляции делали на роутере, который у нас будет мастером. Теперь сохраняем конфигурацию, переносим ее на слейв и применяем на нем. Это можно сделать любым способом, описанным здесь http://wiki.mikrotik.com/wiki/Manual:Configuration_Management#System_Backup

После применения конфигурации и перезагрузки, резервный маршрутизатор войдет в строй с нужными нам настройками.

Писалось по памяти, но в процессе настройки использовались разные источники. В основном wiki.mikrotik.com/wiki/Main_Page

Вам надо убрать порт из списка master-port.
По умолчанию кроме первого порта, все остальные порты (3,4,5) являются дочерними к eth2.
eth2 у вас master-port.


Микротик шлюз для второй сети

Поэтому вам надо убрать порт из списка master-port и делать на нем свою сеть.
Самое простое в вашем случаи, убрать из списка eth5.
Если вы начнете убирать eth2, то вам надо будет вначале убрать из списка eth 3,4,5.
Потом убрать master-port с eth2, затем назначить eth 3 новым master-port для 4,5.

Почему так сложно ? Ну вот так сделали mikrotik в свое время. Все , что работает на уровне master-port работает на уровне switch. Сейчас в новых прошивка они планируют поломать эту логику и сделать все логично через bridge. master-bridge все будет делать через switch, все остальные bridge будут выполнять через CPU.

Теперь вам надо будет сделать новый bridge, повесить на него свободный порт и настраивать DHCP/IP итд итп.

P. S. Как всегда бегло я читаю.

Видно у вас новая прошивка , да еще и бета. Если нет, то рекомендую сбросить настройки. Так как в этом случаи у вас все будет работать через CPU.

А так из bridge исключайте порт, делайте еще один новый bridge И добавляйте новый порт.

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

Настройка нескольких провайдеров в RouterOS.

Основная проблема настройки нескольких провайдеров заключается в том, что мы должны отправить пакет в тот же шлюз, с которого пришёл трафик через провайдера. Если мы этого не сделаем, то в большинстве случаев оператор заблокирует трафик с неправильным source адресом.

Если оператор нам выдал ip адрес 1.1.1.2, то мы должны обеспечить выход через этого провайдера именно с таким ip адресом, а не с каким либо другим.

Не будем ходить вокруг да около, а сразу приступим к настройке.

Для начала определим вводные данные.

Настройка IP адресации

Настроим IP адреса, согласно выданным настройкам от провайдера.

Я думаю бессмысленно как-то дополнять данные настройки.

Маркировка соединений от провайдера

Вы наверное помните, а если и нет, то стоит напомнить, что любой пакет, который приходит на маршрутизатор и попадает в цепочку prerouting и не важно куда он дальше попадёт forward или Input.

Наша задача пометить определённой маркой все пакеты, которые приходят от провайдеров и предназначены для определённого префикса, это необходимо для того, чтобы мы далее могли на любом этапе обработки пакетов определить, какому провайдеру принадлежит данный пакет.

Сначала настроим, а далее разберём что сделали.

Разберём только первое правило, все остальные по аналогии.

Если пакет приходит с интерфейса ether1 и адрес назначения лежит в сети 88.88.88.0/29, и такой пакет создал соединение, то маркируем соединение маркой Next-Hop/88.88.88.1.

88.88.88.0/29 — почему сеть, а не IP? Если вы будете делать правила для каждого IP адреса, количество правил будет расти, а смысл будет тот же самый.

connection-state=new — нет смысла пытаться маркировать соединения, которые уже установлены. Как вы помните new — это пакет, который создал соединение, т.е он только один, а в случае со всеми пакетами routeros будет каждый раз пытаться маркировать соединение. Которое уже и так может иметь маркировку.

Next-Hop/99.99.99.1 — почему именно так? Как вы помните, наша главная задача отправить трафик через тот же самый шлюз, через который трафик пришёл, а мы таким названием себе явно напоминаем, какой шлюз будет использоваться для выхода в сторону провайдера. Мы бы могли использовать что-нибудь вроде ISP1, но так как у нас первый провайдер даёт два префикса в одном и том же интерфейсе, мы должны трафик, который приходит на разные префиксы каким нибудь образом разделить.

И так это наша заготовка, далее мы начнём работать непосредственно с логикой.

С этого момента весть трафик, который придёт со стороны провайдера, будет промаркирован, а далее бы будем оперировать данной маркировкой.

Доступ к маршрутизатору

Первая задача, которую нам необходимо решить, это организовать возможность управления маршрутизатором через разных провайдеров. Мы должны иметь возможность подключаться по любому IP адресу по ssh, winbox, а также если вы будете использовать RouterOS в случае VPN сервера. В общем организовать правильный выход пакетов, которые будет отправлены с маршрутизатора в ответ на входящие соединения.

Для начала нам надо организовать правильные таблицы маршрутизации. В одной таблице маршрутизации не могут быть одновременно два одинаковых активных маршрута, если маршруты одинаковы, то приоритет выбирается из значения distance. Для того чтобы можно было использовать несколько одинаковых маршрутов в RouterOS есть возможность создавать альтернативные (именованные) таблицы маршрутизации.

Создадим данные таблицы.

dst-address=0.0.0.0/0 — обычный маршрут по умолчанию, не более чем.

gateway=88.88.88.1 — шлюз, обратите внимание на то, что нам первый провайдер даёт два префикса с разными шлюзами, и поэтому мы создаём три маршрута, для нас по факту не два провайдера, а три.

routing-mark=Next-Hop/88.88.88.1 — это и есть именованная таблица маршрутизации. Она может иметь любое имя, какое вам удобнее, лично моё мнение, такое именование удобно записывать в названии таблицы шлюз, через который будет отправлен пакет в случае если он будет использовать данный маршрут. Имена маркировок соединений и маршрутов просто совпали и могут быть совершенно разные.

Вы обратили внимание, что я писал про таблицы и маркировки? Дело в том, что маркировка маршрута это не таблица, хотя в большинстве случаев это так. Попробуйте ответить на вопрос, для чего и какая разница в правилах между двумя фильтрами в firewall.

Читайте также:  Лучшие программы для создания сайта

Дело в том, что routing-mark это маркировка, когда вы своими руками с помощью mangle назначили на пакет маркировку, а routing-table это то, через какую таблицу маршрутизации вышел пакет.

Если маршрутизатор не найдёт подходящего маршрута в именованной таблице маршрутизации, маршрутизатор продолжит поиск подходящего маршрута в таблице по умолчанию main и такой пакет можно будет отфильтровать например так routing-mark=custommark routing-table=main. Нам же такое поведение не нужно, если по какой-то причине маршрут не будет найден, пакет должен умереть на маршрутизаторе, а отправлять через другого провайдера нет никакого смысла.

Нам необходимо переопределить данное поведение.

Т.е марка и таблица по факту это одно и тоже, пакет, который имеет определённую routing-mark и пытается найти маршрут в таблице с таким же именем.

Осталась самая малость, это отправить в нужную марку необходимый трафик.

Цепочка output, так как мы работаем только с трафиком, который генерирует в ответ на запрос соединения. Выбрали пакеты принадлежащие только определённым соединениям и отправили в именованную таблицу.

Вроде бы всё хорошо и всё должно работать, но это не так, в RouterOS есть один маленький нюанс, который необходимо помнить и учитывать. Дело в том, что маршрутизатор, прежде чем отправить пакет в цепочку output, смотрит в таблицу маршрутизации и ищет для адреса назначения подходящий маршрут в таблице main, есть всего три типа сервисов, которые умеют работать вне данного поведения, это ping, traceroute и ospf — это необходимо для работы в VRF.

На данный момент у нас нет маршрута по умолчанию в таблице маршрутизации main, встаёт вопрос, какой шлюз указать в качестве маршрута по умолчанию, если мы укажем первого провайдера, то в случае падения интерфейса мы останемся у разбитого корыта, мы можем сразу указать три шлюза и с помощью distance указать приоритеты, но тогда мы должны помнить про данную настройку и случае замены провайдера или какого-либо изменения править конфигурацию и в этом моменте, а там то всего нужно пройти выбор маршрута и далее уже переопределить направление, т.е по факту это логический кейс.

Все интерфейсы имеют способность падать, есть один интерфейс, который всегда находится в состоянии UP, но в RouterOS использовать его в конфигурации не представляется возможным — это Loopback.

В RouterOS данный интерфейс можно заменить пустым bridge.

Я часто рассказываю на курсах, почему именно такое название, а не просто Loopback, возможно в ближайшем будущем в RouterOS будет добавлено поддержка Loopback интерфейса и если разработчики заложат такое же название, то при обновлении версии RouterOS могут возникнуть проблемы.

А теперь создадим маршрут в таблице main, который необходим для преодоления выбора маршрута и попадания пакета в цепочку output.

Максимальная дистанция для того, чтобы в случае если мы создадим нормальный маршрут по умолчанию, а не фиктивный, нам данный маршрут не мешал.

Напоминаю, что дистанция 255 это административная дистанция, которая явно указывает на то, что данный маршрут мёртв и не участвует в маршрутизации.

Всё, на данном этапе вы должны иметь возможность подключаться к маршрутизатору по любому IP адресу через любого провайдера одновременно, можете “пинговать” и делать всякие другие непотребства с внешними IP адресами.

Выход с маршрутизатора

Хоть и по сути мы сделали уже много, но у нас ещё несколько кейсов впереди. Теперь мы должны сделать таким образом, чтобы пакеты, которые генерирует сам маршрутизатор (не в ответ), уходили через нужного провайдера и шлюза.

Когда вы “пингуете” с маршрутизатора, строите PPP* или IP туннели с самого маршрутизатора или dns запросы отправляете с самого маршрутизатора. Разница с прошлым кейсом в том, что мы отправляли пакет по уже установленному соединению, а здесь пакет улетает с маршрутизатора и соединение не имеет маркировки.

Здесь будет значительно проще.

Весь трафик, уходящий с маршрутизатора, и имеющий IP адрес попадающий под префикс, будет отправлен в именованную таблицу маршрутизации.

Всё, теперь вы можете строить туннели и у вас всё будет работать, но только в том случае если явно указан IP адрес, например в Ipsec или gre, ip туннели и прочее, там где явно можно указать Source адрес. А что делать с сервисами, где нельзя указать явно IP адрес источника? Ответ на этот вопрос кроется в таблице маршрутизации. Параметр pref-src отвечает за то, какой IP адрес будет выбран если он явно не задан.

Если вам необходимо установить соединение из локальной сети с адресом который назначен на интерфейсе провайдера, допустим при использовании Hairpin-NAT, в правилах вы должны исключить BOGON сети из адресов назначения.

В нашем примере если только для одного IP адреса.

Ещё раз для понимания, у нас есть два варианта развитая сюжета, если IP адрес источника явно указан и тогда нам нечего не грозит и всё замечательно работает. Второй вариант, когда IP адрес явно не задан, например вы подминаете l2tp-client у нас нет возможности указать source адрес, но ведь адрес назначения есть в любом случае. Тогда маршрутизатор поступает следующим образом, он находит маршрут в таблице маршрутизации main, смотрит какой указан pref-src и использует данный ip адрес, как адрес источника.

Вы помните что мы создавали фиктивный маршрут.

Давайте его немного изменим так, чтобы мы определили IP адрес, с которого будет формироваться трафик.

Выбор IP адреса зависит только от вас, выбирайте тот адрес, который считаете менее загруженным.

На этом этапе всё, теперь вы можете строить различные туннели и устанавливать соединения не только указывая явно source адрес.

Доступ за НАТ

172.20.18.2 — это exchange сервер, мы должны обеспечить доступность 25,80,443 портов через каждого провайдера.

НАТ делаем, как обычно, без всяких излишеств.

А теперь давайте вспомним то, что мы делали самым первым правилом в mangle мы промаркировали все соединения, которые приходят через всех провайдеров! Данная маркировка нам опять поможет.

Нам необходимо отфильтровать весь трафик, который идёт из локальной сети и отправить в том направлении к маркировке которого соединение имеет отношение.

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

1. Когда пакет придёт на IP адрес 88.88.88.2 мы промаркировали соединение, которому принадлежит пакет.
2. Далее в NAT мы изменили адрес назначения, и маршрутизатор отправит его до сервера.
3. Естественно сервер в ответ отправит пакет, как минимум syn,ack, так как данный пакет принадлежит уже существующему соединению, мы по имени соединению отправим данный пакет в именованную таблицу маршрутизации.

НАТ уже сделали, дело осталось за малым- найти трафик, который приходит от сервера.

Наверное нет смысла описывать, всё предельно понятно, на входе мы промаркировали трафик от провайдеров, и когда пакет снова попал на вход маршрутизатора, но уже пакеты идут от серверов мы отправляем такие пакеты в именованную таблицу маршрутизации.

Наверное многие спросят, а почему указывается не интерфейс ether1, а не взять и указать явно локальный интерфейс, например ether4.

Мы с вами делаем универсальную конфигурацию, если явно указать какой-либо другой интерфейс, значит в случае если у нас будет ещё один NAT, который пойдёт в другой порт, нам необходимо будет добавлять ещё одно аналогичное правило, но уже с другим интерфейсом. А ведь мы можем даже завернуть трафик с помощью NAT вообще на внешние сервера например 1.1.1.1, и что тогда? Единственный интерфейс откуда в цепочке prerouting мы не должны ожидать данный трафик, это трафик с самого провайдера и причём именно с того, с которого он пришёл.

Читайте также:  Упрощение управления доменом: объединение двух контроллеров домена стало проще

Всё работает, теперь вы можете подключаться в своему серверу по любому IP адресу. Создайте DNS A запись RR и укажите все три внешних IP адреса и всегда ссылайтесь на данную запись.

mail.mycompany.ru A 88.88.88.2
mail.mycompany.ru A 99.99.99.2
mail.mycompany.ru A 44.44.44.2

Промелькнула такая мысль в голове? Ведь когда пакет от сервера будет уходить через маршрутизатор, нам надо будет подменить его src адрес, на адрес на который он шёл в самом начале. Но мы ничего не сделали для этого.

Нам делать ничего не нужно, если вспомнить что в правило NAT попадает только самый первый пакет, тот на основании которого было создано соединение new, именно поэтому обычно вы видите небольшие значения в счётчиках правила NAT.

Обратное преобразования NAT произойдёт автоматически, давайте взглянем на запись в conntrack.

Давайте уберём из вывода лишнее, чтобы оно нам не мешало.

0 SAC protocol=tcp src-address=5.19.245.3:57839 dst-address=88.88.88.2:80 reply-src-address=172.20.18.2:80 reply-dst-address=5.19.245.3:57839

И так когда пакет попал на маршрутизатор и соединение было “только-только” создано, соединение имело такой вид

0 SAC src-address=5.19.245.3:57839 dst-address=88.88.88.2:80

После того как произошла процедура dst NAT, маршрутизатор добавил флаги и самое главное на какой адрес изменяется IP адрес во всех пакетах в данном соединении.

0 SAC d src-address=5.19.245.3:57839 dst-address=88.88.88.2:80 reply-src-address=172.20.18.2:80

Когда пакет уходил с маршрутизатора в цепочки postrouting работает процедура src NAT, но у нас нет правил src NAT, оставили значение исходное.

0 SAC d src-address=5.19.245.3:57839 dst-address=88.88.88.2:80 reply-src-address=172.20.18.2:80 reply-dst-address=5.19.245.3:57839

Обратите внимание, что все данные этапы были сделаны на момент прохождения только первого пакета.

Теперь, если пакет приходит на маршрутизатор и у него в заголовках src-address=5.19.245.3:57839 dst-address=88.88.88.2:80 dst-address изменится на 172.20.18.2:80.

Если пакет приходит на маршрутизатор с адресами в заголовках src-address=172.20.18.2:80 dst-address=5.19.245.3:57839 src адрес изменится на 88.88.88.2:80.

Тем самым src NAT на данном этапе работает автоматически на основании правил dst-NAT.

Выпустить с правильного адреса

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

Например, VoIP телефония, ваш провайдер телефонии требует, чтобы вы регистрировались только с определённого IP адреса, или банк клиент на компьютере главного бухгалтера должен подключаться с определённого адреса.

Сначала настроим адрес листы в которые будем добавлять внутренние адреса хостов, которые необходимо отправить через нужного провайдера и с определённого IP адреса.

Адрес 0.0.0.1, для того чтобы создать лист, но не привязывать к реальному адресу.

Название листа явно говорит о том, на какой IP адрес необходимо изменить адрес источника.

Для реализации данного кейса нам необходимо учитывать особенность работы RouterOS.

Дело в том, что для трафика который проходит через маршрутизатор мы можем изменить таблицу маршрутизации только в цепочке prerouting, и естественно исходящий интерфейс нам ещё не известен, он будет известен только в цепочке forward.

И мы не можем просто взять и завернуть весь трафик от внутреннего хоста в определённого провайдера, так как у нас есть ещё и локальная сеть.

Допустим, если мы добавим хост 172.20.17.100 и скажем, что весь трафик направить в первого провайдера, то что будет с трафиком, который идёт на хост 172.20.18.2? Естественно он будет направлен в первый провайдер.

Для решения данной задачи нам помогут BOGON сети, это список сетей, которые никогда не должны использоваться для публикации между public AS в протоколе BGP, другими словами это все те сети, которые используются исключительно в локальных целях.

Создадим адрес лист с BOGON сетями.

А далее создадим правила для того, чтобы выпустить хосты с определённого IP адреса.

Если пакет в адресе источника находится адрес, который перечислен в адрес листе и при этом адрес назначения не попадает под BOGON листы (т.е трафик в интернет), отправить в именованную таблицу.

И последний нюанс-это настроить NAT.

Обратите внимание, что не весь трафик, а только тот, который находится в определённом маркированном маршруте, это необходимо для того, чтобы трафик между локальными сетями не попадал под NAT правило.

Выпускаем всех остальных и балансируем нагрузку

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

Мы будем использовать ECMP для того, чтобы распределить нагрузку по провайдерам.

Наверное вы уже догадались, что весь оставшийся трафик от ваших локальных хостов будет попадать в таблицу main.

Давайте сделаем маршрут ECMP с тем учётом, что шлюз 88.88.88.1 это 10Mbps, а 44.44.44.1 5Mbps.

Пакеты будут отправляться поочередно для каждого шлюза, на каждые 3 пакета, 2 пакету будут отправлены в 88.88.88.1 и оставшийся один пакет на шлюз 44.44.44.1.

Хотя это немного и не правильно, дело в том, что у процесса ECMP есть отдельная таблица кеша, и чтобы каждый раз не выбирать маршрут, маршрутизатор для связки src-address:port dst-address:port создаёт хеш и выберет для данного хеша уже шлюз по схеме Round Robin, тем самым для одного соединения будет выбираться один и тот же шлюз.

Но не все так однозначно, каждый раз, когда вы изменили маршрут, например добавили шлюз или шлюз умер то кеш ECMP чистится, а также каждые 10 минут всё также чистится кеш, отсюда появляется проблема, что каждые 10 минут может выбраться другой шлюз. И снова для каждого уникального хеша будет выбираться маршрут.

Проблема в том, что ограничение в 10 минут, это ограничение жёсткое и нам его не убрать и не изменить.

Будем решать штатными средствами RouterOS.

Давайте подумаем вместе, что нам известно о пакете, который попал под ECMP маршрут? Конечно, данный пакет находится в таблице main.

Идея данного способа заключается в следующем. Дать маршрутизатору выбрать маршрут с помощью ECMP, промаркировать такие соединения и все последующие пакеты в этом соединение пускать мимо ECMP, тем самым мы убираем проблему 10 минут.

chain=postrouting — Работаем в цепочке по факту того, что уже выбрал ECMP, можно использовать и цепочку forward, но тогда не попадёт трафик который был сгенерирован самим маршрутизатором.

routing-table=main — Маршрут ECMP находиться в main таблице.

out-interface=ether1 — ECMP выбрал шлюз, который лежит через первый интерфейс.

connection-state=new — Мы маркируем соединение, нет смысла работать со всеми пакетами.

action=mark-connection new-connection-mark=ECMP/ether1 — маркируем соединение.

Ещё раз, мы дали возможность ECMP выбрать направление и мы уже по факту промаркировали соединения, основываясь на выборе интерфейса.

А теперь все последующие пакеты в соединениях с такой маркировкой должны быть отправлены в тот же интерфейс, но не в таблицу main, так как там работает ECMP, нам это уже не к чему.

Не забудьте, что трафик смотрится со всех сторон, а нам необходимо только трафик из локальной сети, а так как интерфейсов может быть много, лучше всего отфильтровывать по принципу весь трафик КРОМЕ того который пришёл с интерфейса провайдера.

Осталось настроить NAT

За сим всё, спасибо за внимание.

Удалённая настройка маршрутизатора, к дальней дороге.

Оцените статью
Хостинги