Руководство по релеям для новичков в qmail.

Вступление.

Я читаю почтовые рассылки по qmail последние несколько лет, и если встречается там вопрос, на который ответов больше, чем на любые другие вопросы, то это вопрос, на который отвечают: "читай FAQ #5.4". Этот вопрос имеет много формулировок, но в основном звучит так: "Когда кто-то пробует послать почту через мой сервер, он получает сообщение 'Sorry, that domain isn't in my list of allowed rcpthosts' ('Извините, этого домена нет в списке разрешенных для релея хостов'). Что мне делать?"

Из дальнейшего чтения видно, что сама тема пересылки (релея) почты зачастую приводит новичков в замешательство; какую роль здесь играет файл rcpthosts? И какое отношение к пересылке имеют tcprules tcpserver'а? Поэтому я написал следующее, чрезвычайно многословное объяснение принципов пересылки, описал, как сделать ее выборочной, а также рассказал о некоторых ловушках, которые могут Вам встретиться. Может показаться, что сказано слишком много слов для объяснения столь несложной концепции. Однако, прочитав сотни сообщений из рассылок qmail по этой теме, я подумал, что смогу определить большинство источников путаницы и непонимания, и попробовал предугадать все вопросы, которые могут у вас возникнуть.

Итак. О чем вообще идет речь? Что такое открытый релей?

Вы установили Ваш qmail сервер. Он обслуживает несколько почтовых доменов (то есть, они перечислены в Вашем файле locals или в virtualdomains).

Вы настроили сервер так, чтобы qmail-smtpd мог принимать соединения на 25 порту и получать почту от других хостов.

Другой хост в Internet соединяется с Вашим сервером на 25 порту. Это может быть другой почтовый сервер с работающим на нем qmail, sendmail или другим MTA, или же - это просто конечный пользователь, который хочет послать почту со своего персонального почтового клиента (Outlook, The Bat, Netscape Mail и т.п.)

Начинается сеанс SMTP с удаленным хостом.
Сначала удаленный хост называет себя:

    HELO somehost.somewhere.net

Ваш сервер отвечает:

    250 mail.yourdomain.net

Удаленный хост сообщает поле "From" сообщения:

    MAIL FROM: 

Ваш хост отвечает:

    250 ok

Удаленный хост теперь посылает одну или несколько команд RCPT TO, которые определяют получателей сообщения:

    RCPT TO: 

Минуточку! elsewhere.com - это не один из доменов, которые обслуживает Ваш сервер.
Что Ваш сервер сделает? Он может согласиться принять сообщение и попытаться доставить его:

    250 ok

Или он может отклонить его:

    553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)

В первом случае Ваш сервер работает как релей: он принимает и соглашается попробовать доставить сообщение, которое не предназначено для одного из Ваших доменов.
Во втором случае он отказывается быть релеем.

Файл rcpthosts, который получил свое название от команды RCPT TO, определяет, будет ли адрес получателя принят к дальнейшей обработке: он будет принят, только если домен, указанный в команде RCPT TO, имеется в rcpthosts (Об исключениях из этого правила поговорим позже). Если файла rcpthosts не существует, то любой адрес получателя будет принят.

Сервер SMTP называется "открытый релей", если он соглашается переслать почту независимо от того, кто и кому ее отправляет. Если другой хост соединяется с портом 25 и отправляет какие-то письма, открытый релей примет эту почту и будет пробовать ее доставить независимо от того, кем является его адресат и кто посылает ее. Сервер qmail без файла rcpthosts будет действовать как открытый релей.

Так почему же я не должен иметь открытый релей? Моим пользователям необходимо отправлять почту в другие домены. И вообще, почему некто, не являющийся моим пользователем, может захотеть использовать мой сервер как релей?

Несколько лет назад это действительно было безопасным решением; люди обычно использовали релей, предоставленный им своим ISP, работодателем или университетом.

А потом появились спаммеры (от spammer) - люди, организующие массовые рассылки непрошенной электронной корреспонденции коммерческого характера (UCE) или спам (spam).
Более подробно об этой напасти можно прочесть по следующим адресам:
http://www.cybernothing.org/faqs/net-abuse-faq.html#2.1
http://spam.abuse.net/overview/whatisspam.shtml
http://www.mail-abuse.com/standart.html
http://www.antispam.ru/spam.shtml (прим. перев.)

Вместо использования ресурсов собственного сервера они разыскивают открытый релей, который сможет принять и разослать единственное сообщение, скажем, со 100000 адресатами.
Такой невольный помощник спаммера должен будет забыть о нормальной работе своего сервера и приготовиться к резкому увеличению исходящего трафика; кроме того, администраторы почтового релея будут, вероятно, затоплены жалобами получателей спама. Релей может даже оказаться в "черном списке", чтобы другие, более настроенные хосты в Интернете отказались получать почту от него (см. http://maps.vix.com/ и http://www.orbs.org/ и т.п.).
Открытый почтовый релей в наши дни рассматривается как безответственность.

Хорошо, довольно доводов, Вы меня убедили. Я не хочу иметь открытый релей. Как я могу исправить настройки своего релея?

Просто перечислите в Вашем файле rcpthosts все домены, которые обслуживает Ваш сервер (или, для которых действует как вторичный релей). Теперь Вы в безопасности.

Но теперь мои собственные клиенты получают сообщение "Sorry, that domain isn't in my list of allowed rcpthosts"! (Я буду называть Ваших пользователей "клиенты"; замените это слово на "служащие", "студенты моего университета", или как-либо еще, применительно к Вашему случаю). Я хотел бы, чтобы мои собственные клиенты могли использовать мой сервер как релей, но я, наверное, не смогу перечислить все домены в моем rcpthosts файле, в которые они могут захотеть послать почту.

Вы тоже с этим сталкивались? К счастью, есть способ заставить qmail-smtpd выборочно игнорировать файл rcpthosts. Если переменная RELAYCLIENT установлена в переменных окружения qmail-smtpd, rcpthosts будет игнорироваться и пересылка будет разрешена. Все, что Вам нужно - это найти способ установить RELAYCLIENT для Ваших клиентов, но не для кого-либо еще.

Для начала Вам нужен способ идентифицировать Ваших клиентов. В протоколе SMTP не предусмотрено авторизации по имени пользователя и паролю. Как же определить, исходит ли некоторая SMTP-сессия от одного из Ваших клиентов? Вернейший способ выделить Вашего клиента из остального мира состоит в проверке следующего факта: Ваш клиент соединяется с Вашим сервером с хоста из Вашей сети, то есть с хоста, чей IP-адрес находится в Вашем адресном пространстве.

Как только Вы узнаете, что пользователь соединился с одного из Ваших IP-адресов, Вам нужно будет установить RELAYCLIENT так, чтобы этот пользователь мог пересылать почту. Очень просто настроить qmail так, чтобы он делал это. Чтобы выяснить, как это сделать, прочитайте о выборочном релее с помощью tcpserver и qmail-smtpd.

Ну а если большинство моих пользователей не находятся в моей сети и используют различных ISP? Разве я не могу позволить им пересылать почту, если эта почта приходит с одного из моих доменов?

Большинство людей понимает "приходит с одного из моих доменов" как "имеет один из моих доменов в адресе отправителя". Проблема здесь в том, что подделать адрес отправителя очень просто. Вам пришлось бы брать слово с отправителя, что его адрес - это действительно то, что он написал в MAIL FROM. Ясно, что это никуда не годится с точки зрения безопасности.

Как же тогда пересылать почту таких клиентов?

Лучший способ для них состоит в том, чтобы использовать те SMTP-серверы, которые предоставляет им их ISP. Обычно нет никакой причины использовать именно Ваш сервер, чтобы пересылать их почту; подойдет любой сервер, который согласится передавать их почту, и таким сервером в принципе должен быть почтовый сервер ISP.

К сожалению, некоторые ISP не просто требуют, чтобы отправляющий хост находился в их сети, но еще и хотят, чтобы конвертный обратный адрес пересылаемого через них письма был именно тем почтовым адресом, который они выдали данному клиенту. Я никогда не видел почтового клиента для не-Unix ОС, который позволял бы задавать конвертный адрес отправителя, отличающийся от адреса, который появится в заголовке письма в поле "От"; так что если Ваш клиент хочет передать почту через SMTP-сервер его ISP (и его ISP выполняет вышеописанную проверку адреса), он не сможет вписать в поле "От" своего письма тот адрес, который Вы выдали ему - вся его почта должна будет иметь обратный адрес в домене его ISP.
Решение проблемы довольно простое: всего лишь вводить адрес с Вашим доменом в поле "ReplyTo".(прим. перев.)

Так что же должен делать мой клиент, если он хочет, чтобы его почта имела обратный адрес в моем домене, но его ISP - из числа вышеописанных?

Есть некоторые частичные решения этой проблемы; мне кажется, что ни один из них не идеален. Вероятно, лучшее - это "POP-before-SMTP" (или "SMTP-after-POP" прим. перев.) : Вы позволяете некоторому IP-адресу передавать через Ваш сервер в течение короткого периода времени после того, как хост с этим адресом авторизуется через POP. Есть различные решения POP-before-SMTP; например, тот, который не требует никакого внесения исправлений в исходные тексты qmail - это relay-ctrl Брюса Гуентера (Bruce Guenter). Единственная проблема с этим подходом следующая: по крайней мере в некоторых популярных почтовых клиентов Windows жестко зашито посылать все поставленные в очередь письма ПЕРЕД проверкой почты. Ваши пользователи должны будут привыкнуть проверять свою почту перед отправкой писем.

Другое возможное решение, которое иногда рекомендуют, заключается в запуске qmail-smtpd с разными IP-адресами и на нестандартном порту, и информировании Ваших пользователей о том, как сконфигурировать их почтовые клиенты, чтобы использовать Ваш сервер для их исходящей почты. Одна из проблем заключается в том, что некоторые почтовые клиенты не позволяют Вам устанавливать нестандартный порт SMTP. Другая проблема состоит в том, что этот способ не предлагает никакой реальной защиты, только "защиту через мрак". Вы можете несколько обезопасить себя с использованием tarpitting'а. Это поможет предотвратить злоупотребление, если шлюз будет обнаружен.

Существуют патчи к qmail-smtpd, для использования SMTP AUTH, расширения SMTP, которое позволяет выполнить авторизацию по имени пользователя и паролю для разрешения пересылки. Если почтовые клиенты Ваших пользователей поддерживают SMTP AUTH, то это - превосходный способ позволить пересылать избранным пользователям не из Вашей сети. См. сайт qmail для получения дополнительной информации.

Если кто-то имеет любые другие решения, пожалуйста, сообщите мне о них.

Я думаю, что все установил правильно. Как я могу проверить свой сервер, чтобы удостовериться, что он - не открытый релей?

Попробуйте тестера релеев на http://www.fabel.dk/relay/test/. В отличие от многих других тестеров релеев, он требует, чтобы его пробное сообщение действительно было передано назад к нему, чтобы решить, является ли Ваш сервер открытым релем. Другие тестеры могут пометить Ваш сервер как открытый релей, даже если Вы просто попытаетесь проверить, является или нет Ваш сервер открытым релеем.

Вопросы? Комментарии? Я буду рад их услышать.

Крис Джонсон (Chris Johnson)
dcj-qmaildoc@palomine.net

---
Перевод документа был осуществлен
Романом Бондаревым (Roman Bondarev) <pomah@kemsu.ru>
и Андреем Малышевым (Andrey Malyshev) <amal@icm.krasn.ru>
в рамках проекта Русский qmail (http://www.ru.qmail.org).
Кемерово - Красноярск, 17 июня 2003 г.