В зависимости от потребностей вашего узла, вы можете захотеть изменить те или иные конфигурационные параметры. Большинство из них устанавливаются опциями в файле конфигурации. Например, строка "O Timeout.queuereturn=5d" устанавливает опции "Timeout.queuereturn" значение "5d" (пять дней).
Многие из этих опций имеют подходящие для большинства узлов значения по умолчанию. Однако, на узлах с большой почтовой нагрузкой может понадобиться некоторая соответствующая настройка под их почтовую загрузку. В частности, на узлах, через которые проходит большое количество небольших почтовых сообщений, доставляемых многим получателям, может понадобиться подправить параметры, связанные с приоритетами очереди.
Все версии sendmail до 8.7 имели имена опций, состоящие из одного символа. С 8.7, опции имеют длинные (состоящие из нескольких символов) имена. Хотя старые короткие имена до сих пор принимаются, многие новые опции не имеют коротких эквивалентов.
Этот раздел описывает только те опции, которые вам, вероятно, захочется изменить; более детальное описание опций дано в разделе 5.
|
Секунды |
|
Минуты |
|
Часы |
|
Дни |
|
Недели |
connect | Время ожидания открытия SMTP соединения (системный вызов connect(2)) [0, неопределенное]. Если оно равно нулю, то используется значение из ядра системы. Эта опция ни в каком случае не может иметь значение больше, чем это позволяет ядро, но может быть меньше. Это сделано, чтобы обойти ядра, позволяющие абсурдно длительный таймаут соединения (в некоторых случаях 90 минут). |
iconnect | То же самое, что connect, кроме того, что оно применяется только для первичной попытки соединения с хостом для заданного сообщения [0, неопределенное]. Концепция такова: это значение должно быть очень небольшим (несколько секунд); хосты с хорошим соединением и отвечающие хосты, таким образом, будут обслужены немедленно. Медленные хосты не будут задерживать остальные доставки на стадии начальной попытки доставки. |
initial | Ожидание начального приветственного сообщения 220 [5m, 5m]. |
helo | Ожидание ответа на команду HELO или EHLO [5m, неопределенное]. Это может потребовать просмотра имени хоста, поэтому пять минут, возможно, вполне приемлемый минимум. |
mail| | Время ожидания ответа на команду MAIL [10m, 5m]. |
rcpt| | Время ожидания ответа на команду RCPT [1h, 5m]. Это значение должно быть большим, из-за того, что оно может указывать на список, и его расширение может занять много времени (смотри ниже). |
datainit| | Время ожидания ответа на команду DATA [5m, 2m]. |
datablock|= | Ожидание прочтения блока данных (то есть, тела сообщения). [1h, 3m]. Это значение должно быть большим, потому что оно также применяется к программам, которые могут достаточно медленно выводить данные в sendmail. |
datafinal| | Время ожидания ответа на точку, завершающую сообщение. [1h, 10m]. Если это значение короче, чем время, необходимое получателю для получения сообщения, будет сделана повторная передача. Это описывается в RFC 1047. |
rset | Время ожидания ответа на команду RSET [5m, неопределенное]. |
quit | Время ожидания ответа на команду QUIT [2m, неопределенное]. |
misc | Время ожидания ответа на различные (но короткие) команды, типа NOOP (нет операции) и VERB (переход в подробный режим). [2m, неопределенное]. |
command|= | Для сервера SMTP, время ожидания следующей команды. [1h, 5m]. |
ident= | Время ожидания ответа на запрос IDENT [30s1, неопределенное]. |
fileopen= | Таймаут на открытие файлов .forward и :include: [60сек, неопределенное]] |
control= | Таймаут на завершение полной транзакции управляющего сокета. |
hoststatus= | Сколько времени информация о хосте (например, о том, что он отключен) будет кэширована, прежде чем она устареет [30m, неопределеное]. |
resolver.retrans | Интервал времени (в секундах) между повторами определителя имён [различное]. Устанавливает сразу и Timeout.resolver.retrans.first и Timeout.resolver.retrans.normal. |
resolver.retrans.first | Интервал времени (в секундах) между повторами определителя имён при первой попытке отправки сообщения [различное]. |
resolver.retrans.normal | Интервал времени (в секундах) между повторами определителя имён для всех попыток отправки сообщения, кроме первой [различное]. |
resolver.retry | Количество попыток передачи запроса определителя имен (резолвера). Устанавливает сразу и Timeout.resolver.retry.first и Timeout.resolver.retry.normal. |
resolver.retry.first | Количество попыток передачи запроса определителя имен для первой попытки доставки сообщения [различное]. |
resolver.retry.normal | Количество попыток передачи запроса определителя имен для всех попыток доставки сообщения, кроме первой [различное]. |
Для совместимости со старыми файлами конфигурации, если ни одна подопция не определена, таймауты обозначенные знаком | устанавливаются равными указанному значению. Все, кроме обозначенных знаком = применяются к клиентскому SMTP.
Многие из минимальных значений в RFC 1123 слишком малы. Sendmail был разработан для протоколов RFC 822, которые не определяют таймауты чтения; следовательно, версии sendmail до 8.1 не гарантируют быстрого ответа на сообщения. В частности, команда "RCPT" определяющая список рассылки будет расширена и проверит весь список полностью; большой список на медленной системе может запросто занять времени больше, чем пять минут2. Я рекомендую таймаут в один час - так как обрывы соединения во время фазы RCPT достаточно редки, длительный таймаут не обременителен, но может сильно помочь в уменьшении загрузки сети и дубликатов сообщений.
Например, строки:
O Timeout.datablock=3h
Если сообщение передано с использованием расширения SMTP NOTIFY, предупредительные сообщения удут посланы только если указано NOTIFY=DELAY. Таймауты queuereturn и queuewarn могут быть далее квалифицированы тегом, основанным на поле Precedence: в сообщении; он может быть одним из "urgent" ("срочно") (ненулевое значение precedence), "normal" (нулевое значение precedence), или "non-urgent" (отрицательное значение precedence). Например, "Timeout.queuewarn.urgent=1h" устанавливает таймаут предупреждения только для срочных сообщений в один час. По умолчанию, если преимущество не указано - указывать таймаут для всех. Для возврата значений немедленно во время прохода очереди (то есть, для отброса сообщений независимо от времени их нахождения в очереди) можно использовать для -O Timeout.queuereturn значение "now".
Так как эти опции глобальны, и вы не знаете заранее, сколько времени хост вне вашего домена будет отключен, рекомендуемый таймаут составляет пять дней. Это позволяет получателю исправить проблему, даже если она случилась в самом начале длительных выходных. Секция 5.3.1.1 RFC 1123 говорит, что этот параметр должен быть "как минимум 4-5 дней".
Значение Timeout.queuewarn может быть вложено в опцию T указанием времени, по истечении которого должно быть послано предупреждение; два таймаута разделяются слешем. Например, строка
Если опция ForkEachJob не выставлена, sendmail не может использовать кэшированные соединения.
Размер сообщения здесь используется для того, чтобы более большие сообщения обрабатывались после относительно небольших. Класс сообщения позволяет пользователям посылать "высокоприоритетные" сообщения включая поле "Precedence:" в свои сообщения; Значение этого поля просматривается в строках P файла конфигурации. Вследствие того, что количество получателей сообщения может влиять на загрузку, оно также включено в приоритет.
Коэффициенты получателя и класса могут быть установлены в файле конфигурации, используя опции RecipientFactor (y) и ClassFactor (z) соответственно. По умолчанию, они равны: 30000 (для коэффициента получателя) и 1800 (для коэффициента класса). Первичный приоритет таков:
pri = msgsize - (class умноженный на ClassFactor) + (nrcpt умноженное на RecipientFactor)
(Запомните, более высокое значение этого параметра на самом деле означает, что работа будет обработана с низким приоритетом.)
Приоритет работы скорректирован при каждой обработке сообщения (то есть, при каждой попытке его доставки) использованием "рабочего коэффициента времени", установленного опцией RetryFactor (Z). Он добавляется к приоритету, поэтому обычно он уменьшает старшинство работы, на основании того, что работа, не выполненная много раз, вполне может быть не выполнена опять. Опция RetryFactor по умолчанию равна 90000.
pri > { QueueFactor } / { LA - { QueueLA } + 1 }
По умолчанию опция QueueFactor равна 600000, так что каждая единица средней загрузки стоит 600000 пунктов приоритета (как описано выше).
Для крутых случаев, опция RefuseLA (X) определяет среднюю загрузку, при которой sendmail будет отказываться принимать сетевые соединения. Локально созданная почта (включая входящую почту UUCP) будет приниматься.
|
Интерактивная доставка (синхронная) |
|
Доставка в фоне (асинхронная) |
|
Только очередь (не доставлять) |
|
Отложить попытку доставки (не доставлять) |
Есть и компромиссы. Режим "i" дает отправителю быстрейшую обратную связь, но может замедлить некоторые почтовые программы намного больше необходимого. Режим "b" доставляет быстро, но может наплодить кучу процессов, если ваша почтовая программа тратит много времени на доставку сообщений. Режим "q" минимизирует загрузку вашей машины, но доставка сообщений будет задержана до наступления очередного интервала. Режим "d" идентичен режиму "q", за исключением того, что он также предотвращает работу всех просмотров; он предназначен для узлов "dial on demand", где просмотр DNS может стоить реальные деньги. Некоторые простые сообщения об ошибках (например, host unknown) в этом режиме будут задержаны. По умолчанию обычно используется режим "b".
Если вы запускаете sendmail в режиме "q" (только очередь), "d" (отсрочка), или "b" (доставка в фоне), то он не будет разворачивать псевдонимы и следовать файлам .forward, вплоть до первого получения почты. Это ускоряет ответ на команду RCPT. Режим "i" не может быть использован сервером SMTP.
|
Минимальный протокол |
|
Серьезные системные ошибки и потенциальные проблемы безопасности |
|
Потери соединений (сетевые проблемы) и ошибки протокола |
|
Другие серьезные ошибки, неправильные адреса, временные ошибки forward/include, таймауты соединений. |
|
Несущественные неисправности, устаревание базы данных псевдонимов, отказы соединений из-за проверочных наборов правил (check_rulests) |
|
Статистика сбора сообщений |
|
Создание сообщений об ошибках, командах VRFY и EXPN. |
|
Ошибки доставки (хост или пользователь не известен и т.д.) |
|
Успешные доставки и перестроения базы псевдонимов. |
|
Отложенные сообщения (из-за того, что хост отключен и т.д.) |
|
Расширение базы данных (просмотры псевдонимов, перенаправлений и пользователей) |
|
Ошибки NIS и окончание обработок |
|
Протоколирование всех соединений SMTP. |
|
Протоколирование плохих пользовательских оболочек, файлов с несоответствующими пермиссиями, и других спорных ситуаций. |
|
Протоколирование всех отказов от соединений |
|
Протоколирование всех входящих и исходящих команд SMTP. |
|
Протоколирует попытки обработки заблокированных файлов в очереди. Это не ошибки, но может быть полезно, если ваша очередь становится перегруженной. |
|
Потерянные блокировки (только если вы используете lockf вместо flock). |
Дополнительно, значения выше 64 зарезервированы для очень болтливого вывода при отладке. Никто в здравом уме не поставит такой уровень.
Если вы не делаете sendmail setuid'ным на root, он все равно будет работать, но вы потеряете большиую часть функциональности и конфиденциальности, а так же вам придется открыть всем на запись каталог очереди. Также вы можете сделать sendmail setuid'ным на какого-либо псевдопользователя (например, создав пользователя "sendmail" и сделав sendmail setuid'ным на него) что исправит проблему конфиденциальности, но не вопросы функциональности. В некотоых операционных системах при этом появится проблема выдачи специальных привелегий. Также, это не будет являться гарантией безопасности: например, пользователь root посылает почту, и демон будет часто работать от пользователя root. Однако, нужно заметить, что sendmail должен работать от пользователя root или от специального пользователя для создания слушающего сокета SMTP.
В качестве компромисса можно сделать sendmail setuid'ным на пользователя root, но выставить опцию RunAsUser. В результате это заставит sendmail стать указанным пользователем сразу же после запуска, требующего привилегии пользователя root (главным образом, открытия порта SMTP). Если вы используете опцию RunAsUser, каталог очереди (обычно /var/spool/mqueue) должен принадлежать этому пользователю, а все файлы и базы данных (включая пользовательские файлы .forward, файлы псевдонимов, файлы :include:, и внешние базы данных) должны быть открыты для этого пользователя на чтение. Так же, так как sendmail не может изменить свой uid, доставка в программы или файлы будут отмечены как небезопасные, то есть недоставляемые в файлах .forward, aliases и :include:. Администраторы могут преодолеть это выставкой опции DontBlameSendmail в NonRootSafeAddr. RunAsUser скорее всего наиболее подходит для конфигурации на брандмауэрах, не имеющих регулярных заходов пользователей.
Если вы совершенно уверены, что ваша конфигурация находится в безопасности, и вы хотите, чтобы sendmail не производил таких проверок, вы можете отключить конкретные проверки, используя опцию DontBlameSendmail. Эта опция берет одно или более имен, для которых проверка отключена. В последующем описании под "небезопасным каталогом" считается каталог, в который может писать кто-либо еще кроме владельца. Значения могут быть такие:
Safe | Никакой специальной обработки |
AssumeSafeChown | Считать, что системный вызов chown запрещен пользователю root. Из-за того, что некоторые версии Unix разрешают обычным пользователям отдавать свои файлы другим пользователям на некоторых файловых системах, sendmail часто не может считать, что данный файл был создан владельцем, в частности, если он находится в откытом на запись каталоге. Вы можете выставить этот флаг, если вы знаете, что отдача файлов в вашей системе запрещена. |
ClassFileInUnsafeDirPath | Во время чтения файлов класса (используя строку F в файле конфигурации), разрешать файлы, находящиеся в небезопасных каталогах. |
DontWarnForwardFileInUnsafeDirPath | Предотвращает протоколирование предупреждений о небезопасных путях в каталоги для несуществующих файлов перенаправления. |
ErrorHeaderInUnsafeDirPath | Разрешить файлу названному в опции ErrorHeader находиться в небезопасном каталоге. |
FileDeliveryToHardLink | Разрешить доставку в файлы, являющиеся жесткими ссылками. |
FileDeliveryToSymLink | Разрешить доставку в файлы, являющиеся символическими ссылками. |
ForwardFileInGroupWritableDirPath | Разрешить файлы .forward в каталогах доступных на запись для группы. |
ForwardFileInUnsafeDirPath | Разрешить файлы .forward в небезопасных каталогах. |
ForwardFileInUnsafeDirPathSafe | Разрешить файлам .forward в небезопасных каталогахвключать ссылки на программы и файлы. |
GroupWritableAliasFile | Разрешить группе доступ по записи к файлу псевдонимов. |
GroupWritableDirPathSafe | Изменить определение "небезопасного каталога" так, чтобы каталоги, открытые на запись для группы считались безопасными. Каталоги, открытые на запись для всех всегда считаются небезопасными. |
GroupWritableForwardFileSafe | Разрешить файлы forward открытые на запись для группы. |
GroupWritableIncludeFileSafe | Разрешить файлы :include: открытые на запись для группы. |
HelpFileInUnsafeDirPath | Разрешить файлу, названному в опции HelpFile находиться в небезопасном каталоге |
IncludeFileInGroupWritableDirPath | Разрешить файлы :include: находящиеся в каталогах, открытых на запись для группы. |
IncludeFileInUnsafeDirPath | Разрешить файлы :include: находящиеся в небезопасных каталогах |
IncludeFileInUnsafeDirPathSafe | Разрешить файлам :include: находящимся в небезопасных каталогах включать ссылки на программы и файлы. |
InsufficientEntropy | Пытаться использовать STARTTLS, даже если PRNG для OpenSSL неправильно посеян, несмотря на проблемы безопасности. |
LinkedAliasFileInWritableDir | Разрешить файл псевдонимов, являющийся ссылкой в каталоге, открытом на запись. |
LinkedClassFileInWritableDir | Разрешить файлы классов, являющиеся ссылками в каталогах, открытых на запись. |
LinkedForwardFileInWritableDir | Разрешить файлы .forward, являющиеся ссылками в каталогах, открытых на запись. |
LinkedIncludeFileInWritableDir | Разрешить файлы :include:, являющиеся ссылками в каталогах, открытых на запись. |
LinkedMapInWritableDir | Разрешить файлы преобразований, являющиеся ссылками в каталогах, открытых на запись. |
LinkedServiceSwitchFileInWritableDir | Разрешить файлу сервисного переключателя быть ссылкой, даже если каталог открыт на запись. |
MapInUnsafeDirPath | Разрешить файлы преобразований (например, файлы hash, btree, и dbm) в небезопасных каталогах. |
NonRootSafeAddr | Не отмечать доставку в файлы и программы как небезопасные, если sendmail работает не от пользователя root. |
RunProgramInUnsafeDirPath | Поехали, давайте еще и запускать программы в каталогах, открытых на запись… |
RunWritableProgram | Ну, давайте еще и запускать те программы, в которые может писать и группа, и вообще кто угодно. |
TrustStickyBit | Разрешить каталоги, доступные группам и всем остальным на запись, если каталог имеет sticky bit. Не используйте в системах, которые не разрешают sticky bit для каталогов. |
WorldWritableAliasFile | Принимать файлы псевдонимов, открытые на запись для всех. |
WriteMapToHardLink | Разрешить запись в преобразования, являющиеся жесткими ссылками. |
WriteMapToSymLink | Разрешить запись в преобразования, являющиеся символическими ссылками. |
WriteStatsToHardLink | Разрешить файлу статуса быть жесткой ссылкой. |
WriteStatsToSymLink | Разрешить файлу статуса быть символической ссылкой. |
При попытке открыть соединение, первым проверяется кэш. Если найдено открытое соединение, оно проверяется на предмет активности посылкой команды RSET. Если произойдет ошибка, то соединение будет закрыто и заново открыто.
Кэшем соединений управляют два параметра. Опция ConnectionCacheSize (k) определяет количество позволенных одновременно открытых соединений. Если оно равно нулю, соединения будут закрываться, как только это станет возможным. По умолчанию оно равно одному. Его можно установить такого размера, как вам потребуется; оно будет ограничивать количество системных ресурсов, используемых sendmail при обработке очереди. Никогда не устанавливайте это значение больше 4.
Опция ConnectionCacheTimeout (K) определяет максимальное время бездеятельности любого кэшированного соединения. Когда время простоя превысит это значение, соединение будет закрыто. Это число должно быть небольшим (до 10 минут), чтобы вы не занимали системные ресурсы других машин. Значение по умолчанию пять минут.
Однако, некоторые системы (типа SunOS 4.x) будут производить просмотр DNS независимо от установленных значений сервисного переключателя. В частности, системная подпрограмма gethostbyname(3) используется для просмотра имен хостов, а многие версии поставщиков пытаются использовать комбинации DNS, NIS, и просмотр файла /etc/hosts без консультации с сервисным переключателем. Sendmail не пытается обойти эту проблему, и просмотр DNS будет сделан в любом случае. Если же у вас вообще не сконфигурирован сервер имен, например, у вас чисто UUCP узел, sendmail будет получать сообщения "connection refused" при попытке соединения с сервером имен. Если вхождение hosts переключателя имеет перечисленным в любом месте списка сервис "dns", sendmail будет считать это временной неудачей и поставит сообщение в очередь для последующей обработки; другими словами, он игнорирует данные сервера имен.
Такая же технология используется при решении о просмотре MX. Если вы хотите иметь поддержку MX, вы должны иметь "dns" перечисленным как сервис во вхождении hosts переключателя.
Опция ResolverOptions (I) позволяет вам изменять опции сервера имен. Командная строка принимает последовательность флагов, как описано в resolver(3) (с удаленным первым "RES_"). Каждый из них может быть предварен опциональным "+" или "-". Например, строка
Версия конфигурации уровня 1 выключает DNSRCH и DEFNAMES для просмотров, делаемых при доставке, но оставляет их включенными во всех остальных случаях. Версия 8 sendmail игнорирует их при канонификационных просмотрах (при использовании $[ ... $]), и всегда делает поиск. Если вы не хотите автоматического расширения имен, не вызывайте $[ ... $].
Правила поиска для $[ ... $] - это скорее что-то непохожее, чем необычное. Если просматриваемое имя имеет хотя бы одну точку, оно всегда будет опробовано без изменений. Если это не удастся, будет опробован уменьшенный путь поиска, и в конце концов будет опробовано неизмененное имя (но только для имен без точек, потому что имена с точками уже были опробованы). Это позволяет именам типа "utc.CS" совпадать с узлами в Чехословакии, а не с узлами в вашем местном отделении Computer Science. Они также предпочитают записи типов A и CNAME записям типа MX- поэтому, если находится запись MX, о ней делается заметка, но просмотр продолжается. Таким образом, если вы имеете масочную запись MX, соответствующую вашему домену, то это не будет распознано, как будто все имена совпадают с ней.
Для полного выключения доступа к серверу имен в, системах без поддержки сервисного переключателя (типа SunOS 4.x), вы должны будете перекомпилировать sendmail с -DNAMED_BIND=0 и удалив -lresolv из списка искомых при линковании библиотек.
Опция ForwardPath (J) позволяет вам назначить путь к файлам перенаправления. Например, строка файла конфигурации
Если вы создаете каталог типа /var/forward, он должен иметь пермиссии 1777 (то есть, должен быть выставлен sticky bit). Пользователи должны создавать файлы с пермиссиями 644. Заметьте, что для разрешения файлов перенаправления в каталоге, открытом всем на запись, вы должны использовать флаги ForwardFileInUnsafeDirPath и ForwardFileInUnsafeDirPathSafe с опцией DontBlameSendmail. Это может быть использовано для атак типа "отказ от обслуживания (DoS) (пользователи могут создавать файлы перенаправления для других пользователей); наилучшим подходом может быть создание каталога /var/forward с доступом 755 и созданием в нём пустых файлов для каждого пользователя, принадлежащих данным пользователям с доступом 644. Если вы сделаете так, то вам не прийдется выставлять опции DontBlameSendmail, как указано выше.
Не устанавливайте значение этой опции слишком высоким; это может повлечь отказ от почты в тех случаях, когда она может быть спокойно обработана.
Опция принимает последовательности имен флагов; крайняя конфиденциальность - включение всех этих флагов. Например:
Флаги подробно описаны в разделе 5.6.
1. В некоторых системах по умолчанию нуль, чтобы окончательно отключить протокол. [назад]
2. Эта проверка включает просмотр каждого адреса сервером имен; что добавляет сетевые задержки, но в некоторых случаях может быть приемлемо. [назад]