Почтмейстер sendmail
Категория: Электронная почта | Автор: admin | 23-05-2010, 23:18 | Просмотров: 4634

Программа sendmail — самая сложная и самая полная из широко используемых систем транспортировки электронной почты. Ее написал Эрик Оллман (Eric Allman), будучи студентом Калифорнийского университета Беркли. Он как раз заканчивал курс по вычислительной технике, в процессе изучения которого работал с системами промышленного уровня. Эрик решил аналогичным образом подойти к проблеме доставки почты. В то время такой подход казался ему погоней за мухой с кувалдой, и он собирался со временем, разобравшись как следует в проблеме, использовать более простые методы.

Однако оказалось, что универсальность программы sendmail позволила Эрику идти в ногу с быстро изменяющимся миром стандартов электронной почты. Некоторые важнейшие стандарты находились в стадии доработки и изменялись чуть ли не каждую неделю. Эрик понял, что муха, за которой он гонялся, на самом деле — слон и силы его кувалды едва хватает.

Программа sendmail может адаптироваться к причудам создателей стадартов благодаря гибкости своего файла конфигурации, который позволяет ей удовлетворять потребностям очень разнородного сообщества пользователей. Поэтому остальная часть данной главы посвящена описанию структуры этого файла, называющегося sendmail.cf.

Программа sendmail — это транспортный агент, программа-связка между пользовательскими агентами и агентами доставки. Она работает по протоколу SMTP и доставляет сообщения на удаленные компьютеры через Internet. Программа sendmail выполняет следующие задачи:

  • управляет сообщениями после того, как они были сгенерированы пользователями;
  • анализирует адреса получателей;
  • выбирает соответствующий агент доставки или транспортный агент;
  • преобразует адреса в форму, понятную агенту доставки;
  • осуществляет необходимое переформатирование заголовков;
  • передает преобразованное сообщение агенту доставки.

Программа sendmail также генерирует сообщения об ошибках и возвращает сообщения отправителю, если их оказалось невозможно доставить.

 

История программы sendmail

 

Программа sendmail версии 5 написана Эриком Оллманом в 1983 году. Один из ее вариантов был доработан Леннартом Левстрандом (Lennart Luvstrand) из Линчепингского университета (Швеция) в 1987 г. и назван IDA sendmail. Сопровождением этой версии занимались Нил Рикерт (Neil Rickert) и Пол Поумз (Paul Pomes). Другой вариант, King James Sendmail (KJS), разработан Полом Викси (Paul Vixie) из компании DEC на протяжении 1989—1993 гг. Он основан на версии IDA sendmail, но акцент сделан на повышении производительности и пропускной способности коммерческих узлов. В IDA и KJS впервые были реализованы некоторые возможности, которые теперь включены в sendmail версии 8 (написана Эриком Оллманом в 1993 году).

На момент написания этой книги большинство реализаций программы sendmail, предлагаемых производителями операционных систем, основаны на версии 8. Однако обычно они на один-два выпуска отстают от версии, выпускаемой компанией Sendmail, Inc. Производители чаще всего просто настраивают под свою систему определенную версию sendmail, а затем отказываются модифицировать ее с учетом текущих версий программы. Перечень систем, а также информация о том, какие версии sendmail в них включены, приведены в табл. 19.5.

Мы опишем программу sendmail версии 8.11 и совсем не будем касаться версий 5 и IDA, поскольку они устарели. В версии 8 используется макропроцессор m4, облегчающий создание файла конфигурации для стандартных ситуаций (в большинстве организаций больше ничего и не требуется).

К сожалению, при возникновении проблем с конфигурацией sendmail придется заниматься отладкой исходного файла конфигурации. Нам доводилось слышать о нем такие нелестные отзывы, как "непостижимый", "устрашающий", "крайне тяжелый", "загадочный", "оставляющий тягостное впечатление", "мерзкий", "утомляющий", "издевательский", "запутанный", "громоздкий", "нелепый", "сбивающий с толку", "закрученный" и еще много чего. В предыдущем издании книги описание этого файла занимало более 20 страниц. В этом издании из сострадания мы предлагаем читателям обратиться к руководству "Sendmail Installation and Operations Guide" авторства Эрика Оллмана и Брайана Косталеса (Bryan Costales), поставляемому вместе с программой.

 

Версии программы sendmail, поставляемые производителями систем

 

В табл. 19.5 перечислены версии sendmail, поставляемые с нашими тестовыми операционными системами. В таблице также указано, где находится исполняемый файл и файл конфигурации sendmail.cf. Для сравнения в перечень включена также стандартная реализация, находящаяся на Web-узле www.sendmail.org.

Таблица 19.5. Версии программы sendmail, поставляемые производителями систем (на 2000 год)

Система

Версия кода

Версия

конфигурации

Каталог для

двоичного кода

Каталог для

конфигурации

sendmail.org

8.11.0

8.11.0

/etc/mail

Solaris 7

8.9.31

8.9.1

/usr/lib

/etc/mail

HP-UX 11.00

8.8.6

8.8.6

/usr/sbin

/etc/mail

Red Hat Linux 6.2

8.9.3

8.9.3

/usr/sbin

/etc

FreeBSD 4.0

8.9.3

8.9.3

/usr/sbin

/etc

1   Адаптирована компанией Sun.

 

Появление новых выпусков программы sendmail зачастую вызвано проблемами с безопасностью. Поэтому мы рекомендуем посетить ссылку "Release Notes" на сервере www.sendmail.org и загрузить соответствующие "заплаты" Для их подключения потребуются компилятор языка С и препроцессор m4 (они обычно входят в стандартную поставку UNIX).

 

Иногда трудно определить, какой выпуск sendmail установлен в системе. Попробуйте выполнить команду

# /usr/sbin/sendmail –d0.l -bt < /dev/null

 

которая заставит программу сообщить свою базовую версию, параметры компиляции и свои идентификационные имена, найденные после чтения файла конфигурации. Флаг -d задает уровень отладки (об этом рассказывается в параграфе 19.12), флаг -bt переводит программу в режим тестирования адреса, а чтение входного потока из устройства /dev/null приводит к тому, что адрес для тестирования будет отсутствовать. Результат работы команды будет примерно таким:

 

Version 8.9.3

Compiled with: MAP_REGEX LOG MATCHGECOS MIME7T08 MIME8T07

NAMED_BIND NDBM NETINET NETUNIX NEWDB NIS NISPLUS QUEUE

SCANF SMTP USERDB XDEBUG

============= SYSTEM IDENTITY (after readcf) ==========

(short domain name)  $w = katroo

(canonical domain name) $j = katroo.Sendmail.COM

(subdomain name) $m = Sendmail.COM

(node name) $k = katroo.Sendmail.COM

=======================================================

 

 

 

Программа sendmail должна использовать записи MX службы DNS, поэтому ее всегда следует компилировать с установленной опцией NAMED_BIND (как в приведенном примере).

 

Инсталляция программы sendmail

 

В этом разделе мы кратко опишем процесс инсталляции программы sendmail. За всевозможными подробностями, а также за информацией, касающейся конкретных операционных систем, обращайтесь к примечаниям по инсталляции, которые включены в дистрибутив sendmail. Если программа уже инсталлирована в системе и производится лишь ее замена, может оказаться, что некоторые этапы (например, инсталляцию файлов помощи) осуществлять не придется.

Для работы программы требуются:

  • двоичный файл sendmail, который обычно инсталлируется в каталог /usr/sbin или /usr/lib и запускается с правами пользователя root (код прав доступа — 4755);
  • файл конфигурации /etc/mail/sendmail.cf, устанавливаемый системным администратором;
  • каталог очереди /var/spool/mqueue, созданный администратором вручную (код прав доступа — 700, владелец — root);
  • различные ссылки на sendmail (newaliases, mailq, hoststat и пр.);
  • безопасные локальные агенты доставки (smrsh и mail.local), обычно устанавливаемые в каталог /usr/libexec.

Последнюю версию программы можно загрузить с узла www.sendmail.org. Для компиляции и инсталляции пакета запустите сначала сценарий Build, а затем — Build install.

Однако до начала компиляции нужно определиться в отношении формата базы данных, а также стратегии взаимодействия с административными базами данных, такими как NIS, NIS+, Netlnfo или даже Hesiod. Для баз данных, хранящихся на диске, мы рекомендуем пакет Berkeley DB, указанный в файле Makefile как NEWDB. Только не редактируйте файл Makefile, а создайте свой файл site.config.m4, посредством которого будет осуществляться настройка и установка опций программы sendmail. Например, в случае использования протокола LDAP создайте файл site.config.m4 со следующими строками:

 

define(‘confMAPDEF’,   ‘-DLDAPMAP’)

define ('confLIBS',   '-lldap -liber')

 

 

Затем скомпилируйте программу при помощи такой команды:

 

# sh ./Build -с -f site.config.m4
 

 

Программа sendmail обычно не работает под управлением демона inetd, поэтому должна явно запускаться из rc-файлов в процессе начальной загрузки системы. Обычно это делается так:

 

if [-f /usr/sbin/sendmail -a -f /etc/mail/sendmail.cf];

then

   (cd /var/spool/mqueue; rm -f [tTx]f*)

   /usr/sbin/sendmail -bd -q30m &

   echo -n '  sendmail1 > /dev/console

fi

 

 

В данном случае производится проверка двоичного файла и файла конфигурации, а затем программа запускается в режиме демона. Если компьютер не является почтовым сервером, а на нем нужно запустить sendmail, можно сконфигурировать компьютер в качестве "нулевого клиента" и не вызывать программу в режиме демона (т.е. не указывать ключ -bd). Таким образом, она не будет принимать запросы на подключение из Internet.

 

Приведенный фрагмент следует добавить в файл /etc/rc (для BSD-систем) или /etc/init.d/sendmail (для систем System V). Можно также воспользоваться более сложным сценарием из руководства по инсталляции, который пытается удалять файлы из прерванных очередей сообщений.

Этот сценарий работает с одним каталогом очереди. Если их несколько, сценарий усложнится (см. раздел "Очередь почтовых сообщений").

Традиционно файлы, необходимые программе sendmail, располагались в таких каталогах, как /usr/lib, /etc, /usr/ucblib и /usr/share. Начиная с версии 8.10 предполагается, что все файлы хранятся в подкаталогах каталога /etc/mail . Надеемся, что поставщики систем поймут этот намек и будут располагать файлы в каком-то одном месте.

 

Файл переключения сервисов

 

Во многих операционных системах имеется специальный конфигурационный файл, называемый файлом переключения сервисов. В нем перечислены методы, которые могут быть использованы для выполнения стандартных запросов, в частности поиска компьютеров и пользователей. Этот файл также определяет порядок применения методов поиска в случаях, когда для данного типа запроса указано более одного метода.

 

Обычно программы не заботятся о наличии файла переключения сервисов. Однако программа sendmail слишком педантична и тщательно контролирует операции поиска. В Solaris, например, она читает файл переключения сервисов напрямую. В других версиях UNIX у нее есть свой собственный персональный вариант этого файла.

В файле переключения сервисов имеются два поля, которые влияют на почтовую систему: aliases и hosts. Возможные значения поля hosts таковы: dns, nis, nisplus и files. Поддержка всех механизмов поиска (за исключением файлового) должна быть встроена в двоичный файл sendmail на этапе компиляции.

По умолчанию файл переключения сервисов программы sendmail называется /etc/mail/service.switch. Он содержит следующие записи:

 

aliases    files nisplus nis # если программа компилируется с

                            #поддержкой служб nis/nis+

hosts       dns nisplus nis files

 

 

Если в строке hosts присутствует элемент dns, то программа sendmail будет осуществлять поиск записей MX службы DNS, даже когда элемент nis указан первым.

 

Режимы работы

 

Программа sendmail может работать в нескольких режимах, которые задаются с помощью флага -b. Он всегда используется в сочетании с другим флагом, определяющим роль, которую предстоит играть программе. Допустимые значения флагов перечислены в табл. 19.6.

Таблица 19.6. Флаги командной строки для основных режимов работы программы sendmail

Флаг

Назначение

-bd

Работа в качестве демона, прослушивание порта 25

-bD

Работа в качестве демона, но в интерактивном, а не фоновом режиме1

-bh

Отображение информации о последнем соединении (то же, что программа hoststat)

-bН

Удаление с диска старой информации о соединениях (то же, что программа purgestat)

-bi

Инициализация хэшированных псевдонимов (то же, что программа newaliases)

-bp

Печать содержимого очереди сообщений (то же, что программа mailq)

-bt

Включение режима проверки адресов

-bv

Только проверка адресов, почта не отправляется

-bs

Включение режима SMTP-сервера (чтение данных из стандартного входного потока, а не из порта 25)

1   Режим применяется при отладке, поскольку будут отображаться сообщения об ошибках.

 

Если входящая почта будет поступать по сети, программу sendmail следует запускать в режиме демона (-bd). В этом режиме программа прослушивает сетевой порт 25 и ожидает поступления запросов. Обычно указывается также флаг -q, который назначает интервал обработки очереди почтовых сообщений. Например, флаги -q30m и –q1h задают обработку очереди каждые 30 минут и 1 час соответственно.

Программа sendmail обычно старается доставить сообщение немедленно, не записывая его в очередь. Если же компьютер слишком занят или адресат недоступен, программа ставит сообщение в очередь, а через некоторое время вновь пытается отправить его. Каждый раз, когда программа обрабатывает очередь, она порождает дочерний процесс, поэтому интервалы обработки не следует устанавливать слишком маленькими. В документе RFC 1123 рекомендуется делать этот интервал равным минимум 30 минутам. Поскольку программа осуществляет блокировку рабочих файлов, одновременные обращения к очереди не вызывают конфликтов.

Программа sendmail читает свой файл конфигурации, sendmail.cf, только при запуске. Поэтому при изменении файла конфигурации нужно либо уничтожать и перезапускать процесс sendmail, либо посылать процессу сигнал отбоя (HUP). Программа создает файл sendmail.pid, содержащий идентификатор процесса sendmail и команду, использованную для его запуска. При вызове программы нужно указывать абсолютный путь, так как она перезапускает себя с помощью функции ехес() в ответ на сигнал отбоя. Наличие файла sendmail.pid позволяет уничтожать процесс командой

# kill -HUP 'head -1 sendmail.pid'

 

Раньше местоположение PID-файла задавалось при компиляции, но сейчас оно может устанавливаться в конфигурационном mc-файле при помощи опции confPID_FILE:

define(confPID_FILE,   '/var/run/sendmail.pid')

 

В BSD-системах PID-файл по умолчанию называется /var/run/sendmail.pid а в остальных — /etc/sendmail.pid

 

Очередь почтовых сообщений

 

Если компьютер слишком загружен и не может доставить сообщение немедленно либо недоступен адресат, сообщение записывается в каталог очереди. Этот каталог обычно называется /var/spool/mqueue, его владельцем является пользователь root, а код режима доступа равен 700. Все сообщения, поступающие от пользовательского агента, на короткое время попадают в очередь.

Программа sendmail способна работать с несколькими очередями одновременно. Если каталог mqueue содержит подкаталоги ql, q2 и q3 и каталог очереди задается как /var/spool/mqueue/q, то будут использоваться все три очереди. Это улучшает производительность при высокой загрузке почтовой системы.

Когда сообщение ставится в очередь, оно записывается по частям в разные файлы Имя каждого из этих файлов содержит двухбуквенный префикс, обозначающий часть сообщения, и случайный идентификатор, который образуется из идентификатора процесса sendmail. Данный идентификатор не является константой, потому что программа sendmail постоянно порождает новые процессы. Части, на которые может быть разделено сообщение, перечислены в табл. 19.7.

Таблица 19.7. Префиксы файлов сообщений в очереди

Префикс

Содержимое файла

qf

Заголовок сообщения и управляющий файл

df

Тело сообщения

tf

Временная версия файла qf на случай, когда производится его обновление

Tf

Означает, что было сделано 32 и более безуспешных попыток блокировки

Qf

Означает, что сообщение отброшено и не может быть возвращено

Xf

Временный файл сообщений об ошибках, поступающих от агентов доставки

 

Если в каталоге очереди имеются подкаталоги qf, df или xf, то в них будут размещаться соответствующие части сообщения. Файл qf содержит не только заголовок сообщения, но и сведения о получателях, отправителе, дате, когда оно должно быть возвращено из-за невозможности доставки, приоритете сообщения в очереди и причине, по которой оно там находится. Каждая строка начинается однобуквенным кодом, который идентифицирует остальную часть строки.

Для каждого сообщения, которое ставится в очередь, должны существовать файлы qf и df. Все остальные файлы используются программой sendmail при попытках доставить сообщение. При перезагрузке компьютера после краха необходимо удалять файлы tf, xf и Tf из каждого каталога очереди. Системный администратор, отвечающий за работу почтовой системы, должен периодически проверять файлы Qf на предмет того, не стали ли причиной возврата сообщения ошибки локальной конфигурации.

Очередь сообщений может стать причиной конфликтов в нескольких ситуациях. Во-первых, может переполниться файловая система (поэтому по возможности не помещайте каталоги /var/spool/mqueue и /var/spool/news в один раздел). Во-вторых, может переполниться сама очередь. Наконец, в очереди могут появиться "осиротевшие" сообщения.

Программа sendmail имеет опцию управления дисковым пространством (confMIN_FREE_BLOCKS). Если файловая система, которая содержит очередь сообщений, переполняется, то почта не принимается, и до тех пор, пока не освободится место на диске, будет выдаваться сообщение "try again later" (попробуйте позднее). Причем прием почты останавливается раньше, чем диск переполнится и система зависнет.

Если выйдет из строя основной концентратор почты, то резервные МХ-узлы окажутся перегружены тысячами сообщений. В этой ситуации программа sendmail может породить слишком много экземпляров самой себя и тем самым "монополизировать" систему. Если очередь переполнилась, нужно переместить ее во временный каталог, продолжить обработку новой почты в обычном режиме, а когда все стабилизируется — запустить отдельный экземпляр sendmail для обработки переполненной очереди.

 

Вот пример для одного каталога очереди:

 

# kill   ‘head -1 sendmail.pid'

# mv queue cloggedqueue    /* В другую файловую систему,

                            если необходимо */

# mkdir mqueue             /* Задаем владельца и права доступа */

# chown root mqueue

# chmos 700 mqueue

# /usr/sbin/sendmail -bd –g1h &

 

 

Когда все нормализуется, запустите программу sendmail с такими флагами:

# /usr/lib/sendmail -oQ/var/spool/cloggedqueue -q

 

Эти флаги указывают программе, где находится каталог переполнившейся очереди, и дают ей команду немедленно обработать данную очередь. Повторяйте эту команду до тех пор, пока очередь не очистится.

Если размеры очередей огромны, сортируйте сообщения по разным очередям на основании последней цифры идентификатора сообщения, как показано в следующем сценарии:

 

#!/bin/csh -f

foreach suffix (0 1 2 3 4 5 6 7 8 9)

mkdir clog$( suffix}

mv ?f*${suffix) clog$(suffix)

sendmail -oQclog$(suffix)

end

 

 

Цель разбиения очереди — уменьшить время поиска в каталоге. Десять маленьких очередей обрабатываются быстрее одной большой, поскольку скорость работы программы sendmail больше зависит от производительности подсистемы ввода/вывода, чем от мощности процессора.

Момент переполнения очереди зависит от размеров организации и аппаратных средств, на которых работает программа sendmail. Естественно, у обычной рабочей станции и у концентратора почты на узле aol.com, обрабатывающего миллионы сообщений в день, будут разные критерии, по которым определяется, переполнена очередь или нет.


 (голосов: 0)
Версия для печати | Комментариев: 0
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.


 
Логин
Пароль
 

 
Locations of visitors to this page