Policy Based Routing

Обсуждение ПО и его настройки
Ответить
ooptimum
Сообщения: 3
Зарегистрирован: 05 фев 2018, 09:16

Коллеги, ситуация банальная - есть несколько провайдеров и нужно публиковать некоторый сервис (DNAT) на обоих. Также сбоку от микротика (RB3011) стоит апплайнс с UTM для анализа/фильтрации пользовательского трафика, через который ходит часть внутренних пользователей, оба интерфейса которого (LAN и WAN) воткнуты в тот же микротик.

Для публикации сервисов мы запоминаем с какого внешнего интерфейса пришел первый пакет в соединении - в дальнейшем все пакеты данного соединения должны ходить через этот интерфейс. Часть внутренних пользователей, чьи адреса прописаны в списке адресов с именем "Direct" ходят в интернет напрямую, остальные - через UTM, который в конфиге обозначен как Proxy. Таблица Mangle выглядит так:

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

/ip firewall mangle
# Обработке подвергаются только новые соединения, чтобы снизить нагрузку на CPU
add action=jump chain=prerouting comment="Handle new connections" \
    connection-state=new jump-target=NewInPrerouting

# Если новое соединение маркировано после анализа  в цепочке NewInPrerouting, указываем таблицу
# маршрутизации для данного соединения
add action=jump chain=prerouting comment="Jump if connection has any mark" \
    connection-mark=!no-mark jump-target=MarkedInPrerouting

# Сюда попадают все новые соединения

# Если соединение устанавливается из Интернета, запоминаем интерфейс, через который оно пришло
# (ether1_ISP1 и ether2_ISP2 входят в WAN) 
add action=jump chain=NewInPrerouting comment="Remember ingress WAN interface" \
    in-interface-list=WAN jump-target=SaveIngress

# Если соединение пришло из локалки и направлено в Интернет, то идем в цепочку LANtoWAN
add action=jump chain=NewInPrerouting comment="Mark unicast connections which have destination outside of local networks" \
    dst-address-list=!Local_nets dst-address-type=unicast in-interface-list=LAN jump-target=LANtoWAN
    
# Запоминаем внешний интерфейс
add action=mark-connection chain=SaveIngress comment="Mark it as ViaISP1" \
    in-interface=ether1_ISP1 new-connection-mark=ViaISP1 passthrough=no
add action=mark-connection chain=SaveIngress comment="Mark it as ViaISP2" \
    in-interface=ether2_ISP2 new-connection-mark=ViaISP2 passthrough=no
    
# Определяемся как выпускать пользователей в Интернет
add action=mark-connection chain=LANtoWAN comment="Mark all non-direct as ViaProxy" \
    new-connection-mark=ViaProxy passthrough=no src-address-list=!Direct
 
# Настраиваем маршрутизацию маркированных соединений
add action=mark-routing chain=MarkedInPrerouting comment="Set routing mark for ViaISP1 connections" \
    connection-mark=ViaISP1 new-routing-mark=ISP1 passthrough=no
add action=mark-routing chain=MarkedInPrerouting comment="Set routing mark for ViaISP2 connections" \
    connection-mark=ViaISP2 new-routing-mark=ISP2 passthrough=no
add action=mark-routing chain=MarkedInPrerouting comment="Set routing mark for ViaProxy connections" \
    connection-mark=ViaProxy new-routing-mark=Proxy passthrough=no
Подобная конфигурация прекрасно работает на моем прошлом месте работы, где так было подключено 3 провайдера, и у меня дома. За одним исключением - внутренние пользователи не ходят через UTM. C UTM все просто - он соединен с микротиком по паре интерфейсов, один из которых на UTM смотрит в локалку, а второй - в интернет. Адреса и маршруты везде прописаны правильно.

Эта конфигурация тестировалась в RouterOS 6.48.6 и 7.4.1. Для 7й версии RouterOS создавались таблицы маршрутизации со своими FIB (ISP1, ISP2, Proxy). В /ip route для каждой дополнительной таблицы прописывался маршрут до шлюза по умолчанию (для каждой таблицы свой) и в локальную сеть. Для 6й версии RouterOS все то же самое, только вместо таблицы маршрутизации указывается routing mark.

Теперь в чем проблема. В RouterOS 7.4.1 отлично работает внутренняя часть, т.е. пользователи ходят либо напрямую, либо через UTM, в зависимости от их роли, но все ответы на запросы снаружи уходят через маршрут по умолчанию в таблице маршрутизации main. Хотя пакеты маркируются для маршрутизации правильно. Как будто они потом просто не попадают в нужную таблицу маршрутизации и все. В RouterOS 6.48.6 все ровно наоборот: внешние соединения работают правильно - общение происходит через тот интерфейс, куда пришел первый пакет соединения, но внутренние пользователи не попадают на прокси. При том, что содержимое таблицы /ip firewall mangle одно и то же в обоих случаях. Я уже всю голову сломал, если честно, и в упор не вижу, где у меня тут проблема. Видимо глаз замылился. Нужна ваша помощь, камрады!


Ответить