LINUX.ORG.RU
ФорумAdmin

Sendmail: отбрасывать письма для несуществующих удаленных аккаунтов

 


0

1

Sendmail-8.14.4, Centos 6.3

Система рассылает письма от имени sales@mydomain.ua средствами php-приложения, поле From заголовка формируется там. Получателем sales@ является мейл-сервер заказчика.

Для того, чтобы штуки с подстановкой в поле From нужного нам домена работали, прошлый админ добавил «маскарадинг конверта»:

MASQUERADE_AS(`mydomain.ua')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
MASQUERADE_DOMAIN(mydomain.ua)dnl
Иногда случается так, что адреса получателей - несуществующие. Sendmail, по истечении времени жизни письма в очереди, генерирует отлуп и шлет локальному root.

Но мой вопрос связан со случаем более веселым:

  • PHP шлет письмо от имени sales@mydomain.ua юзеру sasha@blah.ru
  • На сервере blah.ru не нашлось учётки sasha,
  • зато она нашлась на mydomain.ua и письмо получил sasha@mydomain.ua

Что делал:

  • нагуглил такой параметр как LUSER_RELAY, который, будучи установлен в '/dev/null' запрещает поиск адресата среди локальных юзеров.
    define(`LUSER_RELAY', `/dev/null')dnl
    
  • Выпилил опцию always_add_domain, которая была в дефолтном конфиге.

Не помогло.

P.S. я совсем не postmaster, поэтому в моих знаниях могут быть пробелы. Я подозреваю, что дело в поле заголовка return-path, который содержал обратный адрес. По MX-записи попали на почтовый сервер заказчика, но почему искали на нем аккаунт 'sasha' - я не понимаю.

Вопросы:

  • Как почта попала на sasha@mydomain.ua ?
  • Как мне дропать \ не отправлять почту на несуществующие ящики?
  • Как проверять хотя бы валидность домена в адресе получателя перед отправкой? Я находил штуки вроде badmx и accept_unresolvable_domains, но они, насколько я понял, работают на прием почты.

Полный конфиг sendmail здесь:

divert(-1)dnl
include(`/usr/share/sendmail-cf/m4/cf.m4')dnl
VERSIONID(`setup for linux')dnl
OSTYPE(`linux')dnl
define(`confDEF_USER_ID', ``8:12'')dnl
define(`confTO_CONNECT', `1m')dnl
define(`confTRY_NULL_MX_LIST', `True')dnl
define(`confDONT_PROBE_INTERFACES', `True')dnl
define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl
define(`ALIAS_FILE', `/etc/aliases')dnl
define(`STATUS_FILE', `/var/log/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl
define(`confAUTH_OPTIONS', `A')dnl
define(`LUSER_RELAY', `/dev/null')dnl
define(`confTO_QUEUEWARN', `5m')dnl
define(`confTO_QUEUERETURN', `5m')dnl
define(`confTO_IDENT', `0')dnl
FEATURE(`no_default_msa', `dnl')dnl
FEATURE(`smrsh', `/usr/sbin/smrsh')dnl
FEATURE(`mailertable', `hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl
FEATURE(local_procmail, `', `procmail -t -Y -a $h -d $u')dnl
FEATURE(`access_db', `hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
LOCAL_DOMAIN(`localhost.localdomain')dnl
MASQUERADE_AS(`mydomain.ua')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
MASQUERADE_DOMAIN(mydomain.ua)dnl
MAILER(smtp)dnl
MAILER(procmail)dnl



Последнее исправление: vo-one (всего исправлений: 2)

Для того, чтобы штуки с подстановкой в поле From нужного нам > домена работали, прошлый админ добавил «маскарадинг конверта»:

Лучше было не делать так, а у php mail() добавить пятым параметром -fsales@mydomain.ua

Как почта попала на sasha@mydomain.ua ?

Можно трассировку обработки посмотреть. Как-нибудь так:
sendmail -d60.1 -bv sasha@blah.ru

Как мне дропать \ не отправлять почту на несуществующие ящики?

В общем-то, это не проблема, которую надо решать: сервер получателя сам не должен принять такое письмо.

AS ★★★★★
()
Ответ на: комментарий от AS

в mail() добавить пятым параметром -fsales@mydomain.ua

В моём случае это невозможно.

sendmail -d60.1 -bv sasha@blah.ru

Спасибо, очень ценный совет и повод перечитать man :)

Сегодня я попросил у заказчика учётку на их мейл-сервере и воспроизвел ситуацию. Для воспроизведения нужно чтобы адрес из поля from (sales@mydomain.ua) существовал на мейл-сервере.

Например,

  • test@mydomain.ua - адрес, на который мы будем ловить левые письма
  • sales@mydomain.ua - адрес из поля from
# Получим в почту root отлуп "550 Unrouteable address"
echo "hello" | mail -s "NOT working" -r blah@mydomain.ua test@blablabla.ru

# Письмо получит test@mydomain.ua
echo "hello" | mail -s "Working" -r sales@mydomain.ua test@blablabla.ru

В трейсе обработки адреса видно, как на втором этапе вместо несуществующего домена подставляется mydomain.ua. Отмечу также то, что машина-отправитель имеет хостнейм php.mydomain.ua.

$ sendmail -d60.1 -bv test@blah.ru
map_lookup(dequote, vova) => NOT FOUND (0)
map_lookup(host, blah.ru) => mydomain.ua. (0)
map_lookup(mailertable, mydomain.ua) => NOT FOUND (0)
map_lookup(mailertable, .ua) => NOT FOUND (0)
map_lookup(mailertable, .) => NOT FOUND (0)
test@blah.ru... deliverable: mailer esmtp, host mydomain.ua., user test@mydomain.ua

Вопросы такие:

  • Мне не понятно, то ли замена идет на домен из хостнейма, то ли на домен отправителя?
  • Как мне запретить подставлять локальный домен вместо несуществующего? LUSER_RELAY уже стоит в /dev/null.

Заранее благодарен

vo-one
() автор топика
Ответ на: комментарий от vo-one

Пробовал закомментировать маскарадинг:

MASQUERADE_AS(`mydomain.ua')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl
MASQUERADE_DOMAIN(mydomain.ua)dnl

Накатывание дефолтного конфига ни к чему не привело. Ситуация по прежнему воспроизводится по вышеизложенному сценарию.

У меня остается только одна версия: сервер с hostname php123.mydomain.ua в случае отлупа при попытке отправить письмо получателю username@tralala.ru попытается отправить его username@mydomain.ua.

Как этому противостоять?

vo-one
() автор топика
Ответ на: комментарий от mky

Вы после правки sendmail.mc запускаете m4, чтобы получить новый sendmail.cf?

Да, естественно.

maillog:

Jan  4 01:06:24 php123 sendmail[11864]: r03N6OI9011864: from=<sales@mydomain.ua>, size=463, class=0, nrcpts=1, msgid=<50e60ef0.5v+e4aHi7lNO4ykJ%sales@mydomain.ua>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
Jan  4 01:06:24 php123 sendmail[11862]: r03N6Oen011862: to=test@blablabla.ru, ctladdr=sales@mydomain.ua (0/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30310, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (r03N6OI9011864 Message accepted for delivery)
Jan  4 01:06:26 php123 sendmail[11866]: r03N6OI9011864: to=<test@blablabla.ru>, delay=00:00:02, xdelay=00:00:02, mailer=esmtp, pri=120463, relay=mx1.spaceweb.ru. [yy.yy.yy.yy], dsn=5.1.1, stat=User unknown
Jan  4 01:06:28 php123 sendmail[11866]: r03N6OI9011864: r03N6SI9011866: DSN: User unknown
Jan  4 01:06:28 php123 sendmail[11866]: STARTTLS=client, relay=mail.mydomain.ua., version=TLSv1/SSLv3, verify=FAIL, cipher=AES256-SHA, bits=256/256
Jan  4 01:06:29 php123 sendmail[11866]: r03N6SI9011866: to=<sales@mydomain.ua>, delay=00:00:01, xdelay=00:00:01, mailer=esmtp, pri=31675, relay=mail.mydomain.ua. [xxx.xxx.xxx.xxx], dsn=2.0.0, stat=Sent (OK id=1Tqtro-0004JB-Ri)

Отлуп в почту root приходит только в том случае, если учетка не найдена на mail.mydomain.ua

vo-one
() автор топика
Ответ на: комментарий от vo-one

mail -s «Working» -r sales@mydomain.ua test@blablabla.ru

Вопрос немного не в тему. А что это за mail ? -r задаёт envelope from ? Что-то у mail из mailx 8.1.2 такого параметра нет, а у mail из mailutils этот параметр синоним --read.

Что касается лога. По r03N6Oen011862 одна строка, по ней ничего сказать нельзя. r03N6OI9011864 обработано правильно, на сколько видно. Боунс пошёл на sales@mydomain.ua, который был в mail from: from=<sales@mydomain.ua>

echo «hello» | mail -s «Working» -r sales@mydomain.ua test@blablabla.ru

Можно посмотреть лог, соответствующий вот этой отправке ? Вообще, я маскарадинг не использовал сам никогда, надо стенд делать.

AS ★★★★★
()
Ответ на: комментарий от vo-one

Возможно, косяк в настройках DNS, если на запросы отвечает ваш сервер и у вас там есть «*». Попробуйте:

sendmail -d8.8 -d60.1 -v -bv test@blah.ru

mky ★★★★★
()
Ответ на: комментарий от AS

А что это за mail ? -r задаёт envelope from ? Что-то у mail из mailx 8.1.2 такого параметра нет

mailx-12.4-6.el6.x86_64

 -r address
              Sets the From address. Overrides any from variable specified in environment or startup files.  Tilde escapes are disabled.  The -r address options are passed to the mail transfer agent unless SMTP is
              used.  This option exists for compatibility only; it is recommended to set the from variable directly instead.

Можно посмотреть лог, соответствующий вот этой отправке ?

Итак, имеем конфиг без маскарадинга. Отличие от дефолтного:

+define(`LUSER_RELAY', `/dev/null')dnl
+define(`confTO_QUEUEWARN', `5m')dnl
+define(`confTO_QUEUERETURN', `5m')dnl

-FEATURE(always_add_domain)dnl
-FEATURE(`accept_unresolvable_domains')dnl

Можно посмотреть лог, соответствующий вот этой отправке ?
echo «hello» | mail -s «Working» -r sales@mydomain.ua test@blablabla.ru

Jan  9 09:30:22 rz10 sendmail[20241]: r097UMxk020241: from=sales@mydomain.ua, size=310, class=0, nrcpts=1, msgid=<50ed1c8e.+dTR8ViF7H7XyTWX%sales@mydomain.ua>, relay=root@localhost
Jan  9 09:30:22 rz10 sendmail[20264]: r097UMDL020264: from=<sales@mydomain.ua>, size=463, class=0, nrcpts=1, msgid=<50ed1c8e.+dTR8ViF7H7XyTWX%sales@mydomain.ua>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
Jan  9 09:30:22 rz10 sendmail[20241]: r097UMxk020241: to=test@blablabla.ru, ctladdr=sales@mydomain.ua (0/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30310, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (r097UMDL020264 Message accepted for delivery)
Jan  9 09:30:23 rz10 sendmail[20268]: STARTTLS=client, relay=mx1.spaceweb.ru., version=TLSv1/SSLv3, verify=FAIL, cipher=DHE-RSA-AES256-SHA, bits=256/256
Jan  9 09:30:24 rz10 sendmail[20268]: r097UMDL020264: to=<test@blablabla.ru>, delay=00:00:02, xdelay=00:00:02, mailer=esmtp, pri=120463, relay=mx1.spaceweb.ru. [xx.xx.xx.xx], dsn=5.1.1, stat=User unknown
Jan  9 09:30:30 rz10 sendmail[20268]: STARTTLS=client, relay=mx2.spaceweb.ru., field=cn_issuer, status=failed to extract CN
Jan  9 09:30:30 rz10 sendmail[20268]: STARTTLS=client, relay=mx2.spaceweb.ru., version=TLSv1/SSLv3, verify=FAIL, cipher=DHE-RSA-AES256-SHA, bits=256/256
Jan  9 09:30:30 rz10 sendmail[20268]: r097UMDL020264: r097UUDL020268: DSN: User unknown
Jan  9 09:30:30 rz10 sendmail[20268]: STARTTLS=client, relay=mail.mydomain.ua., version=TLSv1/SSLv3, verify=FAIL, cipher=AES256-SHA, bits=256/256
Jan  9 09:30:31 rz10 sendmail[20268]: r097UUDL020268: to=<sales@mydomain.ua>, delay=00:00:01, xdelay=00:00:01, mailer=esmtp, pri=31675, relay=mail.mydomain.ua. [yy.yy.yy.yy], dsn=2.0.0, stat=Sent (OK id=1Tsq7L-0003fq-5p)

Возможно, косяк в настройках DNS, если на запросы отвечает ваш сервер и у вас там есть «*».

Да, wildcard у нас есть, насколько он необходим - пока сказать не могу. Вряд ли мне позволят его убрать.

sendmail -d8.8 -d60.1 -v -bv test@blah.ru

$ sendmail -d8.8 -d60.1 -v -bv test@blablabla.ru
map_lookup(dequote, vova) => NOT FOUND (0)
map_lookup(host, blablabla.ru) => dns_getcanonname(blablabla.ru, trymx=1)
dns_getcanonname: trying blablabla.ru. (AAAA)
        NO: errno=0, h_errno=4
dns_getcanonname: trying blablabla.ru. (A)
        YES
dns_getcanonname: blablabla.ru
blablabla.ru. (0)
map_lookup(mailertable, blablabla.ru) => NOT FOUND (0)
map_lookup(mailertable, .ru) => NOT FOUND (0)
map_lookup(mailertable, .) => NOT FOUND (0)
test@blablabla.ru... deliverable: mailer esmtp, host blablabla.ru., user test@blablabla.ru

Боунс пошёл на sales@mydomain.ua, который был в mail from: from=<sales@mydomain.ua>

Где я могу почитать об этом процессе? Может быть есть какое-нибудь «энциклопедическое чтиво», по прочтению которого я перестану задавать глупые вопросы? :)

P.S. Огромное спасибо всем неравнодушным за содействие!

vo-one
() автор топика
Ответ на: комментарий от vo-one

Jan 9 09:30:31 rz10 sendmail[20268]: r097UUDL020268: to=<sales@mydomain.ua>, delay=00:00:01, xdelay=00:00:01,
mailer=esmtp, pri=31675, relay=mail.mydomain.ua. [yy.yy.yy.yy], dsn=2.0.0, stat=Sent (OK id=1Tsq7L-0003fq-5p)

Судя по этому, всё правильно: ушло на sales@mydomain.ua. А если попало, в итоге, на test@mydomain.ua, надо смотреть, что происходит тут: relay=mail.mydomain.ua.

Где я могу почитать об этом процессе? Может быть есть какое-нибудь «энциклопедическое чтиво»

Даже не знаю, я этот процесс ещё в прошлом веке изучал... RFC 2821, RFC 1123 раздел 5. Книжки уж и не помню.

AS ★★★★★
()
Ответ на: комментарий от AS

Проблема в DNS. Причем очень странная.

Сервер с хостнеймом php123.mydomain.ua Берем несуществующий домен blah.ru,

$ nslookup blah.ru
Server:         8.8.8.8
Address:        8.8.8.8#53

** server can't find blah.ru: SERVFAIL

В /etc/hosts дефолтное содержимое

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

В /etc/resolv.conf вполне адекватные NS-сервера провайдера.

А теперь самое интересное: ping blah.ru

$ ping blah.ru
--- полуминутная тишина, затем ---

PING mydomain.ua (xx.xx.xx.xx) 56(84) bytes of data.
64 bytes from mydomain.ua (xx.xx.xx.xx): icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from mydomain.ua (xx.xx.xx.xx): icmp_seq=2 ttl=64 time=0.031 ms
64 bytes from mydomain.ua (xx.xx.xx.xx): icmp_seq=3 ttl=64 time=0.031 ms
64 bytes from mydomain.ua (xx.xx.xx.xx): icmp_seq=4 ttl=64 time=0.030 ms
Такое ощущение, что начав искать blah.ru мы в итоге попадаем на blah.ru.mydomain.ua, далее по wildcard попадаем на ip mydomain.ua.

Если убрать из hostname суффикс .mydomain.ua - сразу все становиться на свои места - и почта, и пинг.

Воспроизводиться на нескольких серверах с хостнеймами xxx.mydomain.ua под управлением Centos 6.3, Centos 6.4.

Это нормальное поведение ОС?

vo-one
() автор топика
Ответ на: комментарий от vo-one

$ ping blah.ru
--- полуминутная тишина, затем ---

PING mydomain.ua (xx.xx.xx.xx) 56(84) bytes of data.
64 bytes from mydomain.ua (xx.xx.xx.xx): icmp_seq=1 ttl=64 time=0.039 ms

Вот с этим точно надо разбираться.

Это нормальное поведение ОС?

Для Sendmail - да, если резолвер где-то подменяет домен. Аналогично, кстати, было бы при использовании CNAME.

В RFC 2821 есть такая фраза:

The names are expected to be fully-qualified domain names (FQDNs): mechanisms for inferring FQDNs from partial names or local aliases are outside of this specification and, due to a history of problems, are generally discouraged.

Возможно, ноги проблемы где-то рядом: тут тоже видна проблема с определением FQDN.

AS ★★★★★
()
Ответ на: комментарий от vo-one

Проблема не в DNS, проблема из-за непонимания работы resolver. Правильный ман в данном случае - http://www.kernel.org/doc/man-pages/online/pages/man5/resolver.5.html

При отсутсвии search и domain в /etc/resolv.conf используется все после первой точки. В более старой версии перебираются все варианты от верхнего уровня, системным вызовом getdomainname(). В этом случае вообще плохо, ибо большая вероятност, что если домен blah.mydomain.ua не существует (в описаном случае кстати он есть), то blah.ua может существовать.

В любом случае, чтобы оградить себя от поиска по коренным зонам можно указать явно search или domain. search local будет достаточно, если вы хотите исключить возможность проверки наличие домена в той же зоне.

Но уверен должна присутсвовать более жесткая настройка в параметрах почты, дабы избежать такой проблемы с письмами. Аналогично с search, скорее всего вместо автоматического подставления имен нужно воспользоваться явно заданым списком. Но тут я не могу подсказать. Самому интерестно как отградиться от такого в конфиге sendmail и воспроизводится ли такое для postfix.

З.Ы. Чтобы не делать ping или не использовать системные вызовы используйте для проверки настроек:

resolveip blah.ru

pioneerit
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.