
У меня есть сценарий, в котором я:
- Postfix сервер M (Хранит почту)
- Postfix Server A (пересылает почту, используя интернет-соединение IA)
- Postfix Server B (ретранслирует почту, используя интернет-соединение IB)
- Внутренний DNS-сервер (выполняет локальное разрешение имен)
Сервера M, A и B находятся в одной и той же локальной сети (LAN), а это значит, что даже если интернет-подключения IA и IB прервутся, связь между M и A и M и B не обязательно прервется, поэтому я не могу использовать для этого опцию Postfix smtp_fallback_relay.
Теперь мне нужно, чтобы сервер M отправлял данные только на тот сервер, который будет иметь подключение к Интернету на момент ретрансляции.
Как мы можем сделать это лучше всего?
Что мы пробовали
Мы с коллегой предложили два варианта (неполный список):
- Создайте скрипт для отключения ретрансляции почты из «LAN» в восприятии почтового хранилища (M), чтобы оно вернулось к своему резервному ретранслятору.
- Создайте скрипт на DNS-сервере (D) {или на хостах etc на M, что лучше, но важно DNS для M}, который изменит mail-relay.ourdomain.com так, чтобы он указывал на почтовый ретранслятор сервера A или B, имеющий доступ в Интернет с достаточно малым TTL (скажем, 5 секунд)
Оба эти варианта в большинстве случаев работают, мне интересно, почему они не работают (есть ли опасность использования одного из них)?
решение1
Проблема для обоих подходов заключается в следующем:гоночные условия, т.е. ваш интернет работал, A или B подтвердили им успешную доставку, но когда A или B попытались переслать его в интернет, соединение прервалось.
Описанный выше сценарий стал возможен благодаря тому, как работает электронная почта в Postfix.
Email from client ---> Received ---> Queued -> Sent
Postfix на сервере A отправит подтверждение M о том, что электронное письмо принято A, когда оно поставлено в очередь. Таким образом, возможно, что когда postfix попытается отправить электронное письмо в Интернет, соединение будет разорвано, и ваше электронное письмо будет поставлено в очередь, пока соединение не восстановится.
Примечание: Такое поведение ожидалось в типичном MTA. Помните, что SMTP — этохранить и пересылатьпротокол.