Runtime configuration file for Exim daemon_smtp_ports 25 26 local_inte

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
######################################################################
# Runtime configuration file for Exim #
######################################################################
daemon_smtp_ports = 25 : 26
#local_interfaces =
CONFIG_PREFIX=/etc/exim
ACL_PREFIX=CONFIG_PREFIX/acls
CERTDIR=CONFIG_PREFIX/certs
primary_hostname = mail.postserver.ru
qualify_domain = postserver.ru
hide pgsql_servers = 127.0.0.1::1212/users/post/Halk
domainlist local_domains = postserver.ru: mail.postserver.ru
domainlist hosting_domains = postserver.ru: mail.postserver.ru
# Список хостов, почту на которые мы явно отвергаем
hostlist host_reject = ACL_PREFIX/hostreject
# Список адресов, с которых разрешена передача почты во внешний мир
hostlist relay_from_hosts = localhost : postserver.ru: mail.postserver.ru: 0/0 : ACL_PREFIX/relayfromhosts
hostlist helo_accept_junk_hosts = postserver.ru
helo_allow_chars = _
# Проверка получателя
acl_smtp_rcpt = acl_check_rcpt
# Проверка mime содержимого
acl_smtp_mime = acl_check_mime
# Проверка на спам и вирусы
acl_smtp_data = acl_check_virus
# Здесь мы описываем наш антивирус
av_scanner = clamd:127.0.0.1 3310
# И spamassassin
spamd_address = 127.0.0.1 783
# Настройки пользователя и группы по умолчанию
exim_user = mailnull
exim_group = mailnull
# Никогда не осуществляем доставку под рутом - root должен быть алиасом на
# другого локального пользователя. Кстати, это _обязательное_ условие, заданное
# еще на этапе компиляции
never_users = root
# Настройки директории для очереди
spool_directory = /var/spool/exim
# Разделяем spool_directory на несколько более маленьких - аналог хеш таблицы,
# ускоряет обработку spool'а
split_spool_directory
# Пытаемся сделать соответствие прямой и обратной зоны dns для каждого хоста.
# Несколько затратно, но весьма полезно
host_lookup = *
# Убираем проверку identd на клиентской стороне. Из-за неправильно настроенных
# firewall'ов это часто вызывает длительные тайм-ауты, кроме того, этот сервис
# поднят не у многих
rfc1413_query_timeout = 0s
# Указываем кое-какие лимиты (их назначение ясно из названия)
smtp_accept_max = 100
smtp_connect_backlog = 50
smtp_accept_max_per_host = 1
smtp_accept_queue = 100
smtp_accept_queue_per_connection = 30
recipients_max = 50
recipients_max_reject = true
message_size_limit = 100M
accept_8bitmime
# Игнорируем сообщения, которые приходят нам же, давность которых более 24-ти часов
ignore_bounce_errors_after = 1d
# Удаляем замороженные сообщения, давность которых больше 3 дней.
timeout_frozen_after = 3d
# Белый список E-Mail'ов
PGSQL_LIST = INSERT INTO "white_mail" ("mail", "info", "whost", "wip", "record_expires") VALUES ('$local_part@$domain', NULL, NULL, NULL, DATE_ADD(now()))
PGSQL_UPDATELIST = UPDATE "white_mail" SET record_expires=DATE_ADD(now()) WHERE "mail" = '$local_part@$domain'
PGSQL_TESTLIST = SELECT count(*) FROM white_mail WHERE mail = '$local_part@$domain'
# Черный список E-Mail'ов
PGSQL_BL = INSERT INTO "black_list" ("host", "record_expires", "count") VALUES ('$sender_host_address', DATE_ADD(now()), 1)
PGSQL_UPDATE_BL = UPDATE "black_list" SET count=count+1, record_expires=DATE_ADD(now()) WHERE "host" = '$sender_host_address'
PGSQL_TEST_BL = SELECT count(*) FROM black_list WHERE "host" = '$sender_host_address'
######################################################################
# ACL CONFIGURATION #
# Specifies access control lists for incoming SMTP mail #
######################################################################
begin acl
# Этот список доступа описывает проверки, осуществляемые при вызове любой RCPT
# команды
acl_check_rcpt:
# AUTO SENDER WHITE LIST для E-Mail адресов получателей. Т.е. когда Exim отправляет сообщение удалённому адресату, то в PostgreSQL таблицу заносится
# соответствующая запись для последующего беспрепятственного приёма сообщения от этого E-Mail'a. (Без проверок HELO, RBL и т.п.)
# Для наших пользователей записываем адрес получателя ($local_part@$domain).
warn
authenticated = *
set acl_m19 = ${lookup pgsql{PGSQL_TESTLIST}{$value}{0}}
# Если существует, изменяем поле record_expire
warn
authenticated = *
condition = ${if {!eq{$acl_m19}{0}}{yes}{no}}
set acl_m19 = ${lookup pgsql{PGSQL_UPDATELIST}}
# Если не существует такой записи, добавляем в базу.
warn
authenticated = *
condition = ${if {eq{$acl_m19}{0}}{yes}{no}}
set acl_m19 = ${lookup pgsql{PGSQL_LIST}}
# Принимаем любые соединения, которые были успешно авторизованы
accept
authenticated = *
# Локальные юзеры, которым нельзя включать фильтрацию фходящей почты на спам
accept
local_parts = job2
domains = +local_domains
accept
local_parts = hr
domains = +local_domains
accept
local_parts = job
domains = +local_domains
# Принимаем почту для пользователя postmaster локальных доменов, не взирая на отправителя
accept
local_parts = postmaster
domains = +local_domains
# Вначале проверяем достоверность отправителя
require
verify = sender
# Принимаем соединения от локальных MUA (то есть не через TCP/IP)
accept
hosts = :
# Здесь прописаны так называемые dnsbl, то есть черные списки MTA с открытым
# релеем, мы проверяем ip адрес отправителя на соответствие таким спискам и
# блокируем письмо, если отправитель был найден в таком списке
deny
message = host is listed in $dnslist_domain\n$dnslist_text\nYou can contact to mail administrator by phone +7 495 476-75-56
dnslists = blackholes.mail-abuse.org:relays.mail-abuse.org:sbl.spamhaus.org:bl.spamcop.net:cbl.abuseat.org:list.dsbl.org:unconfirmed.dsbl.org:multihop.dsbl.org:combined.njabl.org:vote.drbl.vsu.su:vote.drbl.tomsknet.ru:vote.drbl.sub.ru:vote.drbl.sotcom.ru:vote.drbl.rinet.ru:dnsbl.sorbs.net:dul.ru:zen.spamhaus.org
# Проверка соответствия почтового адреса стандарту
deny
message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
# Правило на проверку всех почтовых адресов, кроме локальных (менее строгое)
deny message = Restricted characters in address.\nYou can contact to mail administrator by phone +7 495 476-75-56
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
# Deny unless the sender address can be verified.
accept domains = +local_domains
# endpass
# verify = recipient
#accept
# domains = +hosting_domains
# endpass
# verify = recipient
# Это правило разрешает доставку писем с нашего домена во внешний мир.
# Не уверен откроет ли это доставку для неавторизированных пользователей.
#accept
# hosts = +relay_from_hosts
# Реализация нашего бан-листа
deny
hosts = +host_reject
message = You are banned. Go away.\nYou can contact to mail administrator by phone +7 495 476-75-56
# Запрещаем все, что не разрешено, закрывая тем самым релей для спамеров
deny
message = relay not permitted\nYou can contact to mail administrator by phone +7 495 476-75-56
# Список доступа для проверки mime частей сообщения
acl_check_mime:
# Произодим декодирование mime сообщений. Полезно для дальнейшей проверки на
# вирусы
warn
decode = default
# Можно очень быстро отсеять сообщения, просто запретив некоторые mime
# вложения, чаще всего содержащие вирусы, хотя, конечно, это не панацея
deny message = Sorry, files with the ${lc:$mime_filename} extension doesn't allowed to be sent!!!\nYou can contact to mail administrator by phone +7 495 476-75-56
condition = ${if match \
{${lc:$mime_filename}} \
{\N(\.wav|\.cpl|\.pif|\.bat|\.scr|\.lnk|\.com|\.exe)$\N} \
{1}{0}}
# Много ли у нас людей, знающих китайский? А вот китайского спама это поубавит
# :)
deny message = Sorry, noone speaks chinese here\nYou can contact to mail administrator by phone +7 495 476-75-56
condition = ${if eq{$mime_charset}{gb2312}{1}{0}}
accept
# Проверка содержимого на вирусы и спам
acl_check_virus:
# Вот что-что, а вирусы нам не нужны.
deny message = This message contains malware($malware_name)\nYou can contact to mail administrator by phone +7 495 476-75-56
demime = *
malware = */defer_ok
# Организуем подсчет спамерских очков
warn
spam = nobody:true
add_header = X-Spam-Score: $spam_score
add_header = X-Spam-Report: $spam_report
accept
condition = ${lookup pgsql{select mail from white_mail where lower(mail) = lower('$sender_address')}{yes}{no}}
accept
condition = ${lookup pgsql{select whost from white_mail where lower(whost) = lower('$sender_host_name')}{yes}{no}}
accept
condition = ${lookup pgsql{select wip from white_mail where lower(wip) = lower('$sender_host_address')}{yes}{no}}
# Заносим наименование хостов в PostgreSQL таблицу black_list, с которых пришла почта со SPAMScore > 4,5.
# Потом из этого спика руками будут создаваться правила route add reject
spam = nobody:true
condition = ${if > {$spam_score_int}{45}}
# Существуют ли записи для данной 'host'? Если нет, вернёт 0.
warn
set acl_m8 = ${lookup pgsql {PGSQL_TEST_BL}{$value}{0}}
# Если существует, изменяем поле 'record_expire' и 'count'
warn
condition = ${if {!eq{$acl_m8}{0}}{yes}{no}}
set acl_m8 = ${lookup pgsql {PGSQL_UPDATE_BL}}
# Если не существует такой записи, добавляем в базу.
warn
condition = ${if {eq{$acl_m8}{0}}{yes}{no}}
set acl_m8 = ${lookup pgsql {PGSQL_BL}}
#Не принимаем письма со SPAMScore > 4,5
deny
message= Your message were recognise as SPAM, spam score $spam_score spampoints.\nYou can contact to mail administrator by phone +7 495 476-75-56
spam = nobody:true
condition = ${if > {$spam_score_int}{45}}
accept
condition = ${if <> {$sender_host_authenticated}{0}}
deny
message=Error! Host lookup failed \nYou can contact to mail administrator by phone +7 495 476-75-56
condition = ${if = {$host_lookup_failed}{1}}
accept
######################################################################
# ROUTERS CONFIGURATION #
# Specifies how addresses are handled #
######################################################################
# THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! #
# An address is passed to each router in turn until it is accepted. #
######################################################################
begin routers
# Роутер, осуществляющий поиск по MX записям в DNS
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
# Все останльные роутеры обслуживают доставку локальной почты
# Драйвер алиасов пользователя. Обратите внимание на lookup в pgsql базе. Что
# интересно, этот lookup работает даже для иерархических алиасов, например,
# postmaster -> root -> cebka -> cebka@jet.msk.su Также определяются транспорты
# для передачи почты в файл (>/path/to/file) и в pipe
# (|/usr/local/libexec/slocal)
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup pgsql{select alias from aliases where lower(mail) = lower('$local_part@$domain')}{$value}fail}
user = mail
group = mailnull
file_transport = address_file
pipe_transport = address_pipe
userforward:
driver = redirect
data = ${lookup pgsql{select remotemail from forward where lower(localmail) = lower('$local_part@$domain')}{$value}fail}
no_verify
no_expn
check_ancestor
reply_transport = address_reply
condition = ${if eq{${lookup pgsql{select localmail from forward where lower(localmail) = lower('$local_part@$domain')}{$value}fail}}{${lookup pgsql{select lower('$local_part@$domain')}}}} {yes} {no} }
allmail:
driver = redirect
data = ${lookup pgsql{select login from accounts }{$value}fail}
no_verify
no_expn
check_ancestor
reply_transport = address_reply
condition = ${if eq{$local_part}{for__all} {${if eq{$domain}{postserver.ru} {yes} {no}} {no} }
# Локальная доставка, если данный пользователь найдем в базе
localuser:
driver = accept
condition = ${lookup pgsql {select uid from accounts where lower(login) = lower('$local_part@postserver.ru')}{yes}{no}}
transport = local_delivery
cannot_route_message = Unknown user
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################
begin transports
# Драйвер для доставки через соединения с удаленными smtp серверами
remote_smtp:
driver = smtp
interface = 124.111.112.26
# Этот транспорт доставляет почту в локальные maildir'ы. Путь к maildir хранится
# опять же в таблице accounts. Разрешения на директорию 0700 для возможности
# работы с данными директориями imap сервера.
# Также из таблицы accounts извлекается данные о размере квоты, и
# устанавливается порог в 75% от квоты, когда пользователю посылается указанное
# предупреждение об подходе к порогу квоты
local_delivery:
driver = appendfile
directory = ${lookup pgsql{select maildir from accounts where lower(login) = lower('$local_part@postserver.ru')}{$value}fail}
create_directory
directory_mode = 0770
maildir_format
delivery_date_add
envelope_to_add
return_path_add
group = ${lookup pgsql{select gid from accounts where lower(login) = lower('$local_part@postserver.ru')}{$value}fail}
user = ${lookup pgsql{select uid from accounts where lower(login) = lower('$local_part@postserver.ru')}{$value}fail}
mode = 0660
no_mode_fail_narrower
quota = ${lookup pgsql{select mailquota from accounts where lower(login) = lower('$local_part@postserver.ru')}{$value}fail}M
quota_warn_message = "\
To: $local_part@domain\n\
From: ithelp@postserver.ru\n\
Subject: Переполненение объема почтового ящика\n\
Это сообщение было сгенерировано автоматически почтовым сервером.\n\
Ваш ящик заполнен на 75%. Освободите почтовый ящик для того что-бы данное сообщение не было прислано вновь. \n\
\n"
quota_warn_threshold = 75%
host_check:
driver = pipe
command = /var/spool/scp
# Транспорт, осуществляющий доставку в pipe
address_pipe:
driver = pipe
return_output
# Транспорт, осуществляющий доставку прямо в файл
address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
# Этот транспорт используется для автоматического ответа на сообщения об ошибках
address_reply:
driver = autoreply
######################################################################
# RETRY CONFIGURATION #
######################################################################
begin retry
# Настройки по умолчанию, которые я не трогал, управляют интервала повторной
# передачи сообщений
# This single retry rule applies to all domains and all errors. It specifies
# retries every 15 minutes for 2 hours, then increasing retry intervals,
# starting at 1 hour and increasing each time by a factor of 1.5, up to 16
# hours, then retries every 6 hours until 4 days have passed since the first
# failed delivery.
# Address or Domain Error Retries
# ----------------- ----- -------
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
######################################################################
# REWRITE CONFIGURATION #
######################################################################
begin rewrite
*@postserver.local $1@postserver.ru T
######################################################################
# AUTHENTICATION CONFIGURATION #
######################################################################
# Описания аутентификации
begin authenticators
# CRAM-MD5 аутентификация, требует наличия пароля в открытом виде, имя
# пользователя должно быть в формате user@domain, как оно хранится в таблице
# accounts
lookup_cram:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup pgsql {select password from accounts where lower(login)=lower('$1')}{$value}fail}
server_set_id = $1
# LOGIN аутентификация - не требует хранения пароля в открытом виде, однако, по
# сети пароль передается в открытом виде - требуется лишь выполнение условия
# server_condition - $1 - имя пользователя, а $2 - пароль. LOGIN безопасен
# только при установлении ssl соединения.
login:
driver = plaintext
public_name = LOGIN
server_prompts = Username:: : Password::
server_condition = ${lookup pgsql {select login from accounts where lower(login)=lower('$1') and password='$2'}{yes}{no}}
server_set_id = $1
######################################################################
# CONFIGURATION FOR local_scan() #
######################################################################
# If you have built Exim to include a local_scan() function that contains
# tables for private options, you can define those options here. Remember to
# uncomment the "begin" line. It is commented by default because it provokes
# an error with Exim binaries that are not built with LOCAL_SCAN_HAS_OPTIONS
# set in the Local/Makefile.
# begin local_scan
# End of Exim configuration file