Есть несколько зон с потенциально пересекающимися ip адрессами. Нужно организовать между ними маршрутизацию.
Например на eth0 и eth1 висят две разные сети с адресами 10.1/16, нужно, чтобы в каждой сети была доступна соседняя по адрессам 10.2/16. Соственно для каждой зоны закрепляется номер, в PREROUTING трафик классифицируется: ставится метка (в первом байте зона назначения, во втором зона источник). Для каждой зоны создается отдельная таблица маршрутизации и прописываются правила (ip rule add) в зависимости от ip источника, интерфейса источника и метки соединения в какую таблицу смотреть.
Но внезапно полезли какие-то странности:
1. first routing desition впринципе в правила смотрит но почему-то не всем следует. Ему обязательно нужно правило (from all lookup main) и любой фиктивный default route, ведущий куда-то наружу, без них обратные пакеты обрываются после mangle:PREROUTING
2. Внезапно arp запросам тоже что-то нужно (зачем?) от таблиц маршрутизации: если нет правила from all lookup main они не генерируются.
3. ip route add <net> via <gw> table zone1 отказывается иногда(когда?) добавлять маршрут, даже если в ней до <gw> есть прямой. Удалось починить только добавлением фиктивного маршрута ip route add default dev lo table default
Как такое можно объяснить? Где об этом можно почитать?