Не так давно передо мной встала задача предоставить зарегистрированным в моем каталоге организациям личный почтовый ящик с именем моего домена. Вместо того, чтобы выдавать пользователям каталога непосредственные контактные данные, было определено, что более продуктивно будет выдавать им контактные данные с названием моего домена. Что должно увеличить посещаемость, как среди пользователей, так и среди самих организаций.
Пользователи получают возможность писать сообщения фирмам со своего личного ящика, сохранив их в адресной книги, или любым другим удобным для них способом. А организации будут вынуждены им с него отвечать, что в результате должно увеличить посещаемость и соответственно монетизировать мой проект.
К сожалению, как только я начал обращаться с данным вопросом на крупнейших форумах рунета, то получил не совсем тот ответ, который я ожидал. При этом, лучшие из предложений сводились к тому, чтобы снести прекрасно работающий sendmail и установить на него Postfix и Dovecot, которые тянули и другие зависимости. А установочный пакет выглядел бы примерно так: exim4, exim4-base, exim4-config, exim4-daemon-heavy, dovecot-common, dovecot-imapd, dovecot-pop3d, php5-imap. В худшем оговаривали баснословные суммы, аж в 2000$, или советовали пройти мимо и не позориться.
К сожалению, позориться долго не пришлось. Так как однозначной инструкции, которая бы удовлетворяла мои нужды, и другие возможные подобные решения в сети не нашлись, я решил, что данное руководство будет как нельзя кстати.
Поставленная мною задача решалась с помощью старого доброго sendmail и небольших настройках в его конфигурациях.
В первую очередь необходимо прописать настройки в dns-зоне:
Для MX:
@ IN MX 10 mx.site.ru.
И для AAAA:
@ IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334
И для A:
mx.site.ru. IN A <IP>
Указанный в ДНС MX адрес также надо будет прописать в /etc/hosts, добавив:
<IP> mail.construktor.info
Теперь перейдем непосредтственно к конфиругации sendmail.
Начнем с файла /etc/mail/sendmail.mc. Для начала откроем двери для всех желающих, так как по умолчанию smtp-порт открыт только на раздачу. Проблему вирусов, спама и дос-атак обсудим позже. Делается это так:
DAEMON_OPTIONS(`Port=smtp,Addr=<ip>, Name=MTA-ext')dnl
Затем сразу после записи:
FEATURE(`use_cw_file')dnl
Добавим таблицы виртуальных пользователей и доменов:
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')dnl
Теперь создадим файл, куда будем класть почту:
touch "/home/site.ru/public_html/mail"
И назначим ему права владельца а группу sendmail агента:
chown user:mail /home/site.ru/public_html/mail
Путь и название файла условное и рекомендуется создавать файл вне зоны доступа для случайных пользователей.
В файле /etc/aliases пропишем имя виртуального пользователя, которому и будут приходить сообщения.
user: /home/site.ru/public_html/mail
В этом случае вся почта будет скапливаться в файле /home/site.ru/public_html/mail
Большой файл разобрать сложно, да и неудобно обращаться к нему отдельно от самого sendmail. Поэтому наиболее удобный вариант направить сразу на php скрипт, который будет его обрабатывать на лету.
user: "|php5-cgi -c /path/to/php.ini /site.ru/public_html/mail.php"
Чтобы письма всех возможных пользователей отправлялись в файл /site.ru/public_html/mail.php
Запишем в файл /etc/mail/virtusertable инструкцию:
@site.ru user
Данная инструкция сообщает, что всех возможных пользователей сайта site.ru мы определяем как пользователя user, для которого ранее мы уже определили место для хранение почты. В дальнейшем нам лишь останется разобрать, кому и чья почта принадлежит и отдать уже фактическому владельцу на нашем сайте.
Завершающим этапом останется лишь прописать список имен хостов, принимаемых программой sendmail в файле
/etc/mail/local-host-names.
Добавив к существующим:
mx.site.ru
site.ru
(В конце пробел обязателен)
Активируем изменения командой sendmailconfig.
Защита от DDoS-атак
Для защиты от дос-атак я приведу несколько настроек, которые будут полезны. Их необходимо прописать в файле /etc/mail/sendmail.mc:
# максимальное число соединений в секунду. Если частота превышена, дополнительные соединения будут поставлены в очередь (не отброшены).
Define(confCONNECTION_RATE_THROTTLE',43')dnl
#максимальное число дочерних процессов sendmail. Если это число будет превышено, дополнительные соединения будут поставлены в очередь (не отброшены).
Define(confMAX_DAEMON_CHILDREN',40')dnl
#если на диске осталось указанное количество блоков, сервер больше не будет принимать сообщения. По умолчанию - 100.
Define(4configSIN_FREE_BLOCKS',100')dnl
#максимальный размер заголовка входящего сообщения, в байтах.
Define(confMAX HEADERS LENGTH', 4024')dnl
#максимальный размер тела входящего сообщения. Значение по умолчанию равно 4 Мб (4 194 302 байта). Не нужно устанавливать слишком маленькое значение, так как оно может быть легко превышено вложениями (attachments).
Define(confMAX_MESSAGE_SIZE',4194304')dnl
После чего еще раз активируем изменения командой sendmailconfig.
Антиспам и антивирус
В качестве антивирусной программы будем использовать Dr.Web. Он же поможет нам справиться и со спамом. Я не стал использовать дополнительные спам-фильтры, так как сам после долгих страданий от того, что в сервисе gmail.com нужные мне письма постоянно попадали в спам. Принял решение перейти на yandex. Поэтому чистку спамом считаю делом индивидуальным, а использование каких-либо спам-листов и фильтров довольно сомнительным удовольствием.
Установим ключ:
wget -O - http://officeshield.drweb.com/drweb/drweb.key | apt-key add
Подключим репозиторий:
nano /etc/apt/sources.list
deb http://officeshield.drweb.com/drweb/debian stable non-free
Обновляем репозиторий:
aptitude update
Устанавливаем Dr.Web:
aptitude install drweb-sendmail-av-as
Основной файл настройки антиспама /etc/drweb/plugin_vaderetro.conf. В нем нас особо интересуют черные и белые списки:
WhiteList = /home/site.ru/public_html/mail/WhiteList
BlackList = /home/site.ru/public_html/mail/BlackList
Их также можно вынести в разделы нашего сайта, либо в любое другое доступное для редактирования место, не забывая о соответствующих ограничениях и безопасности.
На этом все. В следующей публикации мы разберем сохраненную форму и создадим для нее таблицу в базе данных, привязав ее к пользователю сайта или каталога.
Используемые материалы
www.pettingers.org/code/sendmail-local.html
www.sendmail.com/sm/open_source/docs/m4/features.html
it-e.ru/blogs/administrirovanie/nastrojka-mta-sendmail
www.freebsd.org/doc/ru/books/handbook/sendmail.html
progressive0.livejournal.com/15919.html
adatum.ru/ustanovka-sendmail-dovecot-drweb-na-ubuntu.html
Автор: mmotor