Предотвращение ретрансляции Postfix на недействительные домены получателей

Вопрос или проблема

Моя архитектура выглядит следующим образом:

Различные downstream-серверы, которые генерируют электронную почту (системы выставления счетов и тикет-системы), настроены на передачу почты через сервер Postfix, который, в свою очередь, настроен на передачу почты через внешнего провайдера электронной почты.

Настройка работает, однако время от времени клиент не продлевает свои почтовые домены, и наши системы пытаются доставить почту на домен, который больше не существует. Наш поставщик почты (и правильно делает) не в восторге от того, что мы периодически отправляем почту с недействительным доменом, поэтому я пытаюсь настроить наш Postfix relay на отказ в таких сообщениях.

Я добавил следующее в конфигурацию Postfix:

postconf -n

alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
append_dot_mydomain = no
biff = no
disable_dns_lookups = no
inet_interfaces = all
inet_protocols = ipv4
lmtp_tls_mandatory_protocols = !SSLv2, !SSLv3
lmtp_tls_protocols = !SSLv2, !SSLv3
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
message_size_limit = 104857600
milter_default_action = accept
milter_protocol = 2
mua_client_restrictions = permit_sasl_authenticated, reject
mua_helo_restrictions = permit_mynetworks, reject_non_fqdn_hostname, reject_invalid_hostname, permit
mua_sender_restrictions = permit_sasl_authenticated, reject
mydestination = localhost localhost.localdomain ipaddr.is
myhostname = mx01.ipaddr.is
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 10.0.0.0/8
myorigin = mx.example.org
non_smtpd_milters = inet:127.0.0.1:12301
readme_directory = no
recipient_delimiter = +
relayhost = [shadow.mxrouting.net]:587
smtp_address_preference = ipv4
smtp_bind_address = w.x.y.z
smtp_connect_timeout = 120s
smtp_dns_support_level = enabled
smtp_host_lookup = dns
smtp_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = plain, login
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_ciphers = medium
smtp_tls_exclude_ciphers = EXPORT, LOW, MD5, aDSS, kECDHe, kECDHr, kDHd, kDHr, SEED, IDEA, RC2
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_use_tls = yes
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_milters = inet:127.0.0.1:12301
smtpd_recipient_restrictions = reject_unknown_recipient_domain,permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
smtpd_relay_restrictions = reject_unknown_recipient_domain,permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
smtpd_restriction_classes = mua_sender_restrictions, mua_client_restrictions, mua_helo_restrictions
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_sender_restrictions = reject_non_fqdn_sender,reject_unknown_sender_domain,reject_authenticated_sender_login_mismatch,reject_rhsbl_sender dbl.spamhaus.org=127.0.1.[2..99]
smtpd_tls_cert_file = /etc/certs/fullchain.pem
smtpd_tls_ciphers = medium
smtpd_tls_exclude_ciphers = EXPORT, LOW, MD5, SEED, IDEA, RC2
smtpd_tls_key_file = /etc/certs/privkey.pem
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
tlsproxy_tls_mandatory_protocols = $smtpd_tls_mandatory_protocols
tlsproxy_tls_protocols = $smtpd_tls_protocols
transport_maps = hash:/etc/postfix/transport

postconf -M

submission inet  n       -       y       -       -       smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_reject_unlisted_recipient=no -o smtpd_client_restrictions=$mua_client_restrictions -o smtpd_sender_restrictions=$mua_sender_restrictions -o smtpd_recipient_restrictions= -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
smtps      inet  n       -       y       -       -       smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_reject_unlisted_recipient=no -o smtpd_client_restrictions=$mua_client_restrictions -o smtpd_sender_restrictions=$mua_sender_restrictions -o smtpd_recipient_restrictions= -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
smtp       inet  n       -       y       -       -       smtpd
pickup     unix  n       -       y       60      1       pickup
cleanup    unix  n       -       y       -       0       cleanup
qmgr       unix  n       -       n       300     1       qmgr
tlsmgr     unix  -       -       y       1000?   1       tlsmgr
rewrite    unix  -       -       y       -       -       trivial-rewrite
bounce     unix  -       -       y       -       0       discard
defer      unix  -       -       y       -       0       discard
trace      unix  -       -       y       -       0       bounce
verify     unix  -       -       y       -       1       verify
flush      unix  n       -       y       1000?   0       flush
proxymap   unix  -       -       n       -       -       proxymap
proxywrite unix  -       -       n       -       1       proxymap
smtp       unix  -       -       y       -       -       smtp -o smtp_helo_timeout=120 -o smtp_connect_timeout=120 -o smtp_bind_address=w.x.y.z
internal   unix  -       -       y       -       -       smtp -o smtp_bind_address=w.x.y.z -o smtp_helo_name=relay-internal.exmaple.org
external   unix  -       -       y       -       -       smtp -o smtp_bind_address=w.x.y.z -o smtp_helo_name=mx.example.org
relay      unix  -       -       y       -       -       smtp -o smtp_helo_timeout=120 -o smtp_connect_timeout=120 -o smtp_bind_address=w.x.y.z
showq      unix  n       -       y       -       -       showq
error      unix  -       -       y       -       -       error
retry      unix  -       -       y       -       -       error
discard    unix  -       -       y       -       -       discard
local      unix  -       n       n       -       -       local
virtual    unix  -       n       n       -       -       virtual
lmtp       unix  -       -       y       -       -       lmtp
anvil      unix  -       -       y       -       1       anvil
scache     unix  -       -       y       -       1       scache
maildrop   unix  -       n       n       -       -       pipe flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp       unix  -       n       n       -       -       pipe flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail     unix  -       n       n       -       -       pipe flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp      unix  -       n       n       -       -       pipe flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix - n       n       -       2       pipe flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman    unix  -       n       n       -       -       pipe flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}

Однако почта на явно недействительные домены все еще доставляется:

Mar 15 15:32:38 wst5-ext-prd-anycast01 postfix/smtp[2441255]: 4D654175F29: to=<[email protected]>, relay=shadow.mxrouting.net[168.119.148.109]:587, delay=3.2, delays=0.07/0/1.7/1.4, dsn=2.0.0, status=sent (250 OK id=1ttTV7-000000000xt-1p8c)

Как я могу настроить Postfix для проведения некоторых базовых проверок на корректность перед тем, как передавать почту?

Если вы разрешаете пересылку, Postfix не пытается проверять MX для доставки.

В конечном итоге, лучший способ – с огромным отрывом – это управлять списком доставки на источнике, прежде чем он дойдет до Postfix. Ваши почтовые серверы получают плохую репутацию за повторную отправку в несуществующие почтовые ящики, нанеся гораздо больший вред вашей доставляемости, чем попытка отправить на несуществующие домены.

Вы можете вручную поддерживать черные списки получателей на сервере Postfix (вы можете сделать это с помощью существующих карт транспортировки). Вы также можете реализовать собственную логику для решения, отправлять ли электронное письмо. Это может быть в форме мильтера, но для этой задачи проще использовать делегирование политики доступа — https://www.postfix.org/SMTPD_POLICY_README.html

Ответ или решение

Предотвращение отправки Postfix на недействительные домены получателей является важной задачей для поддержания репутации вашего почтового сервера и обеспечения корректности доставки электронных сообщений. В ситуации, описанной в вопросе, вы сталкиваетесь с проблемой отправки писем на домены клиентов, которые могут исчезнуть из-за истечения срока регистрации. Это может приводить к отправке сообщений на несуществующие домены, что недопустимо с точки зрения вашего внешнего почтового провайдера. В этом контексте важно реализовать механизм, который позволит отсекать такие письма еще до их отправки.

Теория (Theory):

В Postfix существуют определенные инструменты, позволяющие ограничивать и проверять адреса получателей для недопущения отправки на недействительные или потенциально проблемные домены. Основные методы включают использование списков доступа (access control lists), настроек Milter и внешних политик доступа (Policy Access Delegation). Конфигурация основных ограничений осуществляется через соответствующие параметры в конфигурационных файлах Postfix, такие как smtpd_recipient_restrictions и smtpd_sender_restrictions.

Пример (Example):

Рассмотрим пример настройки Postfix для выполнения проверки существования домена перед отправкой письма. Одной из наиболее эффективных стратегий является реализация проверки через список доступа или интеграция с внешним сервисом, который может предоставить актуальную информацию о наличии MX-записей для домена получателя.

Вы уже применили определенные ограничения в вашей конфигурации через smtpd_recipient_restrictions:

smtpd_recipient_restrictions = reject_unknown_recipient_domain, permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination

Однако Postfix в своей стандартной конфигурации не проводит проверки действительности MX-записей для внутренних серверов, делающих исходящую почту. Для обеспечения такой проверки можно использовать механизм политики доступа.

Применение (Application):

  1. Использование механизма Policy Access Delegation: Вы можете создать скрипт на Python или другом языке, который будет проверять существование MX-записи домена получателя перед попыткой отправки. Для этого настройте Postfix на использование политики проверки через внешний скрипт.

  2. Добавление политики в Postfix: В конфигурации Postfix добавьте следующее:

    smtpd_recipient_restrictions = 
      check_policy_service unix:private/policyfilter,
      reject_unknown_recipient_domain,
      permit_mynetworks,
      permit_sasl_authenticated,
      defer_unauth_destination
  3. Создание политики проверки: Разработайте скрипт, который будет обрабатывать запросы от Postfix. Этот скрипт должен выполнять DNS-запросы для проверки существования MX-записей и возвращать соответствующие результаты.

    Пример скрипта на Python, использующего библиотеку dnspython для проверки MX-записей:

    from dns.resolver import query, NXDOMAIN, NoAnswer, Timeout
    
    def check_domain(domain):
       try:
           mx_records = query(domain, 'MX')
           return True
       except (NXDOMAIN, NoAnswer, Timeout):
           return False
    
    def main():
       import sys
       for line in sys.stdin:
           if line.startswith('recipient='):
               _, recipient = line.split('=')
               domain = recipient.split('@')[1].strip()
               if not check_domain(domain):
                   print('action=reject')
               else:
                   print('action=dunno')
           else:
               print('action=dunno')
       sys.stdout.flush()
    
    if __name__ == '__main__':
       main()
  4. Настройка на прием и обработку запросов: Настройте скрипт как демон и убедитесь, что он принимает подключения от Postfix через сокет или соответствующий IPC механизм.

  5. Мониторинг и настройка: После развертывания такого решения, отслеживайте логи Postfix и корректируйте скрипт при обнаружении ошибок или ложных срабатываний. Вы также можете настроить автоматическое обновление списка известных доменов или интегрироваться с другими аналитическими системами для более точной настройки.

Эта конфигурация позволит избежать ненужной нагрузки на внешнего почтового провайдера и минимизировать риски, связанные с рассылкой на несуществующие домены. Она также повысит общую репутацию вашего почтового сервера, что будет способствовать лучшей доставляемости электронных сообщений.<|vq_8780|>

Оцените материал
Добавить комментарий

Капча загружается...