Мы — долго запрягаем, быстро ездим, и сильно тормозим.
|
||||||||||
www.lissyara.su
—> документация
—> EXIM
|
|
Exim различает этот случай, и случай локально выполняющегося пользовательского агента, использующего опцию
“-bs
”, путём проверки, является ли стандартный ввод - сокетом. Когда это так, тот или другой порт должен быть привелигированным (меньше 1024), или вызывающий должен быть root или пользователь exim`a. Если любой другой пользователь передаётсокет с непривелигированным номером порта, exim выводит сообщение в стандартный поток ошибок, и выходит с кодом ошибки.
“
По умолчанию, exim не создаёт вхождения логов для соединения и отключений удалённых хостов (или через даемона, или через inetd
”), если разъединение было ожидаемым. Можно записывать такие вхождения, путём установки селектора логов
“smtp_connection
”.
“
Команды от удалённого хоста, как предполагается, должны быть завершены CR и LF. Однако, известны хосты не посылающие символ CR. Чтобы быть в состоянии работать с такими хостами, exim обходится с LF как с символом конца строки. Кроме того, поскольку для получения сообщений из всех источников используется общий код, самостоятельный CR интерпретируется как признак конца строки. Однако, последовательность CR, точка, CR
” не завершает входящие по SMTP данные.
“
Одна область, иногда дающая начало проблемам, касается команд EHLO или HELO. Некоторые клиенты посылают синтаксически недопустимые версии этих команд, которые, по умолчанию, отклоняются exim`ом. (Это - неимеет отношения к проверке посылаемых данных, таким образом, helo_verify_hosts
” - неуместна.) Вы можете сказать exim`y не применять проверку синтаксиса, путём установки
“helo_accept_junk_hosts
” в соответствие кривым хостам, посылающим недопустимые команды.
“
Количество доступного дискового пространства проверяется каждый раз при получении команды MAIL, независимо от того, сконфигурирована ли message_size_limit
” или
“check_spool_space
”, если
“smtp_check_spool_space
” не установлена в ложь. Если места недостаточно, даётся временная ошибка. Если установлена
“check_spool_space
”, проверка - на необходимое количество свободного места, плюс значение данное с SIZE, т.е. эта проверка будет проверять, что добавление входящего сообщения не уменьшит место ниже порога.
“
Когда сообщение успешно принято, exim включает локальный идентификатор сообщения в его ответ на финальную .
”, которая завершает данные. Если удалённый хост логгирует этот текст, он может помочь в трассировке - что случилось с сообщением.
“
Даемон exim`a может огриничить число одновременных входящих соединений, которые он готов обработать (смотрите опцию smtp_accept_max
”). Также, он может ограничить число одновременных вхосдящих оединений от одного удалённого хоста (смотрите опцию
“smtp_accept_max_per_host
”). Дополнительные попытки соединения отклоняются, используя 421 код временной ошибки SMTP.
“
Даемон exim`a не полагается на сигнал SIGCHLD, для детектирования, когда завершён подпроцесс, поскольку он может потеряться в загруженные моменты. Вместо этого, он при каждом пробуждении ищет завершённые субпроцессы. При условии, что происходят другие события (новые входящие вызовы, запуск обработчика очереди), завершивишиеся процессы уведомляются, и аккуратно убираются. В очень спокойных системах, иногда, вы можете увидеть слоняющиеся умершие
” процессы exim`a. Это не проблема; он будет замечен когда даемон проснётся в следующий раз.
“
Когад exim работает как даемон, он может резервировать некоторые слоты SMTP для специфических хостов, и, также, может быть установлен на отклонение SMTP вызовов от нерезервированных хостов во время высокой загрузки системы - для деталей, смотрите опции smtp_accept_reserve
”,
“smtp_load_reserve
” и
“smtp_reserve_hosts
”. Проверка загрузки происходит в обих случаях - даемоне и
“inetd
”.
“
Обычно, exim запускает процесс доставки для каждого полученного сообщения, хотя, это может быть изменено опцией командной строки -odq
”, и опциями
“queue_only
”,
“queue_only_file
”, и
“queue_only_load
”. Число одновременно работающих процессов доставки, начатых таким образом из ввода SMTP, может быть ограничено путём опций
“smtp_accept_queue
” и
“smtp_accept_queue_per_connection
”. Когда тот или другой лимит ичсерпан, последующие принятые сообщения просто кладутся во входную очередь, без запуска процесса доставки.
“
Средства управления, которые связаны с подсчётом входящих вызовов SMTP ((smtp_accept_max
”,
“smtp_accept_queue
”,
“smtp_accept_reserve
”) недоступны, когда exim запущен из даемона
“inetd
”, поскольку, в этом случае каждое соединение обрабатывается полностью независимым процессом exim`a. Однако, управление путём средней загрузки, доступно с
“inetd
”.
“
Exim может быть сконфигурирован на проверку адресов во входящих SMTP командах, как они получены. Смотрите раздел 39, для деталей. Он, также, может быть сконфигурирован на перезапись адресов в это время - до какой-либо проверки синтаксиса. Смотрите раздел 39.9.
Также, exim может быть сконфигурирован на ограничение частоты, с которой клиентский хост посылает команды MAIL и RCPT в одной SMTP-сессии. Смотрите опцию smtp_ratelimit_hosts
”.
44.4 Нераспознанные SMTP-команды
Если exim получает более чем
“smtp_max_unknown_commands
” нераспознанных SMTP команд в одном SMTP соединении, он разрывает соединение после ответа о ошибке на последнюю команду. Значение по умолчанию для
“smtp_max_unknown_commands
” - 3. Это - оборона против некоторых видов злоупотреблений, которые ломают WEB-сервера для создания соединения к SMTP-портам; в этих обстоятельствах, вначале посылаются несколько не-SMTP строк.
44.5 Синтаксис и ошибки протокола в командах SMTP
Синтаксическая ошибка детектируется, если команда SMTP распознана, но есть синтаксически неверные данные, например, неверно сформированный адрес электронной почты в команде RCPT. Ошибки протокола включают недопустимую последовательность команд, типа RCPT до MAIL. Если exim принимает более чем
“smtp_max_synprot_errors
” таких команд, в одном SMTP cоединении,он разрывает соединение после отсыла сообщения о ошибке на последнюю команду. Значение по умолчанию для
“smtp_max_synprot_errors
” - 3. Это - защита против кривых клиентов, которые циклически посылают неверные команды (да, было такое замечено).
44.6 Использование непочтовых SMTP команд
“non-mail
” команды SMTP - прочие кроме MAIL, RCPT, и DATA. Exim считает такие команды, и разрывает соединение если их слишком много в одной сессии SMTP. Это действие ловит некоторые попытки DoS, и вещи типа повторяющихся неудачных AUTH, или безумных клиентов, циклически посылающих HELO. Глобальная опция
“smtp_accept_max_nonmail
” задаёт,
“как много
” - это много. Её значение по умолчанию - 10.
“
Когда ожидается новое сообщение, один случай RSET - не подсчитывается. Этим позволяется клиенту послать один RSET до сообщения (это не необходимо, но обычно клиенты так делают). Также, exim позволяет одно неподсчитываемое HELO или EHLO, и один STARTTLS до сообщения. После начала сессии TLS, ожидается иной EHLO, и, он также не подсчитывается.
Первое возникновение AUTH в соединении, или немедленно после STARTTLS - также не подсчитывается. Иначе, подсчитываются все иные команды, кроме MAIL, RCPT, DATA, и QUIT.
Вы можете управлять, какие хосты подчиняются ограничению, устанавливаемому путём smtp_accept_max_nonmail
” путём установки
“smtp_accept_max_nonmail_hosts
”. Значение по умолчанию -
“*
”, которое применяет ограничения ко всем хостам. Эта опция средство для того, чтобы вы могли исключить некоторые специфические хосты с плохим поведением, с которыми вы должны жить.
44.7 Команды VRFY и EXPN
Когда exim получает команду VRFY или EXPN по TCP/IP соединению, он запускает ACL заданную путём
“acl_smtp_vrfy
” или
“acl_smtp_expn
” (соответственно), чтобы решить, должны ли команда быть принята. Если нет заданных ACL, команда отклоняется.
“
Когда VRFY принимается, она запускает тот же самый код, как когда exim вызывается с опцией -bv
”.
“
Когда принимается EXPN, производится одноуровневое раскрытие адреса. EXPN обрабатывается как тестирование адреса
” (подобно опции
“-bt
”), а не проверка (опция
“-bv
”). Если как аргумент EXPN даётся неквалифицированная локальная часть, она квалифицируется с
“qualify_domain
”. Отклонения команд VRFY и EXPN логгируются в главном логе, и логе отклонённых, и ошибки проверки VRFY логгируются в главном логе для последовательности с ошибками RCPT.
44.8 Команда ETRN
RFC1985 описывает команду SMTP называемую ETRN, которая спроектирована для борьбы с проблемами безопасности команды TURN (которая вышла из употребления). Когда exim получает команду ETRN в TCP/IP соединении, он запускает ACL заданную путём
“acl_smtp_etrn
”, чтобы решить, должна ли быть принята команда. Если нет заданных ACL, команда отклоняется.
“
Команда ETRN имеет отношение к выпуску сообщений, ожидающих доставки на определённые хосты. Поскольку exim не организовывает свою очередь сообщений по хостам, по умолчанию поддерживается лишь форма ETRN, где текст начинается с преффикса #
”, когда остаток текста задаёт сервер SMTP. Допустимая команда ETRN вызывает запуск exim с опцией
“-R
”, с остатком от текста ETRN как аргумента. Например:
|
запускает команду
|
которая вызывает попытку доставки всех сообщений, чей недоставленный адрес содержит текст
“brigadoon
”. Когда установлена
“smtp_etrn_serialize
” (по умолчанию), exim предотвращает одновременное выполнение более чем одного запуска очереди с той же самой строкой аргументов, как результат команды ETRN. Это останавливает клиентов с плохим поведением от запуска более чем одного обработчика очереди за раз.
“
Exim осуществяет преобразование в последовательную форму при помощи БД подсказок, в которую делается запись при каждом запуске процесса путём ETRN, и удаления, когда процесс завершён. Однако, exim не оставляет сессию SMTP ждать завершения процесса ETRN. Как только ETRN принята, клиенту посылается успешный код возврата. Очевидно, есть границы действия для записей подсказок, т.к. могла быть системная или программная ошибка (crash). Для принятия мер против этого, exim игнорирует любые записи, которые старше шести часов.
Для большего управления, чем даёт ETRN, может использоваться опция smtp_etrn_command
”. Она задаёт команду, которая запускается при кадом получении ETRN, вне зависимости от аргументов. Например:
|
Строка разделяется на аргументы, которые незавсисмо раскрываются. Переменная раскрытия
“$domain
” устанавливается в аргумент команды ETRN, и проверки синтаксиса не производится в содержимом аргументов. Exim не ждёт завершения команды, таким образом, код статуса не проверяется. Exim работает под его uid и gid при получении входящего SMTP, таким образом, их невозможно изменить перед запуском команды.
44.9 Входящий локальный SMTP
Некоторые пользовательские агенты используют SMTP для передачи сообщений к своим локальным МТА, используя стандарный ввод и вывод, в противоположность передаче конверта в командной строке, и записи сообщения в стандартный ввод. Это поддерживается путём опции
“-bs
”. Эта форма SMTP обрабатывается точно таким же способом, как и входящие во TCP/IP сообщения (включая использование ACL), исключая что, отправитель конверта данный в команде MAIL, - игнорируется, если отправитель не доверенный. В ACL вы можете детектировать эту форму SMTP ввода путём проверки на пустой идентификатор хоста. Обычно, это первая строка в ACL, которая запускается для команд RCPT:
|
Этим принимаются SMTP сообщения от локальных процессов, без проверки любыми другими тестами.
44.10 Исходящий пакетный SMTP
Оба транспорта -
“appendfile
” и
“pipe
” могут быть использованы для обработки пакетного SMTP. Каждый обладает опцией, с именем
“use_bsmtp
”, которая вызывает вывод сообщений в формате BSMTP. Для этой формы доставки невозможны SMTP ответы. Всё что она делает - использует команды SMTP как способ передать конверт вместе с сообщением.
“
Сообщение записывается в файл или трубу, с предшествующей командой MAIL и RCPT, и сопровождаемое строкой, содержащей единственную точку. Строки в сообщении, которые начинаются с точки, имеют дополнительную добавленную точку. Команда SMTP HELO, обычно, не используется. Если это требуется, для её задания может использоваться опция message_prefix
”.
“
Поскольку обе опции - appendfile
” и
“pipe
” - локальные транспорты, они принмают, по умолчанию, лишь один адрес получателя одновременно. Однако, вы можете принять меры для обработки ими нескольких адресов за раз, путём установки опции
“batch_max
”. Когда это сделано для BSMTP, сообщения могут содержать несколько команд RCPT. Для дополнительных деталей, смотрите часть 25.
“
Когда один или более адресов роутятся на транспорт BSMTP путём роутера, который установлен списком хостов, имя первого хоста в списке доступно в транспорте, в переменной $host
”. Вот - пример такого транспорта и роутра:
|
Он вызывает запись сообщений адресованных
“domain.example
”, в формате BSMTP, в
“/var/bsmtp/batch.host.example
”, с одной копией каждого сообщения (если не более 1000 получателей).
44.11 Входящий пакетный SMTP
Опция командной строки
“-bS
” заставляет exim принимать одно или более сообщений путём чтения со стандартного ввода, но не производя никаких ответов. Если вызывающий - доверенный, оставляется отправитель из команды MAIL; иначе, отправитель - всегда будет вызвавший exim. Неквалифицированные отправители и получатели не отклоняются (это кажется маленькой точкой), но, вместо этого, просто квалифицируются. HELO и EHLO действуют как RSET; VRFY, EXPN, ETRN и HELP, действуют как NOOP; QUIT - выход.
“
Для BSMTP ввода, проверки политик не производится. Таким образом, в это время ACL не запускаются. В этом отношении, он - такой же как и локальный не-SMTP ввод.
Если при чтении сообщения обнаружена ошибка, включая остутсвие .
” в конце, exim немедленно его бросает. Он пишет детали о ошибке на стандартный вывод стилизированным способом, который вызывающая прогармма могла бы использовать автоматически, например:
|
Также он пишет более подробную версию, для использования люльми, в стандартный файл ошибок, например:
|
Код возврата из exim`a - ноль, лишь есть небыло ошибок. Он - 1, если какие-то сообщения были приняты до детектирования ошибки, и 2 - если не было принятых сообщений.
=============
translated by lissyara
Этот информационный блок появился по той простой причине,
что многие считают нормальным, брать чужую информацию не уведомляя автора
(что не так страшно), и не оставляя линк на оригинал и автора — что более существенно.
Я не против распространения информации — только за. Только условие простое — извольте
подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой,
незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
Если соизволите поставить автора в известность — то вообще почёт вам и уважение.
© lissyara 2006-10-24 08:47 MSK