SRS - sender rewrite scheme

0. для чего это нужно:
В связи с некоторым распространением SPF (sender policy framework) возникает такая проблема: администратор домена отправителя пример godaddy.com прописывает в ДНС для своего домена текстовую запись, указывая с каких ip-адресов все остальные почтовые сервера имеют право получать письмо с обратным адресом этого домена. Так же этот администратор может рекомендовать запретить принимать письма с остальных ip-адресов. Теперь предположим, что на Ваш сервер пример mail.mydomain.ru пришло письмо с обратным адресом от такого домена пример info@godaddy.com И предположим, что у Вас стоит переадресация для получателя пример noc@mydomain.ru-->vasya@yandex.ru. Тогда Ваш почтовый сервер пересылает это письмо. Итак, что видит сервер того домена на который идет переадресация: с ip-адреса Вашего сервера приходит письмо с обратым адресом info@godaddy.com. Сервер делает запрос TXT записи для домена godaddy.com и получает ответ

"v=spf1 include:spf.secureserver.net -all"
Поскольку Ваш сервер mail.mydomain.com или его ip-адрес не вклчюен в spf.secureserver.net а следующая инструкция -all запрещает прием от всех остальных ip-адресов, сервер получателя отвергает такое письмо.
сервер mxfront5.yandex.ru
MX сервер домена yandex.ru
< 220 Yandex ESMTP (NO UCE)(NO UBE) server ready
> EHLO mail.mydomain.ru
< 250-mxfront5.yandex.ru Hello mail.mydomain.ru
< 250 SIZE 10485760
> MAIL FROM:<info@godaddy.com>
< 550 rejected see http://spf.pobox.com/why.html? sender=info@godaddy.com& ip=123.134.145.156& receiver=mxfront5.yandex.ru
dig godaddy.com txt ----->
<----- "v=spf1 include:spf.secureserver.net -all"
DNS сервер домена godaddy.com
↷(2)
сервер mail.mydomain.ru
MX сервер для домена mydomain.ru
ip=123.134.145.156
forward noc@mydomain.ru-->vasya@yandex.ru
(получатель меняется с noc@mydomain.ru на vasya@yandex.ru)
< 220 mail.mydomain.ru ESMTP Sendmail 8.13.7/8.13.7
> EHLO mail.godaddy.com
< 250-mail.mydomain.ru Hello mail.godaddy.com, pleased to meet you
< 250 SIZE 10485760
> MAIL FROM:<info@godaddy.com>
< 250 2.1.0 <info@godaddy.com>... Sender ok
> RCPT TO:<noc@mydomain.ru>
< 250 2.1.5 <noc@mydomain.ru>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
> ....
< 250 2.0.0 k7H7gVn4013640 Message accepted for delivery
<---------(1)------------
mail.godaddy.com
создает письмо
from news@godaddy.com
to noc@mydomain.ru
Какой выход? поменяем адрес отправителя! пусть он теперь будет
godaddy.com=info@forward.mydomain.ru
Вы также можете прописать соответствующую SFP запись для поддомена forward.mydomain.ru например такую
forward IN TXT "v=spf1 a:mail.mydomain.ru -all"
тем самым разрешив принимать почту с обратным адресом из домена forward.mydomain.ru только от своего почтового сервера mail.mydomain.ru
можно заменить строгий запрет на прием почты с других адресов -all на менее строгий ~all
сервер mxfront5.yandex.ru
MX сервер домена yandex.ru
< 220 Yandex ESMTP (NO UCE)(NO UBE) server ready
> EHLO mail.mydomain.ru
< 250-mxfront5.yandex.ru Hello mail.mydomain.ru
< 250 SIZE 10485760
> MAIL FROM:<godaddy.com=info@forward.mydomain.ru>
< 250 2.1.0 <godaddy.com=info@forward.mydomain.ru>... Sender ok
> RCPT TO:<vasya@yandex.ru>
< 250 2.1.5 <vasya@yandex.ru>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
> ....
< 250 2.0.0 k7H7gVn4013640 Message accepted for delivery
dig forward.mydomain.ru txt ----->
<----- "v=spf1 a:mail.mydomain.ru -all"
DNS сервер домена mydomain.ru
↑(2)
сервер mail.mydomain.ru
MX сервер для домена mydomain.ru
ip=123.134.145.156
forward noc@mydomain.ru-->vasya@yandex.ru
(получатель меняется с noc@mydomain.ru на vasya@yandex.ru)
(отправитель меняется с info@godaddy.com на godaddy.com=info@forward.mydomain.ru)
< 220 mail.mydomain.ru ESMTP Sendmail 8.13.7/8.13.7
> EHLO mail.godaddy.com
< 250-mail.mydomain.ru Hello mail.godaddy.com, pleased to meet you
< 250 SIZE 10485760
> MAIL FROM:<info@godaddy.com>
< 250 2.1.0 <info@godaddy.com>... Sender ok
> RCPT TO:<noc@mydomain.ru>
< 250 2.1.5 <noc@mydomain.ru>... Recipient ok
> DATA
< 354 Enter mail, end with "." on a line by itself
> ....
< 250 2.0.0 k7H7gVn4013640 Message accepted for delivery
<---------(1)-----------
mail.godaddy.com
создает письмо
from news@godaddy.com
to noc@mydomain.ru

1. что нам понадобится

2.установка
Считаем, что Mail::SRS у нас уже установлен.
распаковываетм srs-socketmapd.0.32rc3.tar.gz
файл INSTALL очень информативен, вот краткий пересказ:
копируем :
srs-socketmapd.m4 в директрию сорцов sendmail в cf/hack/
srs-socketmapd в /etc/init.d/srs-socketmapd
srs-socketmapd.0.32rc3.pl в /usr/local/sbin/srs-socketmapd.0.32rc3.pl
делаем симлинк ln -s /usr/local/sbin/srs-socketmapd /usr/local/sbin/srs-socketmapd.0.32rc3.pl
srs-socketmapd.conf в /etc/srs-socketmapd.conf

заводим нового пользователя от когорого будет работать демон можно, конечно взять и существующего, типа nobody
редактируем /etc/srs-socketmapd.conf
убираем EXAMPLE = yes ;)
пишем секрет (я так и не понял для чего он)
для сокета я создал директорию /var/run/srs/ и сделал ее владельцем этого юзера
соответственно, опция SOCKETPATH=/var/run/srs/srs-socketmapd.sock
ALIAS=forward.mydomain.ru - это то на что меняется адрес
больше ничего не менял.

запускаем демона

/etc/init.d/srs-socketmapd start
проверяем ошибки в /var/log/messages

после успешного запуска демона редактируем конфиг sendmail:
сразу после mailer-ов добавляем строку

MAILER(smtp)dnl
MAILER(local)dnl
HACK(srs-socketmapd, local:/var/run/srs/srs-socketmapd.sock)
перестраиваем sendmail.cf и копируем его в /etc/mail, перезапускаем sendmail и вроде все

3.обработка напильником
итак, сейчас система настроена на перезапись адресов отправителей от всех доменов исключая локальные. чтобы узнать какие домены считаются локальными

# echo '$=w' | sendmail -bt
В моем случае пересылающий сервер не отвечал за мой домен mydomain.ru и поэтому переписывал всех отправителей. Меня это не устраивало. Пришлось исправить файл cf/hack/srs-socketmapd.m4
красным обозначены мои исправления (если навести мышь то будут видны пояснения)
divert(-1)

# Copyright (c) 2004 by Mark Kramer 

...
...

# SRS regex map

Kis_srs regex ^<?SRS[01][-+=].*
Kis_mydomain regex -aISMYDOMAIN mydomain.ru
Kstorage macro


ifdef(`SRS_EX_RCPT_DN', `
F{S}-o SRS_EX_RCPT_DN %[^\#]
')

MAILER_DEFINITIONS

SEnvFromSMTP

#storing
R$*             $: $(storage {FR} $@ $1 $) $1
# forward srs rewrite
R$+             $: $>ForwardSrs $1

LOCAL_RULESETS

...
...

# Forward rewrite SRS default
R$*                             $: $(is_mydomain $1 $)
R$*ISMYDOMAIN                   $@ $&{FR}
R$*                             $: $(make_srs $1 $)
')dnl
')dnl

LOCAL_RULE_0

# Do we need to reverse SRS address?

R$*                             $: $>ReverseSrs $1

примечания:
если надо исключить из преобразования несколько доменов пишем
Kis_mydomain regex -aISMYDOMAIN mydomain.ru|otherdomain.com|third.org
не забываем, что правая часть правил отделена от левой не пробелами, а табуляцией

4.To Do
Осталось неосвоенным обратное преобразование адреса.
если получатель недоступен где-то дальше, отлупы об ошибках приходят на домен forward.mydomain.ru
Было бы здорово их пересылать оригинальному отправителю
UPD Вот для этого и существует сигнатура и ключ в настройках сервера - при получении почты на домен forward.mydomain.ru проверяется сигнатура и если обратный адрес подписаный ключем сервера совпадает с сигнатурой, письмо переправляется оригинальному отправителю


V1.01 от 18.09.2006
Для комментариев:
Новое сообщение

  В начало
       Фильтр Regex sendmail
            Пример фильтра
       Зарегистрироваться
       Видео клипы
       Книга жалоб/предложенй
       Экономика просто
            Амортизация
            НДС
       spamassassin-milter
       Всякая фигня
       Конвертер юникод
       Сбор данных
       SRS в sendmail
       my soft
            lpt daemon (RUS)
            lpt daemon (ENG)
       Из LJ
            О детях
                 Основы ГВ
                 Прикорм
                 Игрушки. Родственники
                 Гардероб(1)
                 Гардероб(2)
                 Гардероб(3)