Я следовал вики по адресу , чтобы настроить балансировку нагрузки между двумя интернет-соединениями. Из-за ipsec-туннеля я добавил следующее:
`/ip firewall mangle add chain=prerouting dst-address=172.29.5.0/24 action=accept
/ip firewall mangle add chain=prerouting dst-address=1.2.3.0/24 action=mark-connection new-connection-mark=ISP1_conn
/ip firewall mangle add chain=output dst-address=1.2.3.0/24 action=mark-connection new-connection-mark=ISP1_conn` (1.2.3.0/24 — это подсеть, включающая удалённый пир ipsec 1.2.3.4. 172.29.5.0/24 — это удалённая локальная подсеть ipsec). Я подозревал, что это не работает (ipsec был нестабильным), поэтому провёл некоторые тесты. Я удалил два маршрута до 0.0.0.0/0 без routing-mark и добавил следующее:
`/ip firewall filter add action=log chain=output disabled=no dst-address=1.2.3.0/24 log-prefix="ipsec out:" routing-mark=to_ISP1
/ip firewall filter add action=log chain=forward disabled=no dst-address=1.2.3.0/24 log-prefix="ipsec fwd:" routing-mark=to_ISP1`. Теперь, когда я пингую 1.2.3.3 или 1.2.3.4 (или пытаюсь установить ipsec с моей локальной стороны до 1.2.3.4), я часто вижу в логах, что пакеты будут использовать ISP2 в качестве исходящего интерфейса, с адресом источника ISP1! Я думаю, это объясняет, почему ipsec так нестабилен. (Дальнейшее логирование показывает, что ipsec-пакеты выходят через интерфейс IPS2, а возвращающиеся пакеты приходят через интерфейс ISP1). И сам факт, что что-то появляется в логах вообще, доказывает, что routing-mark правильный. Затем я запустил следующие команды:
`/ip route
add dst-address=0.0.0.0/0 gateway=10.111.0.1 distance=5 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.112.0.1 distance=2 check-gateway=ping`. По моему пониманию работы routing-mark, эти два правила не должны оказывать никакого влияния, поскольку есть другие правила маршрутизации с меньшим расстоянием, которые соответствуют routing-mark. Но они оказывают влияние. После ввода этих двух команд пакеты к ipsec-пиру отправляются через интерфейс ISP2 100% времени, за исключением момента установления туннеля. (По какой-то причине туннель устанавливается. Но все последующие пакеты отправляются через неправильный интерфейс). И пинги всегда отправляются через неправильный интерфейс. Но если добавить маршрут `add dst-address=1.2.3.0/24 gateway=10.111.0.1 distance=1 check-gateway=ping`, всё работает хорошо с ipsec. Но всё же большинство пакетов в интернет используют ISP2. Итак, мой вопрос. Я делаю что-то совершенно не так, или routing-mark часто игнорируется в таблице маршрутизации? Реальная настройка, где я столкнулся с проблемой, была на RB450G с ROS4.11. Проблема воспроизводится на RB751G с ROS 5.11, который я использовал для всех тестов/отладки. Чтобы убедиться, что я не ошибся при переводе адресов в командах из вики, я настроил полную тестовую среду, используя точно те же адреса, что и в вики, используя два других rb751g в качестве ISP* маршрутизаторов, и даже два других, чтобы создать «интернет» с удалённым ipsec-пиром.
`/ip firewall mangle add chain=prerouting dst-address=172.29.5.0/24 action=accept
/ip firewall mangle add chain=prerouting dst-address=1.2.3.0/24 action=mark-connection new-connection-mark=ISP1_conn
/ip firewall mangle add chain=output dst-address=1.2.3.0/24 action=mark-connection new-connection-mark=ISP1_conn` (1.2.3.0/24 — это подсеть, включающая удалённый пир ipsec 1.2.3.4. 172.29.5.0/24 — это удалённая локальная подсеть ipsec). Я подозревал, что это не работает (ipsec был нестабильным), поэтому провёл некоторые тесты. Я удалил два маршрута до 0.0.0.0/0 без routing-mark и добавил следующее:
`/ip firewall filter add action=log chain=output disabled=no dst-address=1.2.3.0/24 log-prefix="ipsec out:" routing-mark=to_ISP1
/ip firewall filter add action=log chain=forward disabled=no dst-address=1.2.3.0/24 log-prefix="ipsec fwd:" routing-mark=to_ISP1`. Теперь, когда я пингую 1.2.3.3 или 1.2.3.4 (или пытаюсь установить ipsec с моей локальной стороны до 1.2.3.4), я часто вижу в логах, что пакеты будут использовать ISP2 в качестве исходящего интерфейса, с адресом источника ISP1! Я думаю, это объясняет, почему ipsec так нестабилен. (Дальнейшее логирование показывает, что ipsec-пакеты выходят через интерфейс IPS2, а возвращающиеся пакеты приходят через интерфейс ISP1). И сам факт, что что-то появляется в логах вообще, доказывает, что routing-mark правильный. Затем я запустил следующие команды:
`/ip route
add dst-address=0.0.0.0/0 gateway=10.111.0.1 distance=5 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.112.0.1 distance=2 check-gateway=ping`. По моему пониманию работы routing-mark, эти два правила не должны оказывать никакого влияния, поскольку есть другие правила маршрутизации с меньшим расстоянием, которые соответствуют routing-mark. Но они оказывают влияние. После ввода этих двух команд пакеты к ipsec-пиру отправляются через интерфейс ISP2 100% времени, за исключением момента установления туннеля. (По какой-то причине туннель устанавливается. Но все последующие пакеты отправляются через неправильный интерфейс). И пинги всегда отправляются через неправильный интерфейс. Но если добавить маршрут `add dst-address=1.2.3.0/24 gateway=10.111.0.1 distance=1 check-gateway=ping`, всё работает хорошо с ipsec. Но всё же большинство пакетов в интернет используют ISP2. Итак, мой вопрос. Я делаю что-то совершенно не так, или routing-mark часто игнорируется в таблице маршрутизации? Реальная настройка, где я столкнулся с проблемой, была на RB450G с ROS4.11. Проблема воспроизводится на RB751G с ROS 5.11, который я использовал для всех тестов/отладки. Чтобы убедиться, что я не ошибся при переводе адресов в командах из вики, я настроил полную тестовую среду, используя точно те же адреса, что и в вики, используя два других rb751g в качестве ISP* маршрутизаторов, и даже два других, чтобы создать «интернет» с удалённым ipsec-пиром.
