Для публикации сервисов мы запоминаем с какого внешнего интерфейса пришел первый пакет в соединении - в дальнейшем все пакеты данного соединения должны ходить через этот интерфейс. Часть внутренних пользователей, чьи адреса прописаны в списке адресов с именем "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
Эта конфигурация тестировалась в 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 одно и то же в обоих случаях. Я уже всю голову сломал, если честно, и в упор не вижу, где у меня тут проблема. Видимо глаз замылился. Нужна ваша помощь, камрады!