2025-06-10

Листинг /usr/local/exim/configure (скачать)


primary_hostname

= stecs.ru

smtp_banner

= "[mx.stecs.ru]...aloha"


domainlist local_domains

= ${lookup sqlite,file=/www/db/exim/exim.sqlite \

 

 {SELECT domain FROM domain WHERE \

 

 domain='${quote_sqlite:$domain}' AND active='1'}}

domainlist relay_to_domains

= ${lookup sqlite,file=/www/db/exim/exim.sqlite \

 

 {SELECT domain FROM domain WHERE \

 

 domain='${quote_sqlite:$domain}' AND active='1'}}

domainlist dkim_required_domains

= gmail.com : yandex.ru : rambler.ru : \

 

 mail.ru : bk.ru : list.ru : inbox.ru

hostlist relay_from_hosts

= localhost : 96.47.72.84

 

 


# Добавить проверку DKIM-подписей

acl_smtp_dkim

= acl_smtp_dkim


# Это символьные ссылки на ключи в /usr/local/etc/letsencrypt/archive/stecs.ru/cert1.pem, ...

tls_certificate

= /etc/ssl/certs/stecs.ru.pem

tls_privatekey

= /etc/ssl/private/stecs.ru.pem


qualify_domain

= stecs.ru

# Если не указан домен у отправителя или адресата, дописывать значение qualify_domain

sender_unqualified_hosts

= +relay_from_hosts

recipient_unqualified_hosts

= +relay_from_hosts


exim_user

= mailnull

exim_group

= mail

never_users

= root


syslog_timestamp

= no

log_selector

= \

 

+all_parents \

 

+connection_reject \

 

+incoming_interface \

 

+lost_incoming_connection \

 

+received_sender \

 

+received_recipients \

 

+smtp_confirmation \

 

+smtp_syntax_error \

 

+smtp_protocol_error \

 

-queue_run


message_size_limit = 20M

helo_allow_chars = _


begin acl


acl_smtp_dkim:


# Отклоняем письма с неправильной DKIM-подписью

  deny

message

= Wrong DKIM signature

 

dkim_status

= fail

# Для выбранных доменов требуем наличия DKIM-подписи

  deny

message

= Valid DKIM signature needed for mail from $sender_domain

 

sender_domains

= +dkim_required_domains

 

dkim_status

= none

  accept


acl_check_rcpt:


# Accept if the source is local SMTP (i.e. not over TCP/IP). We do this by

# testing for an empty sending host field.

  accept

hosts

= :

 

control

= dkim_disable_verify

# Restricted characters in address (local_domains)

  deny

message

= Restricted characters in address

 

domains

= +local_domains

 

local_parts

= ^[.] : ^.*[@%!/|]

# Restricted characters in address (! local_domains)

  deny

message

= Restricted characters in address

 

domains

= !+local_domains

 

local_parts

= ^[./|] : ^.*[@%!] : ^.*/\\.\\./

# Restricted characters in address (root)

  deny

message

= Restricted characters in address

 

hosts

= !+relay_from_hosts

 

local_parts

= ^.*root@*

# Accept postmaster

  accept

local_parts

= postmaster

 

domains

= +local_domains


# Reject all RCPT commands after too many bad recipients

  deny

condition

= ${if and {\

 {>{$rcpt_count}{10}}\

 {<{$recipients_count}{${eval:$rcpt_count/2}}} }}

 

message

= Rejected for too many bad recipients

 

logwrite

= REJECT [$sender_host_address]: bad recipient count high

 [${eval:$rcpt_count-$recipients_count}]


# Запрещаем тех, кто не обменивается приветственными сообщениями (HELO/EHLO)

  deny

message

= "HELO/EHLO require by SMTP RFC"

 

condition

= ${if eq{$sender_helo_name}{}{yes}{no}}

# Рубаем, кто подставляет свой IP в HELO

  deny

message

= "Your IP in HELO - access denied!"

 

hosts

= * : !+relay_from_hosts

 

condition

= ${if eq{$sender_helo_name}\

 {$sender_host_address}{true}{false}}

# Рубаем тех, кто в HELO пихает мой IP

deny

condition

= ${if eq{$sender_helo_name}\

 {$interface_address}{yes}{no}}

 

hosts

= !127.0.0.1 : !localhost : *

 

message

= "Main IP in your HELO! Access denied!"

# Рубаем тех, кто в HELO пихает только цифры (не бывает хостов ТОЛЬКО из цифр)

deny

condition

= ${if match{$sender_helo_name}\

 {\N^\d+$\N}{yes}{no}}

 

hosts

= !127.0.0.1 : !localhost : *

 

message

= "Can not be only number in HELO!"

# Рубаем тех, кто не пишет отправителя (пробел)

  deny

condition

= ${if match{$sender_address}{\N^\s+$\N}{yes}{no}}

 

hosts

= !127.0.0.1 : !localhost : *

 

message

= "Sender address contains spaces?! not for RFC..."


# Задержка (это такой метод борьбы со спамом, основанный на принципе его рассылки)

# На этом рубается почти весь спам

  warn

# ставим дефолтовую задержку в 30 секунд

 

set acl_m0

= 30s

  warn

# ставим задержку в 0 секунд своим хостам

 

hosts

= +relay_from_hosts

 

set acl_m0

= 0s

  warn

# пишем в логи задержку (если оно вам надо)

 

logwrite

= Delay $acl_m0 for $sender_host_name \

 [$sender_host_address] with HELO=$sender_helo_name. Mail \

 from $sender_address to $local_part@$domain.

 

delay

= $acl_m0


# Deny unless the sender address can be verified.

  require

verify

= sender

# Accept if the message comes from one of the hosts for which we are an

# outgoing relay.

  accept

hosts

= +relay_from_hosts

 

control

= submission

 

control

= dkim_disable_verify


# Accept if the message arrived over an authenticated connection

  accept

authenticated

= *

# При control = submission exim постоянно дописывал отправителю qualify_domain

 

control

= submission/sender_retain

 

control

= dkim_disable_verify

# Проверка получателя в локальных доменах

# Если не проходит, то проверяется следующий ACL, и если не прошёл и там - deny

  accept

domains

= +local_domains

 

endpass

 

 

message

= "Unknown user (local_domains)"

 

verify

= recipient

# Проверяем получателя в релейных доменах

# Опять-таки если не проходит -> следующий ACL, и если не прошёл и там - deny

  accept

domains

= +relay_to_domains

 

endpass

 

 

message

= "Unknown user (relay_to_domains)"

 

verify

= recipient

# Рубаем тех, кто в блэк-листах

# Серваки перебираются сверху вниз, если не хост не найден на первом, то запрашивается второй, и т.д.

# Если не найден ни в одном из списков - то почта пропускается

  deny

message

= you in blacklist: $dnslist_domain \n $dnslist_text

 

dnslists

= opm.blitzed.org : \

 

 cbl.abuseat.org : \

 

 bl.csma.biz : \

 

 dynablock.njabl.org

 

#-# require

message

= relay not permitted

 

#-# domains

= +local_domains : +relay_to_domains

# Если не подошло ни одно правило - чувак явно ищет открытый релей. Пинаем с сервера

  deny

message

= "Access denied - autorization failed. Relay not permitted"