1. РАЗВОРАЧИВАНИЕ ГЕНЕРАТОРА КОНФИГУРАЦИОННЫХ ФАЙЛОВ минимальный набор действий для разворачивания системы конфигов с нуля: 1. переход в каталог с настройками эксима в зависимости от ОС: cd /usr/local/etc/exim или cd /etc/exim 2. создание каталога с настройками: mkdir m4 3. копирование Makefile (возможно даже не самого свежего), полученного по почте, rsync или по http: cd m4 && cp ${DISTFILES}/Makefile ./ или cd m4 && rsync -avz rsync://rsync.mta.org.ua/exim-4.67-conf/m4/Makefile Makefile или cd m4 && wget http://mta.org.ua/exim-4.67-conf/m4/Makefile 4. синхронизация конфигов, повторная синхронизация (для случая получения при первой синхронизации Makefile с измененным набором синхронизируемых каталогов) и прединсталляционные процедуры: gmake sync && gmake sync pre-install 5. изменение конфигурационного файла: vi ../site/conf 6. сборка конфигов (configure, system_filter, exim.pl, всех db): gmake all 7. установка конфигов: gmake install 8. пересборка db файлов: gmake db 9. создание скриптов для запуска из планировщика задач и установка этих скриптов: gmake periodic install-periodic 10. создание TLS сертификата и ключа gmake exim.pem ###################################################################### 2. MAKEFILE доступные targets для Makefile: build: прединсталляционыне процедуры, сборка configure, сборка system_filter, сборка exim.pl и сборка periodic (по умолчанию) build-all: прединсталляционыне процедуры, сборка configure, сборка system_filter, сборка exim.pl и сборка periodic, сборка всех db db: сборка всех db файлов all: синоним для build-all reload: restart: start: stop: sync: синхронизация всех конфигов с конифгами из репозитария разработчика sync_acls: синхронизация подкаталога acls sync_deliveries: синхронизация подкаталога deliveries sync_features: синхронизация подкаталога features sync_m4: синхронизация подкаталога m4 sync_perl: синхронизация подкаталога perl sync_system_filters: синхронизация подкаталога system_filters sync_samples: синхронизация подкаталога samples sync_bin: синхронизация подкаталога bin sync_patches: синхронизация набора патчей sync_redhat: синхронизация каталогов для сборки sc.rpm для RedHat/Fedora sync_countries: синхронизация списков сетей стран access-relay-greylist: сборка списка сетей стран для серого списка install: инсталляционные процедуры pre-install: прединсталляционные процедуры (необходимы для корректной генерации конфигов) post-install: постинсталляционные процедуры configure: сборка основного конфигурационного файла configure system_filter: сборка системного фильтра system_filter exim.pl: сборка файла с perl'овыми хуками exim.pl exim.pem: создание TLS сертификата и ключа exim.pem periodic: создание скриптов для запуска из планировщика задач install-periodic: установка скриптов для запуска из планировщика задач upgrade: настройка Makefile на работу со следующим релизом exim-conf fix: автоматическая правка site/conf и других файлов при после перехода на новый релиз exim-conf check: проверка использования устаревших имен переменных и файлов ###################################################################### 3. ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННЫХ acl_m0 - временная, используется внутри одного acl acl_m1 - временная, используется внутри одного acl acl_m2 - временная, используется внутри одного acl acl_m3 - временная, используется внутри одного acl acl_m5 - используется для вычисления исключений из проверки SpamAssassin'ом acl_m7 - данные для антивирусных квитанций acl_m8 - вычисленные предельные баллы SpamAssassin'а acl_m9 - флаг abuse/postmaster в пределах одного получателя, при помещении файла в карантин содержит список оповещаемых получателей acl_m10 - временная, используется внутри одного acl acl_m11 - временная, используется внутри одного acl acl_m12 - временная, используется внутри одного acl acl_m13 - флаг abuse/postmaster/antivirus hater для всего письма вцелом acl_m14 - используется для резервного копирования почты acl_m15 - используется для накопления информации о сработавших правилах acl_m16 - используется для отказа в приеме письма для всех получателей сразу после data acl_m17 - признак сохранения письма в карантине (кроме антивирусного карантина) acl_m18 - используется для резервного копирования почты acl_m19 - используется для DSN acl_c0 - временная, используется для вылавливания defer'ов acl_c1 - временная, используется для сохранения результата работы предыдущего антивирусного демона acl_c2 - временная, используется внутри одного acl acl_c3 - используется для резервного копирования почты acl_c4 - используется для резервного копирования почты acl_c5 - используется для резервного копирования почты acl_c6 - используется для подсчета баллов для опционального reject'а acl_c7 - PTR запись рилея в случае несовпадения записей в прямой и реверсной зонах acl_c8 - используется для подсчета баллов для опционального greylisting'а acl_c9 - используется для анонимизации Received ###################################################################### 4. ПРИМЕРЫ ВКЛЮЧЕНИЯ РАЗЛИЧНЫХ ФУНКЦИОНАЛЬНЫХ ВОЗМОЖНОСТЕЙ включение рилеинга почты доменов и relay based on MX: define(`confSECONDARY_RELAY', `YES')dnl define(`confRELAY_BASED_ON_MX', `YES')dnl SMTP аутентификация (в том числе как клиента), STARTTLS и запрет использования plain text паролей без шифрования: define(`confSMTP_AUTH', `YES')dnl define(`confSMTP_AUTH_CLIENT', `PLAIN LOGIN CRAM-MD5')dnl define(`confSTARTTLS', `YES')dnl define(`confSMTP_AUTH_RESTRICT', `DISABLE_PLAIN_AUTH_WITHOUT_TLS')dnl сканирование рилея на предмет наличия на нем open proxy: define(`confCHECK_OPEN_PROXY', `REJECT')dnl define(`confCHECK_OPEN_PROXY_TIMEOUT', `120')dnl define(`confCHECK_OPEN_PROXY_HOST', `bsd.falbi.kiev.ua:25')dnl define(`confCHECK_OPEN_PROXY_BANNER', `220 bsd.falbi.kiev.ua ESMTP daemon')dnl dovecot (virtual maildirs, пользователи в passwd like файле): define(`confDELIVERY_TO', `MDIR_VIRTUAL FILTERS')dnl define(`confVIRT_MDIR_USER', `dovecot')dnl define(`confVIRT_MDIR_USERLIST', `SINGLE_FILE')dnl define(`confVIRT_MDIR_USERLIST_SINGLE', `/etc/passwd.imap')dnl define(`confVIRT_MDIR_ALIASES', `SINGLE_FILE')dnl define(`confVIRT_MDIR_DIR_MODE', `0770')dnl define(`confVIRT_MDIR_FILE_MODE', `0660')dnl define(`confSMTP_AUTH_SOURCE', `PASSWD')dnl define(`confSMTP_AUTH_PASSWD', `/usr/local/etc/passwd.imap')dnl define(`confSYSTEM_FILTER_USER', `dovecot')dnl dovecot (user maildirs): define(`confDELIVERY_TO', `MDIR_USER FILTERS PROCMAIL')dnl define(`confSYSTEM_FILTER_USER', `dovecot')dnl define(`confSMTP_AUTH_SOURCE', `SASLAUTHD')dnl dovecot или imap-uw (mailboxes): define(`confDELIVERY_TO', `MBOX FILTERS PROCMAIL')dnl define(`confSMTP_AUTH_SOURCE', `SASLAUTHD')dnl define(`confSYSTEM_FILTER_USER', `root')dnl courier-imap (virtual maildirs): define(`confDELIVERY_TO', `MDIR_VIRTUAL FILTERS')dnl define(`confVIRT_MDIR_USER', `mailnull')dnl define(`confVIRT_MDIR_USERLIST', `MYSQL')dnl define(`confVIRT_MDIR_ALIASES', `MYSQL')dnl define(`confVIRT_MDIR_DIR_MODE', `0750')dnl define(`confVIRT_MDIR_FILE_MODE', `0640')dnl define(`confSYSTEM_FILTER_USER', `mailnull')dnl define(`confSMTP_AUTH_SOURCE', `MYSQL')dnl courier-imap (user maildirs): define(`confDELIVERY_TO', `MDIR_USER FILTERS PROCMAIL')dnl define(`confSYSTEM_FILTER_USER', `mailnull')dnl define(`confSMTP_AUTH_SOURCE', `SASLAUTHD')dnl дополнительная доставка cyrus-imapd: define(`confDELIVERY_TO', confDELIVERY_TO` CYRUS')dnl резервное копирование почты системным фильтром без сохранения вирусов: define(`confMAIL_BACKUP', `SYSTEM_FILTER')dnl define(`confANTIVIRUS_SAVE_BACKUP', `NO')dnl резервное копирование почты направлением копий писем по указанному адресу: define(`confMAIL_BACKUP', `ROUTER')dnl define(`confMAIL_BACKUP_ADDR', `corvax@devnull.org.ua')dnl проверка существования пользователя MS Exchange: define(`confEXCHANGE_ROUTERS', `ip_or_hostname_of_exchange : another_ip_or_hostname_of_exchange ')dnl define(`confEXCHANGE_AD_HOSTS', `one_ad_dc : another_ad_dc')dnl define(`confEXCHANGE_LDAP_USER', `ldapuser@active.directory.domain')dnl define(`confEXCHANGE_LDAP_PASSWORD', `password')dnl define(`confEXCHANGE_LDAP_BASE', `cn=Users,dc=active,dc=directory,dc=domain')dnl ###################################################################### 5. ИСПОЛЬЗОВАНИЕ АНТИВИРУСОВ ANTIVIRUS(`название_антивируса', `действие', `параметр_для_av_scanner', `дополнительные_параметры', `шелловая_команда_получения_номера_версии_антивируса', `название_антивируса_для_заголовков_по_умолчанию', `максимальный_размер_проверяемого_письма') возможные действия с зараженными файлами: QUARANTINE - вывод в лог файл предупреждения и помещение зараженного письма в карантин DISCARD - удаление зараженного письма DROP - синоним DISCARD REJECT - отказ в приеме зараженного письма (возврат клиенту кода 5xx) QUARANTINE_MAILLIST - сохранение в карантине инфицированных писем из списков рассылки вместо отказа в приеме письма (используется только одновременно с REJECT) DISCARD_MAILLIST - игнорирование инфицированных писем из списков рассылки вместо отказа в приеме письма (используется только одновременно с REJECT) WARN - устаревшее значение, эквивалентно `QUARANTINE DISCARD' SUBMIT_MYSQL - сохранение информации о зараженном письме в БД MySQL (только для пользователей enterprise версии) SUBMIT_SQLITE - сохранение информации о зараженном письме в БД MySQL (только для пользователей enterprise версии) значение QUARANTINE можно указывать вместе с DISCARD, DROP или REJECT, разделяя их пробелом. возможные значения дополнительных параметров: defer_ok - при получении DEFER от антивирусного демона письмо доставляется получателю(ям), отправитель получает статус 250; defer_next - при получении DEFER от антивирусного демона письмо передается следующему (резервному) анти- вирусному демону. в остальных случаях письмо резервному антиви- русному демону не передается; defer_freeze - при получении DEFER от антивирусного демона письмо замораживается, отправитель получает статус 250; defer_no_mbox_unspool - при получении DEFER от антивирусного демона письмо не удаляется из /var/spool/exim/scan. несколько значений могут быть указаны через пробел "шелловая команда получения номера версии антивируса" и "название антивируса для заголовков по умолчанию" являются необязательными параметрами. "шелловая команда получения номера версии антивируса" должна возвращать название антивируса (желательно с номером версии) без символа конца строки. команда выполняется один раз при генерации конфигурационного файла. значение, возвращаемое командой, будет использовано при указании версии антивируса в заголовках проверяемого файла. если команда не указана, будет использовано значение параметра "названия антивируса для заголовков по умолчанию". если же и этот параметр будет не указан, будет использовано значение параметра "название антивируса". примеры использования: ANTIVIRUS(`ClamAV', `QUARANTINE REJECT', `clamd:/var/run/clamav/clamd', `defer_next defer_no_mbox_unspool') ANTIVIRUS(`KAV5', `QUARANTINE REJECT', `aveserver:/var/run/aveserver', `defer_ok defer_no_mbox_unspool') ANTIVIRUS(`DrWeb', `QUARANTINE REJECT', `drweb:/usr/local/drweb/run/drwebd.sock', `defer_no_mbox_unspool defer_freeze') ANTIVIRUS(`ClamAV', `REJECT QUARANTINE', `clamd:/var/run/clamav/clamd.sock', `defer_ok defer_no_mbox_unspool defer_next', `clamd -V 2>/dev/null | head -n 1 | perl -p -e "chomp"', `') ANTIVIRUS(`ClamAV_local', `REJECT QUARANTINE', `clamd:192.168.0.1 3310:local', `defer_ok defer_no_mbox_unspool defer_next') ANTIVIRUS(`ClamAV_remote', `REJECT QUARANTINE', `clamd:192.168.0.1 3310', `defer_ok defer_no_mbox_unspool defer_next') ANTIVIRUS(`ClamDScan', `QUARANTINE REJECT', `cmdline:/usr/bin/clamdscan \ --disable-summary \ %s : FOUND : (\\S+) FOUND', `defer_ok defer_no_mbox_unspool defer_next') ANTIVIRUS(`ClamScan', `QUARANTINE REJECT', `cmdline:/usr/bin/clamscan \ --disable-summary \ --max-space=40960 \ --max-files=1024 \ --max-recursion=8 \ --max-ratio=256 \ --unrar=/usr/local/bin/unrar3 \ --mbox -r %s : FOUND : (\\S+) FOUND', `defer_no_mbox_unspool defer_ok', `clamscan -V 2>/dev/null | head -n 1 | perl -p -e "chomp;s/clamav/ClamScan/i;"', `', `10240k') ANTIVIRUS(`aveserver', `REJECT QUARANTINE', `aveserver:/var/run/aveserver', `defer_next defer_no_mbox_unspool', `/usr/local/share/kav/bin/aveserver -v 2>/dev/null | head -n 1 | perl -p -e "chomp;s/\/RELEASE.+$//"', `') ANTIVIRUS(`aveclient', `REJECT QUARANTINE', `cmdline:/usr/local/share/kav/bin/aveclient \ -s -p /var/run/aveserver \ %s/* : LINFECTED : LINFECTED (.*)', `defer_ok defer_no_mbox_unspool') ANTIVIRUS(`kavscanner', `REJECT QUARANTINE', `cmdline:/opt/kav/bin/kavscanner \ -i0 \ %s : INFECTED : INFECTED (.+)', `defer_no_mbox_unspool', `/usr/local/share/kav/bin/kavscanner -v 2>/dev/null | head -n 1 | perl -p -e "chomp;s/\/RELEASE.+$//"', `', `10240k') ANTIVIRUS(`DrWeb', `REJECT QUARANTINE', `drweb:/var/drweb/run/drwebd.socket', `defer_no_mbox_unspool', `/usr/local/drweb/drwebd -V 2>/dev/null | head -n 1 | perl -p -e "chomp"', `') ANTIVIRUS(`DrWeb', `REJECT QUARANTINE', `drweb:127.0.0.1 3000', `defer_no_mbox_unspool') ANTIVIRUS(`drwebdc', `QUARANTINE REJECT', `cmdline:/opt/drweb/drwebdc \ -rr -q -e -u/var/drweb/run/drwebd.socket \ -f %s/* : infected with : infected with (.+)', `defer_no_mbox_unspool defer_ok') ANTIVIRUS(`drweb', `QUARANTINE REJECT', `cmdline:/opt/drweb/drweb \ -ini=/etc/drweb/drweb32.ini \ -path=%s : infected with : infected with (.+)', `defer_no_mbox_unspool defer_ok', `/usr/local/drweb/drweb -V 2>/dev/null | head -n 1 | perl -p -e "chomp"', `', `10240k') ANTIVIRUS(`uvscan', `REJECT QUARANTINE', `cmdline:/usr/local/bin/uvscan \ --secure -rv --summary --noboot \ --allole --analyse --mime --program --unzip \ %s : Found the .+ virus !!! : Found the (.+) virus !!!', `defer_no_mbox_unspool defer_ok') ###################################################################### 6. ИСПОЛЬЗОВАНИЕ DNSBL DNS_BL(`имя_зоны', `действие_в_случае_попадания_рилея_отправителя_в_DNSBL', `действие_в_случае_невозможности_получить_ответ_от_DNSBL', `сообщение_отправителю') действия в случае попадания рилея отправителя в DNSBL: reject - отвергать сообщение deny - синоним reject drop - обрыв соединения defer - возврат временной ошибки warn - выводить в лог файл предупреждение greylist:xx - добавление xx баллов к счетчику опционального greylisting'а greylisting:xx - синоним greylist:xx reject:yy - добавление yy баллов к счетчику опционального reject'а deny:yy - синоним reject:yy delay:zz - задержка на zz секунд перед продолжением обработки сообщения pause:zz - синоним delay:zz действия warn, greylist:xx, reject:yy и delay:zz можно указывать одновременно через пробел действие в случае невозможности получить ответ от DNSBL: pass - принять сообщение defer - вернуть клиенту 4xx сообщение отправителю: пустое значение - формируется умолчательное сообщение отправителю dialup - формируется сообщение отправителю для dial-up/dsl/cable сетей текст - данный текст возвращается отправителю как текст сообщения об ошибке примеры использования: DNS_BL(`helo.rbl.mta.org.ua', `pause:30 deny', `pass', `without_txt') DNS_BL(`rcpt.rbl.mta.org.ua', `warn pause:30 greylist:10 reject:8', `pass', `without_txt') DNS_BL(`dul.ru', `deny', `defer',`dialup') DNS_BL(`dialups.mail-abuse.org',`deny', `pass', `dialup') DNS_BL(`dynablock.easynet.nl', `deny', `pass', `dialup') DNS_BL(`dynablock.njabl.org', `deny', `pass', `dialup') DNS_BL(`dul.dnsbl.sorbs.net', `deny', `pass', `dialup') DNS_BL(`list.dsbl.org', `warn pause:30 greylist:6 reject:5', `defer',`') DNS_BL(`multihop.dsbl.org', `warn pause:30 greylist:6 reject:4', `pass', `') DNS_BL(`opm.blitzed.org', `warn pause:30 greylist:6 reject:5', `pass', `') dnl DNS_BL(`relays.ordb.org', `warn pause:30 greylist:6 reject:6', `pass', `') DNS_BL(`cbl.abuseat.org', `warn pause:30 greylist:6 reject:5', `defer', `') ###################################################################### 7. ИСПОЛЬЗОВАНИЕ RFC Ignorant List RFC_IGNORANT_LIST(`имя_зоны', `действие_в_случае_попадания_рилея_отправителя_в_RFC_Ignorant_List', `действие_в_случае_невозможности_получить_ответ_от_RFC_Ignorant_List', `сообщение_отправителю') действие в случае попадания рилея отправителя в RFC Ignorant List: reject - отвергать сообщение deny - синоним reject drop - обрыв соединения defer - возврат временной ошибки warn - выводить в лог файл предупреждение greylist:xx - добавление xx баллов к счетчику опционального greylisting'а greylisting:xx - синоним greylist:xx reject:yy - добавление yy баллов к счетчику опционального reject'а deny:yy - синоним reject:yy delay:zz - задержка на zz секунд перед продолжением обработки сообщения pause:zz - синоним delay:zz действия warn, greylist:xx, reject:yy и delay:zz можно указывать одновременно через пробел действие в случае невозможности получить ответ от RFC Ignorant List pass - принять сообщение defer - вернуть клиенту 4xx сообщение отправителю: пустое значение - формируется умолчательное сообщение отправителю текст - данный текст возвращается отправителю как текст сообщения об ошибке примеры использования: RFC_IGNORANT_LIST(`abuse.rfc-ignorant.org', `warn pause:10 greylist:4 reject:2', `pass', `MX of domain does not have a working abuse address') RFC_IGNORANT_LIST(`postmaster.rfc-ignorant.org',`warn pause:10 greylist:5 reject:2', `pass', `MX of domain does not have a working postmaster address') RFC_IGNORANT_LIST(`dsn.rfc-ignorant.org', `warn pause:10 greylist:10 reject:2', `pass',`MX of domain do not accept bounces. This violates RFC 821/2505/2821') RFC_IGNORANT_LIST(`bogusmx.rfc-ignorant.org', `reject', `pass', `') ###################################################################### 8. ВАРИАНТЫ ИСПОЛЬЗОВАНИЯ SPAMTRAP'ов адреса получателей, являющиеся spamtrap'ами, указываются в access-rcpt. 1. на этапе RCPT TO ответить 5xx, залистить хост в DNSBL. письмо будет доставлено получателям, адреса которых были указаны раньше адреса spamtrap'а. spamtrap@corvax.kiev.ua : submit_rbl reject : User unknown : Host sending message to spamtrap blacklisted 2. на этапе RCPT TO ответить 5xx, залистить хост в DNSBL. письмо не будет доставлено остальным получателям, клиенту будет возвращена ошибка 5xx в ответ на команду DATA. spamtrap@corvax.kiev.ua : submit_rbl reject reject_all : User unknown : Host sending message to spamtrap blacklisted 3. на этапе RCPT TO ответить 5xx, залистить хост в DNSBL. если до указания адреса spamtrap'ы были указаны другие адреса получателей, письмо будет доставлено в карантин. spamtrap@corvax.kiev.ua : submit_rbl reject quarantine_other : User unknown : Host sending message to spamtrap blacklisted 4. после приема письма ответить 5xx, залистить хост в DNSBL, содержимое письма отправить на автообучение spamassassin'у. spamtrap@corvax.kiev.ua : submit_rbl quarantine reject : User unknown : Host sending message to spamtrap blacklisted 5. после приема письма ответить 250, залистить хост в DNSBL, содержимое письма отправить на автообучение spamassassin'у. spamtrap@corvax.kiev.ua : submit_rbl quarantine : User unknown : Host sending message to spamtrap blacklisted ###################################################################### 9. ПЕРЕХОД С ПРЕДЫДУЩЕЙ ВЕРСИИ КОНФИГУРАТОРА переход с 4.64 на 4.67 осуществляется следующим образом: gmake sync && gmake stop && gmake upgrade && gmake sync && gmake sync && gmake fix pre-install && gmake configure system_filter install переход с 4.67 на 4.68 осуществляется следующим образом: gmake sync && gmake stop && gmake upgrade && gmake sync && gmake sync && gmake fix pre-install && gmake configure system_filter install