У меня есть 3 интерфейса на моем основном сервере, первый используется для локальной сети, второй и третий - подключения к Интернету (каждый имеет свою собственную таблицу IP-маршрутизации):
eth0 192.168.0.1
eth1 9.9.9.9
eth2 7.7.7.7
Почтовый сервер находится на хосте 192.168.0.2 локальной сети. Iptables транслирует пакеты на 25 портов хостов 9.9.9.9 и 7.7.7.7 в 192.168.0.2:25 через правила DNAT.
Также на моем основном сервере есть специальная таблица маршрутизации T1, которая используется почтовым сервером через
ip rule add from 192.168.0.2 lookup T1
Но таблица T1 использует только один маршрут по умолчанию:
default via 7.7.7.6 dev eth2 src 7.7.7.7
Если пакет пришел от моего первого провайдера на интерфейс 9.9.9.9, когда 192.168.0.2 отправляет запрос обратно отправителю, он использует шлюз по умолчанию второго провайдера, и отправитель не может установить соединение.
Что я могу сделать? Мои eth1 и eth2 - это записи mx в DNS, и они оба должны работать.
Это ожидаемое поведение.
SMTP и пути маршрутизации - это два разных слоя в семислойном сетевом пироге. Самое близкое, что вы можете подойти к управлению маршрутами вашей почты, - это построить вторичный маршрут по умолчанию для определенных сетей, которые вы всегда хотите проходить через конкретную сетевую карту для этого конкретного порта.
Например, вы можете создать правило iptables, которое влияет только на трафик порта 25; если адрес назначения - это что-то, направьте его на шлюз по умолчанию 2. Остальное (0.0.0.0) всегда будет по умолчанию на основной шлюз по умолчанию.