Мой exim перенаправляет всю входящую почту на сторонние smtp-реле. Они используют smtp-аутентификацию (имя пользователя/пароль).
Кажется, я могу определить только ОДНО имя пользователя/пароль в begin authenticators
разделе конфигурации Exim. Я хочу направить определенное письмо через один ретранслятор (с его собственным именем пользователя/паролем аутентификации), а другое письмо через второй ретранслятор (его имя пользователя/пароль аутентификации отличается от первого).
Вот большая часть моей конфигурации. begin routers
Домены в +local_domains
списке ретранслируются на , smtp-relay-1
а остальные ретранслируются на smtp-relay-2
.
begin routers
my_domains_relay:
debug_print = "R: my_domains_relay for $local_part@$domain"
driver = manualroute
domains = +local_domains
transport = remote_smtp_smarthost
route_list = * "<+ smtp-relay-1.example.com:465"
host_find_failed = defer
no_more
smart_host_relay:
debug_print = "R: smart_host_relay for $local_part@$domain"
driver = manualroute
transport = remote_smtp_smarthost
route_list = * "<+ smtp-relay-2.example.net:465"
host_find_failed = defer
no_more
begin transports
remote_smtp_smarthost:
debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
driver = smtp
port = 465
hosts_require_tls = *
hosts_require_auth = *
protocol = smtps
begin authenticators
login:
driver = plaintext
public_name = PLAIN
client_send = ^my-username^top-secret-password
Я хочу определить отдельные имя пользователя/пароль аутентификации в begin authenticators
разделе и назначить каждый на один маршрутизатор/транспорт. Прямо сейчас имя пользователя/пароль аутентификации является глобальным и используется для всех реле.
В документации exim говорится, что он сопоставляет public_name с объявленной аутентификацией сервером. Так что если оба моих smtp-реле объявляют как, AUTH PLAIN
то они оба используют это имя пользователя/пароль аутентификатора в конфигурации. Я надеюсь, что есть настройка, которая позволяет мне связать экземпляр аутентификатора с определенным маршрутизатором/транспортом, но я не вижу, как это сделать.
решение1
Вы можете использовать client_condition
опцию аутентификатора (см.Раздел SMTP-аутентификацияруководства).
Exim принимает максимум два аутентификатора для данного публичного имени: аутентификатор на стороне клиента и аутентификатор на стороне сервера.
Однако функциональность, которую вы ищете, уже есть в конфигурации Debian по умолчанию: загрузитеexim4-конфигурацияупакуйте и извлеките файлы (это ar
архив, содержащий два tar
архива).
Файл /etc/exim4/conf.d/auth/30_exim4-config_examples
содержит клиентские аутентификаторы, которые:
- прочитать пароль из
/etc/exim4/passwd.client
файла, так что пароль не в конфигурации Exim. Формат файла - строка на сервер в формате<servername>:<username>:<password>
, - выберите пароль в соответствии с хостом,
- хорошо протестированы, поэтому вам не придется тестировать строковые расширения Exim.
Конфигурация Debian сводится к следующему клиентскому аутентификатору:
# this returns the matching line from passwd.client and doubles all ^
PASSWDLINE=${sg{\
${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$value}fail}\
}\
{\\N[\\^]\\N}\
{^^}\
}
plain:
driver = plaintext
public_name = PLAIN
.ifndef AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS
client_send = "<; ${if !eq{$tls_out_cipher}{}\
{^${extract{1}{:}{PASSWDLINE}}\
^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}\
}fail}"
.else
client_send = "<; ^${extract{1}{:}{PASSWDLINE}}\
^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}"
.endif
решение2
В том же аутентификаторе вы можете использовать условие if для выбора набора username:password для аутентификации. Но вам нужно "условие", чтобы выбрать, какое реле будет использоваться первым.
Например, для отправки почты на адрес[email protected]будет использовать smtp-relay-1.example.com, аутентифицированный по my-username:top-secret-password, и[email protected]будет использовать smtp-relay-2.example.com, аутентифицированный по my-username2:top-secret-password2
Маршрутизаторы и транспорты будут теми же.
begin routers
my_domains_relay:
debug_print = "R: my_domains_relay for $local_part@$domain"
driver = manualroute
domains = +local_domains
transport = remote_smtp_smarthost
route_list = * "<+ smtp-relay-1.example.com:465"
host_find_failed = defer
no_more
smart_host_relay:
debug_print = "R: smart_host_relay for $local_part@$domain"
driver = manualroute
transport = remote_smtp_smarthost
route_list = * "<+ smtp-relay-2.example.net:465"
host_find_failed = defer
no_more
begin transports
remote_smtp_smarthost:
debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
driver = smtp
port = 465
hosts_require_tls = *
hosts_require_auth = *
Аутентификаторы необходимо изменить на что-то вроде этого
begin authenticators
login:
driver = plaintext
public_name = PLAIN
client_send = ^${if eq{$domain}{domain1.com}\
{my-username}\
{my-username2}}\
^${if eq{$domain}{domain1.com}\
{top-secret-password}\
{top-secret-password2}}