UDP sendto не работает при использовании определенных таблиц маршрутизации

UDP sendto не работает при использовании определенных таблиц маршрутизации

У меня есть система с несколькими интерфейсами. Я изолировал все эти интерфейсы друг от друга с помощью нескольких sysctlопций, таблиц маршрутизации и правил.

Каждый интерфейс имеет собственную таблицу маршрутизации, определяющую маршрут по умолчанию.

Каждая таблица маршрутизации имеет набор из 4 правил, которые определяют, какие пакеты должны направляться в какую таблицу.

Для упрощения предположим, что у меня есть eth0 (192.168.1.1)и eth1 (192.168.1.2).

из 192.168.1.1таблицыeth0

к 192.168.1.1столуeth0

если eth0table eth0

оиф eth0table eth0

Потому что eth2это одно и то же.

Возможны следующие варианты sysctl:

net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.arp_ignore = 2
net.ipv4.conf.all.arp_announce = 1
net.ipv4.conf.all.rp_filter = 1

Это отлично работает для 99% моих предполагаемых вариантов использования, но один из них дает сбой. Если пакет генерируется из сокета, который не привязан, например, при ответе клиенту UDP с помощью "sendto", вызов завершается с ошибкой "Network Unreachable". Если определенный IP-адрес привязан до вызова sendto, вызов завершается успешно, как и ожидалось.

Помимо настройки универсального маршрута по умолчанию для подобных ситуаций, можно ли что-то сделать, используя политику маршрутизации (например, iptables, правило ip), чтобы решить эту проблему?

Спасибо

Связанный контент