exim4 conf

Exim configuration file


# Имя хоста. Используется в EHLO.
primary_hostname = wow.test.com

#   Доменная зона, куда будут приходить письма
domainlist local_domains = test.com : localhost

# Список хостов с которых разрешён неавторизованый релей.
hostlist relay_from_hosts = 127.0.0.1 : localhost

# Список локальных подсетей.			
hostlist local_area = 192.168.0.0/24 : 192.168.17.0/24

# Эта опция задаёт хосты для которых резервируются SMTP-соединения.
# Имеет смысл включать при большой нагрузке на сервер.
##smtp_reserve_hosts =  local_area

# ACL
acl_smtp_auth = acl_check_auth
acl_smtp_helo = acl_check_helo
acl_smtp_connect = acl_check_connect
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
acl_smtp_mime = acl_check_mime

# Подключение к spamassasin
##spamd_address = 127.0.0.1 783

# Чтобы быстрее работало подключаемся через сокет:
spamd_address = /var/run/spamassassin/spamd.sock

# TLS
tls_advertise_hosts = +local_area
tls_certificate = /etc/pki/tls/certs/wow.test.com.pem 
tls_privatekey = /etc/pki/tls/private/wow.test.com.pem
tls_on_connect_ports = 465 
tls_require_ciphers = AES : MD5
gnutls_require_mac = SHA_512
tls_verify_certificates = *

# Server
# Дефолтовые порты
daemon_smtp_ports = 25 : 465

# Число повторов при неудачном запуске
daemon_startup_retries = 5

# Время ожидания между повторными запускам
daemon_startup_sleep = 30s

# Cписок ip адресов и портов через двоеточие, откуда exim будет принимать
# почту. Только эти адреса считаются локальными при маршрутизации и
# проверке зацикливания почты
local_interfaces = 127.0.0.1 : 192.168.0.2

# Имя домена добавляемое для локальных отправителей (реальных юзеров системы) т.е. Почта 
# отправляемая от root, будет от root@домен_указанный_здесь.
qualify_domain = test.com

# Имя хоста для ситуации, обратной предыдущей, - это имя домена добавляемое
# к почте для системных юзеров, ну и вообще для почты пришедшей на адрес 
# типа root.
qualify_recipient = test.com

# Не принимать почту, когда вместо доменного адреса указывается адрес IP
allow_domain_literals = false

# Exim отказывается от root привилегий при запуске процесса доставки,
# и повсюду работает как пользователь exim. Это строго ограничивает
# возможные виды локальной доставки, но жизнеспособно лишь в
# определённых типах конфигурации, например при даставке по протоколу lmtp
#  через сетевую подсистему (см. transport_dbmail).
# Имеет смысл включать при доставке по tcp/ip.
###deliver_drop_privilege = true

# Указываю пользователя и группу от которых будет работать exim
exim_user = exim
exim_group = exim

# Запрет работы доставки под пользователями root, daemon, bin, sync, adm
# в целях безопасности
never_users = root : daemon : bin : sync : adm

# Проверка соответствие прямой и обратной зон для всех хостов.
host_lookup = *

# Требовать авторизацию через безопасное SSL соединение 
auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}

# Если эта опция установленна, обработка очереди останавливается, 
# когда средняя загрузка системы больше значения этой опции.
# Т. е. при превышении указанного значения load avarege, останавливается
# обработка почтовых сообщений в очереди
deliver_queue_load_max = 10

# LOGING
log_selector = \
			+all_parents \
			+connection_reject \
			+lost_incoming_connection \
			 +received_sender \
			 +received_recipients \
			 +smtp_confirmation \
			 +smtp_syntax_error \
 			+smtp_protocol_error \
			-queue_run

# Убираю проверку identd на клиентской стороне.
rfc1413_query_timeout = 0s

# Если сообщение не было доставлено, то создаётся сообщение об ошибке. 
# Если сообщение об ошибке не удалось доставить то оно замораживается 
# на указанный в этом пункте срок, после чего снова осуществляется попытка доставить его.
ignore_bounce_errors_after = 2d

# Замороженные сообщения, находящиеся в очереди, дольше указанного
# времени удаляются и создаётся сообщение об ошибке (при условии, 
# что это не было недоставленное сообщение об ошибке )
timeout_frozen_after = 7d

# Список адресов, разделённых через запятой, на которые засылаются письма
# о замороженных сообщениях
freeze_tell = support@test.com

# Через какое время повторять попытку доставки замороженного сообщения
auto_thaw = 4h

# Ограничение размера сообщения
message_size_limit = 12M

# Если число получателей (RCPT) превышает это число, то на все 
# последующие команды RCPT возвращается код возврата 452, 
# но все ранние получатели обрабатываются нормально
recipients_max = 24

# Полностью отвергать SMTP соединение со слишком большим числом
# получателей - коды 552, 554
recipients_max_reject = true

# Максимальное число одновременных подключений по SMTP. 
smtp_accept_max = 24

# Максимальное число сообщений принимаемое за одно соединение
# от удалённого сервера (или пользователя)
smtp_accept_max_per_connection = 96

# Максимальное число подключений с одного хоста
smtp_accept_max_per_host = 8

# Если у сообщения много адресатов на удалённых хостах, то запускается
# до указанного числа максимально число параллельных процессов доставки
remote_max_parallel = 12

# Если средняя загрузка системы становиться выше чем тут указано, входящие 
# SMTP-соединения принимаются только от тех хостов, которые совпадают с 
# указанным в “smtp_reserve_hosts”
##smtp_load_reserve = 8

# Приветствие
smtp_banner = «Post Server»

accept_8bitmime = true

# Подключение к базе данных
# [hide mysql_servers = имя-сервера/имя-БД/имя пользователя/пароль],
# (PgSQL для получения данных маршрутизации)  Или чтобы работать через
# сокет:
hide pgsql_servers = (/var/run/postgresql/.s.PGSQL.5432)/dovecot/pig/wes
##hide pgsql_servers = localhost/dovecot/pig/wes

# Отключение поддержки IPv6
disable_ipv6 = true

# Принудительная синхронизация. Если отправитель торопится подавать
# команды, не дождавшись ответа, то он посылается далеко и надолго
smtp_enforce_sync = false

# Убрать собственную временную метку exim`a из логов, её ставит
# сам syslogd
syslog_timestamp = no

######################################################################
# ACL CONFIGURATION #
# Specifies access control lists for incoming SMTP mail #
######################################################################
begin acl

# В acl_check_auth проверяется тип аутентификации. Разрешаю все типы
# аутентификации при использовании TLS и только CRAM аутентификации
# без TLS.
acl_check_auth:

	accept encrypted = +local_domains
	accept condition = ${if eq{${uc:$smtp_command_argument}}{CRAM-MD5}}

deny


# Проверка правильности поля HELO
acl_check_helo:

# Белый список для кривоватых отправителей до нас: 
accept hosts = wildlsearch;/etc/exim/custom/white_list

# Спам лист для отъявленных:
deny condition = ${lookup {$sender_helo_name}wildlsearch{/etc/exim/custom/block_list}{yes}{no}}
	delay             = 30s
	log_message = REJECT: a block list pessenger

# Запрет тех, кто не обменивается приветственными сообщениями (HELO/EHLO)
deny condition = ${if eq{$sender_helo_name}{}{yes}{no}} 
         hosts             = *
         message        = Nice boys say HELO first 
         log_message = REJECT: HELO/EHLO require by SMTP RFC
	
# Запрет тех, кто подставляет свой IP в HELO
deny condition = ${if eq{$sender_helo_name}{$sender_host_address}{yes}{no}} 
       hosts             = * 
       delay             = 30s
       log_message = REJECT: HELO/EHLO require by SMTP RFC

deny condition = ${if eq{$sender_helo_name}{$interface_address}{yes}{no}} 
       hosts             = !127.0.0.1 : !localhost : !192.168.0.2 : * 
       delay             = 30s 
       log_message = REJECT: HELO/EHLO require by SMTP RFC

deny condition = ${if match{$sender_helo_name}{^[0-9]\.[0-9]\.[0-9]\.[0-9]}{yes}{no}}
         delay             = 30s
         log_message = REJECT: HELO/EHLO require by SMTP RFC

# Запрет HELO с нашим именем
deny condition = ${if match_domain{$sender_helo_name} \
			{$primary_hostname : +local_domains }{true}{false}}
       delay          = 30s 
       log_message = REJECT: HELO с нашим именем

accept


# Проверка для начала SMTP соединения
acl_check_connect:

# Белый список для кривоватых отправителей до нас: 
accept hosts = wildlsearch;/etc/exim/custom/white_list

# Спам лист для отъявленных:
drop hosts               = wildlsearch;/etc/exim/custom/block_list
	message        = Sram blocking!
	log_message = REJECT : Host in Black list

# Запрет пользователей с хостами, подпадающими
# под список ip-адресов /etc/exim/custom/net_block
drop hosts               = net-iplsearch;/etc/exim/custom/net_block
	message        = This ip-address in our blacklist
	log_message = REJECT : Net in black list

accept


# Этот список доступа описывает проверки, осуществляемые при вызове любой RCPT команды
acl_check_rcpt:

# Принимать сообщения которые пришли с локалхоста, не по TCP/IP
accept  hosts = :
	control = dkim_disable_verify

# Проверка на недопустимые символы для локальных получателей:
deny    message       = Restricted characters in address 
           domains       = +local_domains 
           local_parts   = ^[.] : ^.*[@%!/\]

# Проверка на недопустимые символы для нелокальных получателей
deny    message       = Restricted characters in address 
           domains       = ! +local_domains 
           local_parts   = ^[./\] : ^.*[@%!] : ^.*/\\.\\./

# Не принимать почту для постмастеров 
deny  local_parts   = postmaster 

# Проверка отправителя (присутствует ли в списке пользователей локального домена)
require verify             = sender 
        require message = Sender did not verify

# Проверка аутентификации
accept  authenticated = * 
          control = submission 
          control = dkim_disable_verify

# Проверка наличия получателя в локальных доменах
accept  domains= +local_domains
   	  require verify = recipient
	  message          = Recipient did not verify

# Запрет хостов типа *adsl*; *dialup*; *pool*;.... Ведь нормальные люди с таких не пишут.
deny condition = ${if match{$sender_host_name}{adsl|dsl|dialup|pool|peer|dhcp} {yes}{no}} 
       message        = Your host is not pleasant to Chuck Norris
       log_message = REJECT : Bad type host

# Задержка. Это такой метод борьбы со спамом, основанный на принципе его
# рассылки. Считается, на этом задерживается почти весь спам.
warn
	# Ставим дефолтовую задержку в 20 секунд
	set acl_m0 = 20s

	# Ставим задержку в 0 секунд своим хостам и дружественным сетям
	hosts = local_area
	set acl_m0 = 0s

warn  condition = ${if and {{! match{$sender_host_name} \
			{\N.+.outblaze.com$\N}} \
			{eq{$acl_c0}{outblaze_helo}}}{yes}{no}}
          set acl_m0 = 99s

warn  condition = ${if and {{! match{$sender_host_name} \
			{\N.+.outblaze.com$\N}} \
			{eq{$acl_c2}{outblaze_domain}}}{yes}{no}}
	 set acl_m0 = 99s

 # Пропускаем остальное
accept 


# Проверка тела письма
acl_check_data:

# Защита от спама с помощью SpamAssassin.
# Bypass SpamAssassin checks if the message is too large (100 кБ). 
accept  condition  = ${if >={$message_size}{100000} {1}} 
         add_header = X-Spam-Note: SpamAssassin run bypassed due to message size

# Run SpamAssassin, but allow for it to fail or time out. Add a warning message 
# and accept the mail if that happens. Add an X-Spam-Flag: header if the SA 
# score exceeds the SA system threshold. 
warn    spam       = nobody/defer_ok 
        add_header = X-Spam-Flag: YES 

accept  condition  = ${if !def:spam_score_int {1}} 
        add_header   = X-Spam-Note: SpamAssassin invocation failed 

# Unconditionally add score and report headers 
warn    add_header = X-Spam-Score: $spam_score ($spam_bar)\n\ 
                      X-Spam-Report: $spam_report 

# And reject if the SpamAssassin score is greater than ten 
deny    condition = ${if >{$spam_score_int}{120} {1}} 
          message  = Your message scored $spam_score SpamAssassin point. \n\ 
                      Report follows: $spam_report

# Проверка содержимого писем.
deny   condition = ${if >{$demime_errorlevel}{2}{1}{0}} 
	message        = This message contains a MIME error ($demime_reason) 
	log_message = REJECT : Error in MIME 
	demime         = *

deny   message = Possible Microsoft attack ($found_extension)
 	 log_message     = REJECT : Bad attachment
 	 demime = mad : maf : mag : mam : maq : mar : mas : mat : mav : maw \
		: xnk : wsc : wsf : wsh : vbs : vbe : sct : scf : ins : hta : cnf : chm \
		: reg : js : com : cmd : scr : vbs : bat : lnk : pif : dll : cpl

deny   condition       = ${if >{$body_zerocount}{0}{1}{0}}
 	 log_message     = REJECT : NUL characters!
 	 message         = This message contains NUL characters

deny   message         = Incorrect headers syntax
 	 log_message     = REJECT : Incorrect header syntax
 	 !verify         = header_syntax

# Пропускаем остальное
accept


acl_check_mime:

# Декодирование mime сообщений. Полезно для дальнейшей проверки
# на вирусы
warn decode = default

# Можно очень быстро отсеять сообщения, просто запретив некоторые 
# mime вложения, чаще всего содержащие вирусы, хотя, конечно, это не панацея. 
# Поэтому следует на своё одуманное усмотрение.
deny message = Blacklisted file extension detected 
      condition = ${if match {${lc:$mime_filename}}{\N(\.acm|\.ax|\.bin|\.bpl|\.cat  \n\
		|\.chm|\.com|\.cpl|\.dat|\.drv|\.hlp|\.ini|\.msc|\.nls  \n\
		|\.ocx|\.olb|\.pif|\.rom|\.scr|\.src|\.sys|\.tlb|\.vbs|\.vxd  \n\
		|\.exe|\.bat|\.cmd|\.msi|\.asf \n\
		$\N}{1}{0}} 

# Это китайского спама поубавит.
deny message = Sorry, noone speaks chinese here
	condition = ${if eq{$mime_charset}{gb2312}{1}{0}}

# Пропускаем остальное
accept


######################################################################
#                      ROUTERS CONFIGURATION                         # 
#               Specifies how addresses are handled                  # 
######################################################################
begin routers

# Роутер, осуществляющий поиск по MX-записям в DNS -- поиск маршрута к хосту в DNS. Не проверяются локальные домены, 0.0.0.0 и 127.0.0.0/8
# За коментарием ### вариант транспорта при доставке через tcp/ip.
# В данном случае рассматривается доставка через lmtp-socket.

dnslookup:
	driver = dnslookup
	domains = ! +local_domains
	transport = remote_smtp
	ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
	no_more

# Всё что осталось - это локальные адресаты.

# Доставка почты в dbmail
dbmail_user:
	driver = accept
	condition = ${lookup pgsql{SELECT alias_idnr FROM \
			dbmail_aliases WHERE \
			alias='${quote_pgsql:$local_part@$domain}' OR \
			alias='${quote_pgsql:@$domain}'}{yes}{no}}
	##'#transport = transport_dbmail
	transport = local_lmtp
	cannot_route_message = Unknown user

######################################################################
#                      TRANSPORTS CONFIGURATION                      # 
######################################################################
begin transports

# Доставка на удалённые хосты - по SMTP

remote_smtp:
	driver = smtp

### Закоментирован вариант удалённой доставки по lmtp через tcp/ip
###transport_dbmail:
###	driver = smtp
###	protocol = lmtp
###	hosts = 127.0.0.1
###	allow_localhost
###	return_path_add

# Локальная доставка через сокет lmtp, ну чтоб быстрее
local_lmtp: 
    driver = lmtp 
    socket = /var/run/dbmail/lmtpd.sock 
    batch_max = 8
    user = exim

######################################################################
#                      RETRY CONFIGURATION                           # 
######################################################################
# Повторы недоставленных писем.
begin retry

# Domain        Error       Retries 
*                       *             F,2h,20m; G,16h,1h,1.5; F,4d,6h

##################################################################### 
#                      REWRITE CONFIGURATION                         # 
######################################################################
# Преобразование адресов.
begin rewrite 


#################################################################### 
#                   AUTHENTICATION CONFIGURATION                     # 
######################################################################
# Секция авторизации при отправке писем.
begin authenticators

# Так авторизуется TheBat!
client_auth:
	driver            =  cram_md5
	public_name = CRAM-MD5
	server_secret = ${lookup pgsql{SELECT passwd FROM dbmail_users \
			WHERE userid = '${quote_pgsql:$1}'}{$value}fail}
	server_set_id = $1
	server_advertise_condition = ${if eq{$tls_cipher}{}{no}{yes}}

# Аутентификация по PLAN
PLAIN: 
	driver                    =  plaintext 
	server_set_id        = $auth2 
	server_prompts     = : 
	server_condition   = ${lookup pgsql{SELECT user_idnr FROM dbmail_users \
			 WHERE userid = '${quote_pgsql:$2}' \ 
                                 AND passwd = '${quote_pgsql:$3}'}{1}fail} 
	server_advertise_condition = ${if eq{$tls_cipher}{}{no}{yes}}

# Аутентификация через LOGIN
LOGIN: 
	driver                  = plaintext 
	server_set_id      = $auth1 
	server_prompts   = <| Username: | Password: 
	server_condition  = ${lookup pgsql{SELECT user_idnr FROM dbmail_users \
 				WHERE userid = '${quote_pgsql:$1}' \ 
                                 	AND passwd = '${quote_pgsql:$2}'}{1}fail} 
	server_advertise_condition = ${if eq{$tls_cipher}{}{no}{yes}}

###################################################################### 
#                   CONFIGURATION FOR local_scan()                   # 
######################################################################
# begin local_scan 
# End of Exim configuration file

# End of Exim configuration file


файла /etc/exim/custom/net_block:

1.128.0.0/16
1.129.0.0/16


файла /etc/exim/custom/block_list:
*.ntdalin.net
*subscribe.ru
*ucoz.net


файла /etc/exim/custom/white_list:
*.r.ups.jp
2-smtp.me.ru

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.