Mikrotik как не запутаться между провайдером и VPN

Всем привет!!!

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

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

Суть проблемы в том, что у меня все работало, но почта от Gmail ко мне на сервер не приходила и я понять не мог почему. Зато от других почтовых серверов почта приходила корректно.

У меня есть сервер Synology NAS и на нем работают разные сервисы. Web сервер, почтовый сервер и многие другие. Соответственно для этих сервисов на роутере проброшены необходимые порты. Все это хорошо работало, пока я не настроил на роутере VPN. С этого момента по сути для роутера появилось два шлюза или два провайдера. Кому как больше нравится. Как я и что настраивал, писал тут Настройка роутера MikroTik с BGP для просмотра потокового видео дома. В общем у меня только определенные маршруты идут в VPN, а все остальные через провайдера.

При такой схеме есть два варианта развития событий.

  • Первый вариант. Когда из локальной сети ПК или сервер хочет установить соединение с хостом в интернете. В этом случаи куда бы трафик не пошел, все будет работать. Тут и рассматривать нечего.
  • Второй вариант. Когда из интернета сервер или хост хочет установить соединение с серверов внутри локальной сети по проброшенному порту. Вот тут начинаются нюансы. Этот вариант и буду рассматривать.

Синей стрелкой показано запрос нового соединения из интернета к моему серверу. Красной стрелкой показано как ответил мой сервер по неправильному маршруту. Зеленой стрелкой показано как ответил мой сервер по правильному маршруту.

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

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

Нужно создать в таблице фаервола в правилах Mangle три правила

  • Первое правило prerouting и входящий интерфейс провайдера. В моем случаи это ether1. Так же укажите Connection Mark no-mark. Во вкладке Action укажите действие marc connection и в поле New Marc Connection укажите ISP-connect.
  • Следующим правилом все в тоже таблице prerouting укажите Connection Mark тот самый ISP-connect. В разделе Extra Dest Adress Type укажите не local. А в поле Action укажите Mark routin и New Mark Routing например rus. Я назвал так.
  • Теперь еще одно правило, но уже в цепочке output. Укажите Connection Mark тот самый ISP-connect. В разделе Extra Dest Adress Type укажите не local. А в поле Action укажите Mark routin и New Mark Routing укажите такое же параметр как на этапе ранее. У меня это rus.

Эти правила должны быть вверху, что отрабатывала их логика

/ip firewall mangle
add action=mark-connection chain=prerouting comment="Connmark in from ether1" connection-mark=no-mark in-interface=ether1 new-connection-mark=\
    ISP-connect passthrough=no
add action=mark-routing chain=prerouting comment="Routemark transit out via eth1" connection-mark=ISP-connect dst-address-type=!local \
    new-routing-mark=rus passthrough=no
add action=mark-routing chain=output comment="Routemark local out via ethe1" connection-mark=ISP-connect dst-address-type=!local \
    new-routing-mark=rus passthrough=no

Теперь пояснительная бригада. Все входящие пакеты предназначающееся не роутеру, а например почтовому серверу, пришедшие от провайдера на интерфейсе ether1 помещать в роутинг таблицу rus, предварительно пометив это соединение ISP-connect. Соответственно для этих ISP-connect на передаче должна быть все та же таблица маршрутизации rus.

Если у вас несколько таких шлюзов или провайдеров, то для каждого делайте по три таких правила. Я получаю входящий трафик от одного провайдера, поэтому правил только 3.

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

Для этого переходим в IP > Routes и создаем новый статический маршрут по умолчанию 0.0.0.0/0 использую шлюз нашего провайдера, а в параметре Routing Table указываем rus как показано на картинке ниже. Таким образом все конекшены, которые попали в эту таблицу, будут выходить через шлюз провайдера, а не через VPN шлюз. Конекшены, которые не попали под эти правила пойдут своим путем, например через VPN.

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

На этом задача решена. Почта от Gmail приходит и уходит корректно на моем сервере, а ютуб и прочее работают как и работали без тормозов.

Но тут есть нюанс связанный как раз со шлюзом в провайдера. Если у вас статический IP адрес, то все что будет дальше вам не нужно. У меня же адрес на порту провайдера динамический, а это значит, что он меняется, а значит и меняется шлюз провайдера. Для решения этой проблемы был создан скрипт. Большое спасибо одному человеку, который помог его реализовать.

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

:local providerGateway [/ip route get [find dst-address=0.0.0.0/0 routing-table=main] gateway];
:if ($providerGateway != "") do={
    :local existingRoute [/ip route find dst-address=0.0.0.0/0 routing-table=rus];
    :if ([:len $existingRoute] > 0) do={
        /ip route set $existingRoute gateway=$providerGateway comment="rus";
        :log info "Шлюз успешно обновлён на: $providerGateway";
    } else={
        /ip route add dst-address=0.0.0.0/0 gateway=$providerGateway comment="rus" routing-table=rus;
        :log info "Добавлен новый шлюз: $providerGateway";
    }
} else={
    :log error "Шлюз по умолчанию не найден!";
}

Что бы он работал я, добавил его dhcp client. Теперь при каждом обновлении адреса на порту ether1 или перезагрузки роутера в таблице rus всегда прописан корректный шлюз

Заметил, что не всегда микротик запускает скрипт в dhcp клиенте. Поэтому возможно дополнительно надо установить скрипт в планировщик.

Теперь вы знаете что нужно, что бы Mikrotik как не запутаться между провайдером и VPN

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии