Мне нужно решить немного неясную проблему, поэтому я прошу вас о помощи.
Наши пользователи разделены между двумя большими зданиями, которые находятся далеко друг от друга, поэтому мы настроили два независимых почтовых сервера, чтобы каждый сервер обслуживал почту для своего здания. Основная цель заключается в том, чтобы в случае потери связи пользователи могли отправлять почту своим коллегам в пределах своего здания, даже если внешняя почта временно недоступна. Каждое здание использует свой почтовый домен. Настройка тривиальна и работает отлично.
Для борьбы со спамом, а также в административных целях у нас есть одна и та же (полная) таблица пользователей на каждом сервере, но каждый ящик помечен как "B1" или "B2", чтобы указать, в каком здании находится данный пользователь. Мы привыкли хранить таблицы почтовых ящиков и перенаправлений в таблицах SQL, поэтому не проблема различать их, добавляя условие "WHERE which_server='B1'" в строки конфигурации exim.
Неожиданностью было дублирование почты, когда мы дошли до перенаправлений/псевдонимов. Вот пример:
Допустим, пользовательпользователь1вЗдание 1использует почтовый ящик[email protected], в то время как пользовательпользователь2вздание 2использует почтовый ящик[email protected]. Пока проблем нет, они могут отправлять друг другу почту, и внешние пользователи также могут связываться с ними по почте.
Давайте теперь представим, что мы добавляем несколько перенаправлений на каждом почтовом сервере. Скажем так:
[email protected]->[email protected],[email protected],[email protected]
Теперь, как почта от[email protected]идет к[email protected], почтовый сервер на сервере server1 сделает три копии и отправит дальше как три отдельных сообщения (два gwill отправятся на сервер b2.domain.com, одно отправится на серверы Gmail). Теперь, когда эти сообщения придут на сервер b2.domain.com, он снова выполнит перенаправление (используя собственные таблицы SQL), таким образом дублируя сообщения.
Я чувствую, что упускаю какой-то элегантный способ решения этой проблемы, так что не могли бы вы указать мне правильный путь?
Заранее спасибо!
решение1
У вас есть один мощный индикатор, который вы не используете при анализе расширения таблицы псевдонимов: пришло ли письмо из внешнего мира или из другого здания (одно или несколько имен хостов или IP-адресов). Если проблема в том, что расширение псевдонима в B1 дает сбой дублирующего типа при отправке из B2, то пропустите расширение псевдонима, если источником является B2. В ACL это будет сделано с помощью hosts = !+B2
, однако в вашем случае маршрутизаторы — это то место, где вам нужно принять это решение. Чтобы сделать это, я бы установил в ACL подключения или ACL почты:
warn hosts = +B2
set acl_c_other_building = 1
Затем в маршрутизаторе aliases можно добавить условие, что если звонок из другого здания, то возвращать false/no:
condition = ${if eq{$acl_c_other_building}{1} {no}{yes}}
При такой логике, предположительно, следующие маршрутизаторы будут обрабатывать доставку почтовых ящиков и доставлять это сообщение локально.
Если все работает так, как ожидалось, проделайте то же самое в другом здании.
решение2
Ваша главная проблема, похоже, заключается в несогласованной почтовой среде. С одной стороны, вы рассматриваете два сервера как идентичные внутренние серверы (те же правила псевдонимов), с другой стороны, они отвечают только за один домен, что заставляет их рассматривать друг друга как любой другой удаленный почтовый сервер, поэтому дублирование перенаправлений неизбежно.
Вместо того, чтобы пытаться справиться с этой распределенной настройкой на уровне маршрутизации MTA, я бы предложил вам задать обоим серверам одинаковую конфигурацию домена, что означает, что оба сервера должны рассматривать оба ваших домена как локальные и доставлять почту на локальные почтовые ящики, а затем реплицировать эти почтовые ящики между серверами, например, с помощью dovecot.мастер-мастер репликация