Настройка SRS для Exim
SRS (Sender Rewriting Scheme) используется для замены адреса отправителя, чтобы пройти верификацию по SPF. Также SRS используется для определения происхождения (локальный или удаленный почтовый сервер) писем-отбивок с ошибками и идентификации недоступных адресов в списке получателей.
Для проверки наличия поддержки на вашем Exim выполните команду:
exim -bV | grep -i srsПустой вывод укажет на отсутствие поддержки SRS.
Подготовка домена
Домен для SRS должен быть публичным и доступным для управления его DNS-записями. Рекомендуется использовать поддомен srs, например srs.domain.com - это позвозлит не смешивать репутацию доменов (основного и поддомена), а также упростит настройку.
MX-запись домена должна указывать на ваш почтовый сервер:
srs.domain.com. IN MX 10 mail.mydomain.com.TXT-запись для SPF должна авторизовать IP-адрес почтового сервера. Например, если для почтового домена mail.mydomain.com указан адрес 10.0.0.1, запись будет следующей:
srs.domain.com. IN TXT "v=spf1 ip4:10.0.0.1 -all"Сам домен для SRS должен разрешаться на этот же IP-адрес через А-запись:
srs.domain.com. IN A 10.0.0.1Настройка Exim без поддержки SRS
Установите SRS отдельной утилитой:
apt update && apt install srs yum update && yum install srsДля работы SRS необходим секретный ключ. Сгенерируйте его командой:
openssl rand -base64 32 | tr -d '\n' > /etc/exim4/srs.secretopenssl rand -base64 32 | tr -d '\n' > /etc/exim/srs.secretПосле, установите права на файл с ключом:
chown Debian-exim:Debian-exim /etc/exim4/srs.secret
chmod 640 /etc/exim4/srs.secretchown exim:exim /etc/exim/srs.secret
chmod 640 /etc/exim/srs.secretСоздайте wrapper для утилиты:
touch /usr/local/bin/srs-forward.shВ созданный файл внесите следующий код:
#!/bin/bash
SECRETFILE="/etc/exim4/srs.secret"
ALIAS="srs.domain.com"
ADDRESS="$1"
if [ -z "$ADDRESS" ] || [ "$ADDRESS" = "<>" ]; then
exit 1
fi
RESULT=$(/usr/bin/srs --secretfile="$SECRETFILE" --forward --address="$ADDRESS" --alias="$ALIAS" 2>/dev/null)
if [[ "$RESULT" =~ ^SRS[01]=.*@ ]]; then
echo -n "$RESULT" | tr -cd '[:alnum:]=@._+-'
exit 0
else
exit 1
fiУстановите права на созданный wrapper:
chmod 755 /usr/local/bin/srs-forward.sh
chown root:Debian-exim /usr/local/bin/srs-forward.shchmod 755 /usr/local/bin/srs-forward.sh
chown root:exim /usr/local/bin/srs-forward.shДалее, необходимо внести изменения в конфигурацию в файле /etc/exim4/exim4.conf.template (для RHEL-based систем путь /etc/exim/exim.conf ).
В секции begin transports в блок remote_smtp добавьте следующие строки после driver = smtp:
debug_print = "T: remote_smtp for $local_part@$domain, Return-Path: $return_path"
return_path = ${if !match_domain{$sender_address_domain}{+local_domains}{${run{/usr/local/bin/srs-forward.sh $sender_address}{$value}{$sender_address}}}{$sender_address}}Блок должен выглядеть следующим образом:
remote_smtp:
driver = smtp
debug_print = "T: remote_smtp for $local_part@$domain, Return-Path: $return_path"
return_path = ${if !match_domain{$sender_address_domain}{+local_domains}{${run{/usr/local/bin/srs-forward.sh $sender_address}{$value}{$sender_address}}}{$sender_address}}В секцию begin routers добавьте следующий блок для создания маршрутизатора для SRS до блока dnslookup:
srs_router:
driver = redirect
domains = +local_domains
local_part_prefix = SRS0 : SRS1
data = ${run{/usr/bin/srs --secretfile=/etc/exim4/srs.secret --reverse --address=$local_part@$domain}{$value}{:fail: Invalid SRS address}}
redirect_router = dnslookup
allow_failsrs_router:
driver = redirect
domains = +local_domains
local_part_prefix = SRS0 : SRS1
data = ${run{/usr/bin/srs --secretfile=/etc/exim/srs.secret --reverse --address=$local_part@$domain}{$value}{:fail: Invalid SRS address}}
redirect_router = dnslookup
allow_fail Сохраните изменения и перезагрузите Exim:
service exim4 restartНастройка Exim с поддержкой SRS
Для работы SRS необходим секретный ключ. Сгенерируйте его командой:
openssl rand -base64 32 | tr -d '\n' > /etc/exim4/srs.secretopenssl rand -base64 32 | tr -d '\n' > /etc/exim/srs.secretПосле, установите права на файл с ключом:
chown Debian-exim:Debian-exim /etc/exim4/srs.secret
chmod 640 /etc/exim4/srs.secretchown exim:exim /etc/exim/srs.secret
chmod 640 /etc/exim/srs.secretДалее, необходимо внести изменения в конфигурацию в файле /etc/exim4/exim4.conf.template (для RHEL-based систем путь /etc/exim/exim.conf )
В секцию begin routers добавьте следующий блок между директивами .include и dnslookup для создания маршрутизатора для SRS:
srs_return:
driver = redirect
senders = :
condition = ${if inbound_srs{$local_part}{${readfile{/etc/exim4/srs.secret}{}}}{yes}{no}}
data = $srs_recipient
redirect_router = dnslookup
allow_defer
no_verify srs_return:
driver = redirect
senders = :
condition = ${if inbound_srs{$local_part}{${readfile{/etc/exim/srs.secret}{}}}{yes}{no}}
data = $srs_recipient
redirect_router = dnslookup
allow_defer
no_verifyДобавьте в секцию remote_smtp после строки с директивой helo_data следующую строку:
return_path = ${if and{{def:original_domain}{!match{$return_path}{^SRS[01]=}}} \
{${srs_encode{${readfile{/etc/exim4/srs.secret}{}}}{$return_path}{srs.domain.com}}} \
{$return_path}}return_path = ${if and{{def:original_domain}{!match{$return_path}{^SRS[01]=}}} \
{${srs_encode{${readfile{/etc/exim/srs.secret}{}}}{$return_path}{srs.domain.com}}} \
{$return_path}}В строке с параметром interface укажите публичный IP-адрес сервера:
interface = ${lookup{$sender_address_domain}lsearch{/etc/exim4/domainips}{$value}{<публичный_ip-адрес_сервера>}}interface = ${lookup{$sender_address_domain}lsearch{/etc/exim/domainips}{$value}{<публичный_ip-адрес_сервера>}}В случае использования NAT, должен использоваться IP адрес, направленный на маршрутизатор с белым внешним IP адресом.
Сохраните изменения и перезагрузите Exim:
service exim4 restartПроверка работы SRS
Кодирование
Проверить кодирование можно командой:
exim -be '${srs_encode{${readfile{/etc/exim4/srs.secret}{}}}{user@example.com}{srs.domain.com}}'exim -be '${srs_encode{${readfile{/etc/exim/srs.secret}{}}}{user@example.com}{srs.domain.com}}'Проверить декодирование можно с помощью команды:
exim -be '${if inbound_srs{SRS0=xxxx=xx=example.com=user}{${readfile{/etc/exim4/srs.secret}{}}}{$srs_recipient}{failed}}'exim -be '${if inbound_srs{SRS0=xxxx=xx=example.com=user}{${readfile{/etc/exim/srs.secret}{}}}{$srs_recipient}{failed}}'Проверка заголовков
Для проверки корректной передачи заголовка в письме выполните следующие шаги:
- Настройте переадресацию на целевой внешний почтовый ящик с почтового ящика на вашем сервере;
- С другого внешнего ящика отправьте письмо на почтовый ящик на вашем сервере;
- В полученном на целевом ящике письме, проверьте заголовки самого письма:
- Заголовок
Return-Pathдолжен иметь вид<SRS0=abcd=EF=<домен_исходного_ящика>=<имя_исходного_ящика>@srs.domain.com> - Заголовоки
spfиReceived-SPFдолжны иметь значениеpass - Заголовок DKIM должен иметь вид
dkim=pass header.i=@<домен_исходного ящика> - Заголовок DMARC должен иметь вид
dmarc=pass (p=NONE)
- Заголовок
Такое письмо может быть отмечено как спам: проверьте папку Спам и/или Нежелательная почта.