Почта

/
/
Настройка SRS для Exim

Настройка 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.secret
openssl rand -base64 32 | tr -d '\n' > /etc/exim/srs.secret

После, установите права на файл с ключом:

chown Debian-exim:Debian-exim /etc/exim4/srs.secret
chmod 640 /etc/exim4/srs.secret
chown 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.sh
chmod 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_fail
srs_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.secret
openssl rand -base64 32 | tr -d '\n' > /etc/exim/srs.secret

После, установите права на файл с ключом:

chown Debian-exim:Debian-exim /etc/exim4/srs.secret
chmod 640 /etc/exim4/srs.secret
chown 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}}'

Проверка заголовков

Для проверки корректной передачи заголовка в письме выполните следующие шаги:

  1. Настройте переадресацию на целевой внешний почтовый ящик с почтового ящика на вашем сервере;
  2. С другого внешнего ящика отправьте письмо на почтовый ящик на вашем сервере;
  3. В полученном на целевом ящике письме, проверьте заголовки самого письма:
    • Заголовок Return-Path должен иметь вид  <SRS0=abcd=EF=<домен_исходного_ящика>=<имя_исходного_ящика>@srs.domain.com>
    • Заголовоки spf и Received-SPF должны иметь значение pass
    • Заголовок DKIM должен иметь вид dkim=pass header.i=@<домен_исходного ящика>
    • Заголовок DMARC должен иметь вид dmarc=pass (p=NONE)

Такое письмо может быть отмечено как спам: проверьте папку Спам и/или Нежелательная почта.