Ошибка настройки Source NAT на маршрутизаторах Mikrotik

Я столкнулся с интересной особенностью работы маршрутизаторов Микротик. В сети есть 3 VLAN, маршрутизацией между ними занимается Микротик и все бы хорошо, но иногда из сети выпадают хосты. При этом сам Микротик эти хосты видит, но трафик до них отправлять не хочет. Обычно проблема «самоликвидируются» после перезагрузки устройства. Второй особенностью поведения является странное поведение трафика – TCP и ICMP пакеты проходят нормально, а вот UDP теряются в недрах маршрутизатора. Манипуляции с таблицей маршрутизации не помогают. «Рассасывается» проблема так же как и появляется – сама без чьей либо помощи.

Причиной такого поведения является ошибка допускаемая при настройке Source NAT.
Обычно в инструкциях «микротик для чайников», NAT настраивают следующей командой:

/ip firewall nat add chain=srcnat action=masquerade out-interface=Public

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



Это можно отключить добавив в правиле NAT явное исключение для ваших локальных адресов. Ниже команда на примере сети 10.0.0.0/8

/ip firewall nat add chain=srcnat action=masquerade out-interface=Public dst-address=!10.0.0.0/8

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

rule 1 { 
        match {
            source-address 192.168.1.1/24;
            destination-address 10.10.10.1/24;
        }
        then {
            source-nat {                
                off;
            }
Tags:
mikrotik, juniper srx

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.