Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Имя хоста. Используется в EHLO.
- # Фигурирует в других пунктах, если они не заданы -
- # типа qualify_domain и прочих..
- # Если тут ничё не установлено (строка закомметрована)
- # то используется то, что вернёт функция uname()
- primary_hostname = mail.telekom-plus.ru
- # Вводим данные для подключения к MySQL серверу.
- # словечко `hide`, вначале, означает, что при
- # вызове проверки конфига командой
- # exim -bV config_file эти данные не будут отображаться.
- # Если без него - то будут показаны... Формат записи:
- # хост/имя_бд/пользователь/пароль
- hide mysql_servers = localhost/exim/exim/exim
- # Делаем список локальных доменов. Далее этот
- # список будет фигурировать в виде +local_domains
- # В данном случае домены выбираются из БД MySQL. Также
- # можно их просто перечислить через двоеточие. Есть интересная
- # возможность, можно указать юзер@[хост] - user@[217.111.ххх.ххх]
- domainlist local_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE `domain`='${domain}' AND `active`='1'}}
- # делаем список доменов с которых разрешены релеи.
- # Далее этот список будет в виде +relay_to_domains
- # Можно использовать символы подстановки, типа:
- # .... = *.my.ddomain-ak.ru : !spam.my.domen.su : first.su
- # тогда пропускается всё, что похоже на *.my.domain-ak.ru, но
- # от spam.my.domain.ru релеится почта не будет.
- domainlist relay_to_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE `domain`='${domain}' AND `active`='1'}}
- # Составляем список хостов с которых разрешён неавторизованый
- # релей. Обычно в нём находятся локальные сети, и локалхост...
- # ЛокалХост в двух видах был внесён сознательно - пару раз
- # сталкивался с кривым файлом /etc/hosts - результатом было
- # непонимание `localhost` но пониманием 127.0.0.1/8
- hostlist relay_from_hosts = localhost:127.0.0.0/8
- # Вводим названия acl`ов для проверки почты. (В общем-то, это
- # необязательно, если вы делаете открытый релей, или хотите
- # принимать вообще всю почту с любого хоста для любых
- # получателей... Тока потом не жалуйтесь что у Вас спам
- # и провайдер выкатывает немеряный счёт :))
- acl_smtp_rcpt = acl_check_rcpt
- acl_smtp_data = acl_check_data
- # Прикручиваем антивирус - при условии, что exim собран
- # с его поддержкой. В качестве антивиря юзаем ClamAV,
- # ибо - ПО должно быть свободным! :)
- # Итак, указываем местоположение сокета clamd.
- #av_scanner = clamd:/var/run/clamav/clamd.sock
- # Адрес куда слать на проверку спама (SpamAssasin), но я
- # это не юзаю. Не так много у меня спама...
- # spamd_address = 127.0.0.1 783
- # Порты какие будет слушать Exim (25 и 9025)
- daemon_smtp_ports = 25 : 465
- # Указываем порт который будет работать с шифрованием SSL TLS
- tls_on_connect_ports = 465
- # Указываем где у нас находяться сертификат и ключ
- tls_certificate = /etc/exim/ssl/exim.crt
- tls_privatekey = /etc/exim/ssl/exim.key
- # Имя домена добавляемое для локальных отправителей (реальных
- # юзеров системы) т.е. почта отправляемая от root, будет от
- # root@домен_указанный_здесь. Если пункт незадан, то используется
- # имя хоста из `primary_hostname`. Логичней было бы написать здесь
- # lissyara.su, но мне удобней иначе:
- qualify_domain = mail.telekom-plus.ru
- # Имя хоста для ситуации, обратной предыдущей, - это имя домена
- # добавляемое к почте для системных юзеров, ну и вообще для почты
- # пришедшей на адрес типа `root`, `lissyara`, & etc... Если этот
- # пункт незадан то используется значение полученное из
- # предыдущего пункта - `qualify_domain`
- qualify_recipient = mail.telekom-plus.ru
- # А это как раз кусок вышеописанного анахронизма - про почту в
- # виде user@[222.222.222.222] - принимать её или нет. По дефолту
- # (когда строка закомментирована) значение - false. Если захотите
- # поставить true то надо будет добавить в список доменов
- # комбинацию @[] - она означает `все локальные адреса`
- allow_domain_literals = false
- # Пользователь от которого работает exim
- exim_user = mailnull
- # группа в кторой работает exim
- exim_group = mail
- # запрещаем работу доставки под юзером root - в целях безопасности
- never_users = root
- # Проверяем соответствие прямой и обратной зон для всех хостов.
- # Тока зачем это нужно - даже и незнаю... Спам на этом не режется...
- # Зато возможны проблемы - если сервер зоны скажет `сервер файлед`
- # то почту от этого хоста Вы не получите :)
- #host_lookup = *
- # Тоже анахронизм (на самом деле, не такой уж анахронизм, но все давно
- # забили на ident и закрыли файрволлом tcp:113...) Это проверка - Ваш
- # хост спрашивает у удалённого, с которого было подключение, а кто
- # собстно ко мне подключился на такой-то порт? Если на удалённом хосте
- # работает identd - он может ответить (а может и не ответить - как
- # настроить), скажет UID пользователя от которого установлено
- # соединение, тип ОС, и имя пользователя. Теперь, понимаете, почему
- # у всех оно зарублено и файрволлами позакрыто? :) Это же палево :)
- # Тока на мой взгляд, если на сервере всё настроено правильно -
- # то вовсе это и не страшно.
- # Короче - если хостс поставить * то будет проверять все. Таймаут -
- # если поставить 0 то не будет ждать ответа ни от кого. По
- # вышеописанным причинам - отключаем
- #rfc1413_hosts = *
- rfc1413_query_timeout = 0s
- # По дефолту, экзим отфутболивает все `неквалифицированные` адреса,
- # состоящие тока из локальной части. Для того чтобы разрешить такие письма
- # определённых хостов используются эти директивы:
- # для `неквалифицированных` отправителей
- sender_unqualified_hosts = +relay_from_hosts
- # для `неквалифицированных` получателей
- recipient_unqualified_hosts = +relay_from_hosts
- # Интересный пункт, тока я не вполне понимаю его логику.
- # Позволяет выполнять что-то типа - пришло сообщение на
- # локальный ящик user%test.ru@domain-ak.ru и
- # переправляет его на user@test.ru. Делается это для
- # перечисленного списка доменов (* - все):
- # percent_hack_domains = *
- # Если сообщение было недоставлено, то генерится соощение
- # об ошибке. Если сообщение об ошибке не удалось доставить
- # то оно замораживается на указанный в этом пункте срок,
- # после чего снова попытка доставить его. При очередной
- # неудаче - сообщение удаляется.
- ignore_bounce_errors_after = 45m
- # Замороженные сообщения, находящиеся в очереди, дольше
- # указанного времени удаляются и генерится сообщение
- # об ошибке (при условии, что это не было недоставленное
- # сообщение об ошибке :))
- timeout_frozen_after = 15d
- # собсно на этом штатный конфиг кончился, но
- # меня-то это не устраивает... Поэтому пошли пункты,
- # почёрпнутые из других источников.
- # список адресов, через запятую, на которые засылаются
- # сообщения о замороженных сообщениях (о замороженых
- # уведомлениях о заморозке, сообщения не генерятся. - я
- # надеюсь эта строка понятна :))
- freeze_tell = postmaster@mail.telekom-plus.ru
- # Список хостов, почта от которых принимается, несмотря
- # на ошибки в HELO/EHLO (тут указана моя подсеть)
- helo_accept_junk_hosts = 10.15.12.0/24
- # Через какое время повторять попытку доставки
- # замороженного сообщения
- auto_thaw = 1h
- # Приветствие сервера
- smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"
- # Максимальное число одновременных подключений по
- # SMTP. Рассчитывать надо исходя из нагрузки на сервер
- smtp_accept_max = 50
- # максимальное число сообщений принимаемое за одно соединение
- # от удалённого сервера (или пользователя). C числом 25
- # я имел проблемы тока один раз - когда у меня три дня лежал
- # инет и после его подъёма попёрли мессаги. Но у меня не так
- # много почты - всего 30 пользователей.
- smtp_accept_max_per_connection = 25
- # чё-то про логи и борьбу с флудом - я так понимаю -
- # максимальное число сообщений записываемых в логи
- smtp_connect_backlog = 30
- # максимальное число коннектов с одного хоста
- smtp_accept_max_per_host = 20
- # Ход ладьёй - для увеличения производительности,
- # директория `spool` внутри, разбивается на
- # директории - это ускоряет обработку
- split_spool_directory = true
- # Если у сообщения много адресатов на удалённых хостах,
- # то запускатеся до указанного числа максимально число
- # параллельных процессов доставки
- remote_max_parallel = 15
- # при генерации сообщения об ошибке прикладывать
- # не всё сообщение, а кусок (от начала) указанного
- # размера (иногда полезно и целиком - в таком случае
- # просто закомментируйте эту строку)
- return_size_limit = 70k
- # размер сообщения. У меня стоит относительно большой
- # размер (`относительно` - потому, что на большинстве
- # хостов оно ограничено 2-5-10мб, либо стоит анлим.)
- message_size_limit = 10M
- # разрешаем неположенные символы в HELO (столкнулся
- # с этим случайно - имя фирмы состояло из двух слов
- # и какой-то раздолбай домен обозвал my_firme_name
- # прям с подчёркиваниями... Виндовые клиенты при
- # соединении радостно рапортовали о себе
- # `vasya.my_firme_name` ну а экзим их футболил :))
- helo_allow_chars = _
- # Принудительная синхронизация. Если отправитель
- # торопится подавать команды, не дождавшись ответа,
- # то он посылается далеко и надолго :) Немного,
- # спам режется. вкл = true / выкл = false
- smtp_enforce_sync = false
- # Выбираем, что мы будем логировать
- # + - писать в логи,
- # - - Не писать в логи.
- # +all_parents - все входящие?
- # +connection_reject - разорваные соединения
- # +incoming_interface - интерфейс (реально - IP)
- # +lost_incoming_connections - потеряные входящие
- # соединения
- # +received_sender - отправитель
- # +received_recipients - получатель
- # +smtp_confirmation - подтверждения SMTP?
- # +smtp_syntax_error - ошибки синтаксиса SMTP
- # +smtp_protocol_error - ошибки протокола SMTP
- # -queue_run - работа очереди (замороженные мессаги)
- log_selector = +all_parents +connection_reject +incoming_interface +lost_incoming_connection +received_sender +received_recipients +smtp_confirmation +smtp_syntax_error +smtp_pr
- # Убираем собственную временную метку exim`a из логов, её ставит
- # сам syslogd - нефига дублировать
- syslog_timestamp = no
- ### конфигурация ACL для входящей почты
- begin acl
- # Эти правила срабатывают для каждого получателя
- acl_check_rcpt:
- # принимать сообщения которые пришли с локалхоста,
- # не по TCP/IP
- accept hosts = :
- # Запрещаем письма содержащие в локальной части
- # символы @; %; !; /; |. Учтите, если у вас было
- # `percent_hack_domains` то % надо убрать.
- # Проверяются локальные домены
- deny message = "incorrect symbol in address"
- domains = +local_domains
- local_parts = ^[.] : ^.*[@%!/|]
- # Проверяем недопустимые символы для
- # нелокальных получателей:
- deny message = "incorrect symbol in address"
- domains = !+local_domains
- local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
- # Принимаем почту для постмастеров локальных доменов без
- # проверки отправителя (я закомментировал, т.к. это -
- # основной источник спама с мой ящик).
- #
- # accept local_parts = postmaster
- # domains = +local_domains
- #
- # Запрещщаем, если невозможно проверить отправителя
- # (отсутствует в списке локальных пользователей)
- # У себя я это закоментил, по причине, что некоторые
- # железяки (принтеры, & etc) и программы (Касперский, DrWEB)
- # умеют слать почту, в случае проблем но не умеют ставить
- # нужного отправителя. Такие письма эта проверка не пускает.
- # require verify = sender
- # Запрещщаем тех, кто не обменивается приветственными
- # сообщениями (HELO/EHLO)
- deny message = "HELO/EHLO require by SMTP RFC"
- condition = ${if eq{$sender_helo_name}{}{yes}{no}}
- # Принимаем сообщения от тех, кто аутентифицировался:
- # Вообще, большинство конфигов в рунете - это один и тот же
- # конфиг написанный Ginger, в котором этот пункт расположен
- # внизу. Но при таком расположении рубятся клиенты с adsl,
- # ppp, и прочие зарезанные на последующих проверках. Но это
- # жа неправильно! Этом мои пользователи из дома! Потому
- # я это правило расположил до проверок.
- accept authenticated = *
- # Рубаем нах, тех, кто подставляет свой IP в HELO
- deny message = "Your IP in HELO - access denied!"
- hosts = * : !+relay_from_hosts : !81-196.mail.telekom-plus.ru
- condition = ${if eq{$sender_helo_name}{$sender_host_address}{true}{false}}
- # Рубаем тех, кто в HELO пихает мой IP (2500 мудаков за месяц!)
- 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..."
- # Рубаем тех, кто не пишет отправителя
- deny condition = ${if eq{$sender_address}{}{yes}{no}}
- hosts = !127.0.0.1 : !localhost : *
- message = "Sender address is empty?! not for RFC..."
- # Рубаем всех, если адрес отправителя нет в алиасах, кроме локальной сети
- # deny condition = ${lookup mysql{SELECT `goto` FROM `alias` WHERE `address`='${quote_mysql:$local_part@mysite.ru}'}{no}{yes}}
- # hosts = !127.0.0.1 : !localhost : !10.15.12.0/24 : *
- # message = "No such user!"
- # Рубаем всех, кроме нашего внешнего пересыльщика masterhost.ru и localhost
- # (мастерхостость)Было сделано что бы никто кроме masterhost.ru
- # не мог слать письма на @zern.domain-ak.ru
- deny condition = ${if match{$sender_helo_name}{cm.hc.ru}{no}{yes}}
- hosts = !127.0.0.1 : !localhost : *
- message = "Access deny!"
- # Рубаем хосты типа *adsl*; *dialup*; *pool*;....
- # Нормальные люди с таких не пишут. Если будут
- # проблемы - уберёте проблемный пункт (у меня клиенты
- # имеют запись типа asdl-1233.zone.su - я ADSL убрал...)
- # deny message = "your hostname is bad (adsl, poll, ppp & etc)."
- # condition = ${if match{$sender_host_name} \
- # {adsl|dialup|pool|peer|dhcp} \
- # {yes}{no}}
- #
- # Задержка. (это такой метод борьбы со спамом,
- # основанный на принципе его рассылки) На этом рубается
- # почти весь спам. Единственно - метод неприменим на
- # реально загруженных MTA - т.к. в результате ему
- # приходится держать много открытых соединений.
- # но на офисе в сотню-две человек - шикарный метод.
- #
- # более сложный вариант, смотрите в статье по exim и
- # курьер имап. Т.к. там метод боле умный (просто правил
- # больше :), то можно и на более загруженные сервера ставить)
- warn
- # ставим дефолтовую задержку в 30 секунд
- set acl_m0 = 30s
- warn
- # ставим задержку в 0 секунд своим хостам и
- # дружественным сетям (соседняя контора :))
- hosts = +relay_from_hosts : 127.0.0.1/8 : 10.15.12.0/24 \
- : 10.14.7.0/24
- 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
- # Проверка получателя в локальных доменах.
- # Если не проходит, то проверяется следующий ACL,
- # и если непрошёл и там - deny
- accept domains = +local_domains
- endpass
- message = "In my mailserver not stored this user"
- verify = recipient
- # Проверяем получателя в релейных доменах
- # Опять-таки если не проходит -> следующий ACL,
- # и если непрошёл и там - deny
- accept domains = +relay_to_domains
- endpass
- message = "main server not know how relay to this address"
- 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
- # Разрешаем почту от доменов в списке relay_from_hosts
- accept hosts = +relay_from_hosts
- # Если неподошло ни одно правило - чувак явно ищет
- # открытый релей. Пшёл прочь. :)
- deny message = "Homo hominus lupus est"
- # Тут идут ACL проверяющие содержимое (тело) письма.
- # Без них будут пропускаться все сообщения.
- acl_check_data:
- # Тут мы проверяем письма на ***SPAM***(ну если кому это нужно)
- #.include_if_exists /usr/local/etc/exim/includes/antispam.conf
- # Проверяем письмо на вирусы
- # deny malware = *
- # message = "In e-mail found VIRUS - $malware_name"
- # Если есть необходимость - тут проверки на спам
- # Пропускаем остальное
- accept
- # чё делаем с почтой
- ############################################################################
- # #Секция роутеров
- ############################################################################
- begin routers
- # Все адреса *@zern.domain-ak.ru отправляем на
- # *@domain-ak.ru все пользователи у нас в
- # @domain-ak.ru, чтобы алиасы не прописывать
- # Не юзаем потому что стоит подмена заголовков begin rewrite
- # aliases_mysql_nnov:
- # driver = redirect
- # condition = ${if eq{zern.domain-ak.ru}{$domain}{yes}{no}}
- # allow_fail
- # allow_defer
- # data = ${quote:$local_part}@domain-ak.ru
- # Копируем всю входящую и исходящую почту на audit@domain-ak.ru
- # Нужно было начальству для контроля.(если вам такое нужно то раскомментите)
- #copy_message:
- # driver = redirect
- # unseen
- # domains = *
- # data = audit@domain-ak.ru
- # 1.Смотрим системные Алиасы
- system_aliases:
- driver = redirect
- allow_fail
- allow_defer
- data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE \
- `address`='${quote_mysql:$local_part@$domain}' OR \
- `address`='${quote_mysql:@$domain}'}}
- # 2.Доставляем почты в dovecot
- dovecot_user:
- driver = accept
- condition = ${lookup mysql{SELECT `goto` FROM \
- `alias` WHERE \
- `address`='${quote_mysql:$local_part@$domain}' OR \
- `address`='${quote_mysql:@$domain}'}{yes}{no}}
- transport = dovecot_delivery
- # 3.Отправка почты на "masterhost @adomain-ak.ru"
- # для локального домена "@domain-ak.ru"
- # если пользователя несуществует в локальном домене @domain-ak.ru
- masterhost_router:
- driver = manualroute
- transport = masterhost_transport
- route_list = mail.telekom-plus.ru smtp.cm.hc.ru
- # 4.Отправка всей не локальной почты т.е
- # на удаленные сервера кроме "masterhost.ru
- # домен @domain-ak.ru", отправка производить
- donpac_router:
- driver = manualroute
- transport = donpac_transport
- route_list = * smtp.cm.hc.ru
- # 5.Если лег сервак провайдера donpac.ru то EXIM отправляет напрямую
- # т.е как "mail.zern.domain-ak.ru"
- # Поиск маршрута к хосту в DNS. Если маршрут не найден в DNS -
- # то это `унроутабле аддресс`. Не проверяются локальные
- # домены, 0.0.0.0 и 127.0.0.0/8
- dnslookup:
- driver = dnslookup
- domains = ! +local_domains
- transport = remote_smtp
- ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
- no_more
- # начинаются транспорты - как доставляем почту
- ##########################################################################
- # #Секция транспортов
- ##########################################################################
- begin transports
- # Доставка на удалённые хосты - по SMTP
- remote_smtp:
- driver = smtp
- # Доставка локальным адресатам - в dovecot
- # Надо заметить что тут использовалась ранее прямая доставка
- # в директорию, но щас с портами стал-таки устанавливаться deliver
- # программа dovecot занимающаяся доставкой мессаг.
- # Соответственно юзаем его.
- dovecot_delivery:
- driver = pipe
- command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
- message_prefix =
- message_suffix =
- delivery_date_add
- envelope_to_add
- return_path_add
- log_output
- user = mailnull
- # Имя программы
- address_pipe:
- driver = pipe
- return_output
- # Транспорт для автоответов
- address_reply:
- driver = autoreply
- # Транспорт на smtp.masterhost.ru
- masterhost_transport:
- driver = smtp
- hosts = smtp.cm.hc.ru
- # Транспорт на smtp.donpac.ru
- donpac_transport:
- driver = smtp
- hosts = smtp.cm.hc.ru
- # Начинаются повторы недоставленных писем.
- #########################################################################
- # # Секция повторов
- #########################################################################
- begin retry
- # Address or Domain Error Retries
- # ----------------- ----- -------
- * * F,2h,15m; G,16h,1h,1.5; F,4d,6h
- ##########################################################################
- # # Секция преобразование адресов
- ##########################################################################
- begin rewrite
- #Подмена заголовка @zern.domain-ak.ru на @domain-ak.ru
- *@mail.telekom-plus.ru $local_part@mail.telekom-plus.ru Eh
- #########################################
- # Флаги #
- #########################################
- # E ----> все поля конверта #
- # F ----> поле "From" в конверте #
- # T ----> поле "To" в конверте #
- # b ----> заголовок "Bcc:" #
- # c ----> заголовок "Cc:" #
- # f ----> заголовок "From:" #
- # h ----> все заголовки #
- # r ----> заголовок "Reply-To:" #
- # s ----> заголовок "Sender:" #
- # t ----> заголовок "To:" #
- #########################################
- # Секция авторизации при отправке писем. Ввиду того,
- # что почтовых клиентов много, и все всё делают
- # по-своему, то и механизмов авторизации три...
- #####################################################################
- # # Секция аутентификаторов
- #####################################################################
- begin authenticators
- auth_plain:
- driver = plaintext
- public_name = PLAIN
- server_condition = ${lookup mysql{SELECT `username` FROM `mailbox` WHERE `username` = '${quote_mysql:$auth2}' AND `password` = '${quote_mysql:$auth3}'}{yes}{no}}
- server_prompts = :
- server_set_id = $auth2
- auth_login:
- driver = plaintext
- public_name = LOGIN
- server_condition = ${lookup mysql{SELECT `username` FROM `mailbox` WHERE `username` = '${quote_mysql:$auth1}' AND `password` = '${quote_mysql:$auth2}'}{yes}{no}}
- server_prompts = Username:: : Password::
- server_set_id = $auth1
- auth_cram_md5:
- driver = cram_md5
- public_name = CRAM-MD5
- server_secret = ${lookup mysql{SELECT `password` FROM `mailbox` WHERE `username` = '${quote_mysql:$auth1}'}{$value}fail}
- server_set_id = $auth2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement