Новые книги

В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.

Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Фундаментальный учебник по основам объектно-ориентированного программирования и инженерии программ. В книге подробно излагаются основные понятия объектной технологии – классы, объекты, управление памятью, типизация, наследование, универсализация. Большое внимание уделяется проектированию по контракту и обработке исключений, как механизмам, обеспечивающим корректность и устойчивость программных систем.

В книге Бертрана Мейера рассматриваются основы объектно-ориентированного программирования. Изложение начинается с рассмотрения критериев качества программных систем и обоснования того, как объектная технология разработки может обеспечить требуемое качество. Основные понятия объектной технологии и соответствующая нотация появляются как результат тщательного анализа и обсуждений. Подробно рассматривается понятие класса - центральное понятие объектной технологии. Рассматривается абстрактный тип данных, лежащий в основе класса, совмещение классом роли типа данных и модуля и другие аспекты построения класса. Столь же подробно рассматриваются объекты и проблемы управления памятью. Большая часть книги уделена отношениям между классами – наследованию, универсализации и их роли в построении программных систем. Важную часть книги составляет введение понятия контракта, описание технологии проектирования по контракту, как механизма, обеспечивающего корректность создаваемых программ. Не обойдены вниманием и другие важные темы объектного программирования – скрытие информации, статическая типизация, динамическое связывание и обработка исключений. Глубина охвата рассматриваемых тем делает книгу Бертрана Мейера незаменимой для понимания основ объектного программирования.

Some Useful sendmail Configurations

Наиболее распространенные конфигурации

Конечно, вариантов настройки sendmail существует бесчисленное множество, но распространены все же некоторые определенные типы конфигураций. Их и рассмотрим.

Заполнение поля From: пользователями

Иногда полезно переписывать поле From: исходящих писем. Например, есть web-программа, которая отсылает почту. Обычно письмо от нее придет от имени пользователя, которому принадлежит web-сервер. Но можно определить другой исходный адрес так, чтобы почта исходила с другого адреса. Пакет sendmail обеспечивает средства определения того, для каких пользователей это делать.

Опция use_ct_file допускает спецификацию и использование файла, который вносит в список имена доверенных пользователей. По умолчанию таких пользователей мало (root, например). Имя этого файла обычно /etc/mail/trusted-users в системах, использующих каталог настроек /etc/mail или /etc/sendmail.ct во всех остальных. Вы можете определять имя и расположение файла макросом confCT_FILE.

Добавьте FEATURE(use_ct_file) к Вашему файлу sendmail.mc для поддержки возможности.

Управление почтовыми псевдонимами

Псевдонимы почты мощное свойство, которое дает возможность письмам попадать в почтовые ящики, которые являются альтернативными именами для пользователей или процессов на компьютере адресата. Например, обычным явлением считается адрес для комментариев, связанных с сервером WWW, названный "webmaster". Часто нет пользователя, известного как "webmaster" на целевой машине, взамен него подставляется имя другого пользователя системы. Другое общее применение псевдонимов: списки рассылки. Здесь псевдоним направляет входящие сообщения серверу списка рассылки для обработки.

Файл /etc/aliases обычно хранит псевдонимы. Пакет sendmail консультируется с этим файлом при определении, как обработать входящее сообщение почты. Если он находит запись в этом файле, соответствующую пользователю назначения в сообщении почты, он переназначает сообщение на нового получателя.

Есть три ситуации, которые связаны с использованием псевдонимов:

  • Псевдоним обеспечивает адрес для почты, направляемой одному или нескольким получателям.

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

  • Псевдоним может посылать почту в файл.

Все системы требуют псевдонимов для Postmaster и MAILER-DAEMON, для совместимости с ошибками различных описаний RFC.

Следует быть очень осторожным с программами, которым передается почта, поскольку sendmail выполняется с правами root.

Детали, относительно псевдонимов почты, могут быть найдены на man-странице aliases(5). Образец файла aliases показан в примере 18-4.

Пример 18-4. Образец файла aliases

# The following two aliases must be present to be RFC-compliant.
# It is important to resolve them to 'a person' who reads mail routinely.
postmaster:    root                            # required entry
MAILER-DAEMON: postmaster                      # required entry
#
# demonstrate the common types of aliases
usenet:        janet                           # alias for a person
admin:         joe,janet                       # alias for several people
newspak-users: :include:/usr/lib/lists/newspak # read recipients from file
changefeed:    |/usr/local/lib/gup             # alias that invokes program
complaints:    /var/log/complaints             # alias writes mail to file

После обновления файла /etc/aliases выполните:

# /usr/bin/newaliases
Это пересоздаст базу данных, используемую sendmail для работы с псевдонимами. Команда /usr/bin/newaliases является эквивалентом выполнения:
# /usr/lib/sendmail -bi
Такое имя понадобилось из-за распространенности команды newaliases для этих целей.

Использование интеллектуальных хостов (Smart Host)

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

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

Еще одним применением такого хоста является протаскивание почты через частный firewall. Часто встречаются сети, в которых используются недействительные IP-адреса. Такие сети подключаются к Internet через firewall. Прямая отправка почты из такой сети невозможна: машины в ней не могут работать по SMTP в Internet непосредственно. Вместо этого можно оснастить firewall интеллектуальной почтовой функцией. Интеллектуальный хост способен установить прямые сетевые подключения с компьютерами в частной сети и в Internet. Заодно он поработает маршрутизатором, пересылая входящую почту на внутренние машины.

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

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

define(`SMART_HOST', `uucp-new:moria')
LOCAL_NET_CONFIG
# This rule ensures that all local mail is delivered using the
# smtp transport, everything else will go via the smart host.
R$* < @ $* .$m. > $*    $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3

Макрос SMART_HOST позволяет Вам определять хост, которому надо передать всю почту, которую не получается доставить самому, и протокол транспортировки почты, используемый для этих целей.

В нашей конфигурации мы используем транспорт uucp-new для передачи на UUCP-хост moria. Если бы мы хотели конфигурировать sendmail, чтобы использовать интеллектуальный хост с поддержкой SMTP, надо было бы написать следующее:

define(`SMART_HOST', `mail.isp.net')
Мы не должны определять SMTP как транспорт, так как это принято по умолчанию.

Давайте подумаем, что сделают правило переписки и макрос LOCAL_NET_CONFIG.

Макрос LOCAL_NET_CONFIG позволяет добавлять к Вашей конфигурации правила sendmail, которые определяют, какая почта должна остаться внутри локальной системы. В нашем примере, мы использовали правило, которое соответствует любому адресу e-mail, где компьютер принадлежит нашему домену (.$m.), и почта будет переслана на него напрямую по SMTP. Это гарантирует, что любое сообщение для компьютера в нашей локальной сети будет направлено немедленно к SMTP-транспорту и послано на тот компьютер до того, как свалиться на наш интеллектуальный хост, который является заданной по умолчанию стратегией обработки.

Противоспамовая оборона

Что такое спам, я полагаю, объяснять не надо. Особенно, если Вы платите за трафик, как я. Поэтому я вполне разделяю чувства тех, кто хочет отделаться от этого ужаса хотя бы частично.

К счастью, sendmail включает некоторую поддержку механизмов для борьбы с этой заразой электронной почты.

Real-time Blackhole List

Real-time Blackhole List представляет собой публичное средство, предназначенное уменьшить объем спама. Известные адреса e-mail и хосты перечисляются в базе данных, доступной через Internet. Они вводятся туда людьми, получившими спам с этих адресов. Домены иногда находятся в списке из-за ошибок при вычислении пути спама. Но эти ошибки система исправляет, ориентируясь на поступающие новые сообщения. Детальную информацию о сервисе можно получить на его сайте Mail Abuse Protection System http://maps.vix.com/rbl.

Если включить соответствующую поддержку в sendmail, он проверит исходный адрес каждого входящего сообщения почты по Real-time Blackhole List, чтобы определить, принимать ли сообщение. Если у Вас большой сервер и много пользователей, это свойство может сохранять значительный объем дискового пространства. Это свойство принимает параметр, задающий имя сервера для использования. По умолчанию это главный сервер rbl.maps.vix.com.

Для настройки поддержки Real-time Blackhole List добавьте в файл sendmail.mc следующее определение настроек:

FEATURE(rbl)

Чтобы определить другой сервер RBL, используйте определение:

FEATURE(rbl,`rbl.host.net')

База данных доступа (access database)

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

Это очень важный аспект, поскольку такой подход позволяет бороться со спамерами, обходящими Real-time Blackhole List. Вместо того, чтобы посылать почту Вам непосредственно, спамер передаст почту через некоторый другой компьютер, который в списке не отмечен. В результате спам дойдет-таки до адресата! Чтобы гарантировать, что Ваш компьютер не используются таким образом, Вы должны передавать почту только для известных компьютеров. Версии sendmail 8.9.0 и старше вообще блокируют ретрансляцию почты по умолчанию.

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

База данных доступа это совокупность правил, которые описывают, какое действие должно быть выполнено для сообщений, полученных от указанных компьютеров. Заданный по умолчанию файл управления доступом называется /etc/mail/access. Таблица в нем имеет простой формат. Каждая строка таблицы содержит правило доступа. Левая сторона каждого правила образец, используемый, чтобы сравнивать с ним адреса. Это может быть полный адрес email, hostname или адрес IP. Правая сторона задает действие. Имеются пять типов действия, а именно:

OK

Принять сообщение почты.

RELAY

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

REJECT

Отклонить сообщение почты.

DISCARD

Отклонить сообщение почты, используя транспорт $#discard.

### any text

Вернуть сообщение об ошибке, используя код ошибки ### (указаны в RFC-821) или "any text" в качестве ответного сообщения.

Простой пример файла /etc/mail/access:

[email protected]   REJECT
aol.com                 REJECT
207.46.131.30           REJECT
[email protected]      OK
linux.org.au            RELAY

Этот пример отклонит все письма с адреса [email protected], любого хоста в домене aol.com и хоста 207.46.131.30. Следующее правило разрешает принять почту с [email protected], несмотря на тот факт, что домен имеет запрещающее правило. Последнее правило позволяет передачу почты с любого хоста в домене linux.org.au.

Для включения поддержки access database впишите определение в sendmail.mc:

FEATURE(access_db)

Заданное по умолчанию определение формирует базу данных, используя вызов hash -o /etc/mail/access, который генерирует простую базу данных из текстового файла. Этого достаточно в большинстве случаев. Есть другие параметры, которые Вы должны изучить при использовании большой базы данных доступа. Но ввиду малой распространенности таких конфигураций, я не буду рассматривать их.

Запрещение пользователям получать почту

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

Для включения данного свойства добавьте в sendmail.mc:

FEATURE(access_db)
FEATURE(blacklist_recipients)

Чтобы отключить получение почты для локального пользователя, просто добавьте его в базу данных доступа. Обычно Вы будете использовать запись ###, которая возвратит сообщение об ошибке отправителю, так что он будет знать, почему почта не доходит. Это свойство применяется и для виртуальных доменов, но Вы должны включить виртуальный домен в спецификации базы данных доступа. Образец файла /etc/mail/access:

daemon          550 Daemon does not accept or read mail.
flacco          550 Mail for this user has been administratively disabled.
[email protected] 550 Mail disabled for this recipient.

Настройка виртуальных хостов

Виртуальные домены обеспечивают компьютер возможностью приема и передачи почты от имени различных доменов, как если бы это был ряд разных хостов. Часто это используется интернет-провайдерами в сочетании с web-хостингом. Собственно, именно так работает автор этих строк: моя машина имеет лишь почтовый выход в Сеть. Поэтому вся почта для меня реально оседает на сервере провайдера, откуда я ее периодически забираю по UUCP. Это при том, что моей машине приписано нормальное доменное имя.

Прием почты для других доменов

Когда sendmail принимает сообщение e-mail, он сравнивает хост назначения в заголовке с именем локальной машины. Если они совпали, sendmail принимает сообщение для локальной доставки. В противном случае, sendmail может принять письмо для последующей пересылки адресату (подробности в разделе База данных доступа (access database) выше).

Если нужно конфигурировать виртуальные домены, первое, что нужно сделать, это убедить sendmail в необходимости приема почты для виртуальных доменов. Это очень легко.

В sendmail есть свойство use_cw_file, позволяющее определить имя файла, где мы сохраняем имена доменов, для которых sendmail принимает почту. Чтобы конфигурировать это свойство, добавьте объявление свойства к файлу sendmail.mc:

FEATURE(use_cw_file)

Заданное по умолчанию имя файла будет /etc/mail/local-host-names для дистрибутивов, хранящих настройки в каталоге /etc/mail или /etc/sendmail.cw для всех остальных. Впрочем, Вы можете определять имя и расположение файла, переопределив макрос confCW_FILE:

define(`confCW_FILE',`/etc/virtualnames')

Если нужно создать виртуальные домены bovine.net, dairy.org и artist.org, впишите в файл /etc/mail/local-host-names:

bovine.net
dairy.org
artist.org

Когда это будет выполнено, и будут созданы соответствующие записи DNS, которые указывают на наш хост, связывая с ним имена этих доменов, sendmail примет почту для них, как если бы она была предназначена для нашего реального домена.

Пересылка почты с вирутальных хостов на другие пункты назначения

Возможность sendmail под названием virtusertable предоставляет поддержку таблицы настройки виртуальных доменов. Таблица виртуальных пользователей отображает входящую почту, предназначенную для адресов user@host на другие адреса otheruser@otherhost. Можно рассматривать это как продвинутое свойство псевдонима почты, которое функционирует, используя не только имя пользователя, но и его домен.

Для включения поддержки virtusertable допишите в свой файл sendmail.mc:

FEATURE(virtusertable)

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

Формат таблицы очень прост. Левая сторона каждой строки содержит образец, представляющий первоначальный адрес. Правая сторона задает образец адреса, на который надо переслать пришедшую почту.

Типичный образец записи:

[email protected]     colin
[email protected]      [email protected]
@dairy.org            [email protected]
@artist.org           [email protected]
В этом примере есть три виртуальных домена: bovine.net, dairy.org и artist.org.

Первая запись перешлет почту, посланную пользователю в виртуальном домене bovine.net локальному пользователю на данной машине. Вторая запись переназначает почту пользователю в другой домен. Обратите внимание, что первая и вторая записи работают с разными пользователями одного домена! Третья запись переназначает всю почту любого пользователя виртуального домена dairly.org на один адрес в другом домене. Наконец, четвертая запись переназначает всю почту пользователей в artist.org тем же самым пользователям, но уже в другом домене: например, [email protected] будет переназначена на [email protected].