Настройка Sendmail как внешнего почтового шлюза

Sendmail relayЗадача – сделать почтовый шлюз на базе sendmail, для отправки/приема почты в интернет и взаимодействие с внутренним почтовиком в локальной сети предприятия.
Что дано: есть сервер под управлением *nix (у меня стоит freebsd 8.1), с двумя сетевыми картами, на одной карте настроен внешний IP интернета, вторая сетевая смотрит во внутреннюю сеть предприятия. Во внутренней сети стоит еще один сервер под управлением microsoft exchange 2010, куда и должны доставляться в конечном итоге все письма.
Также на стороне провайдера уже прописаны прямые и обратные зоны для нашего домена и MX запись нашего почтового сервера.

По умолчанию каталогом с конфигами в sendmail является /etc/mail, а сами файлы конфигов следующие:

  • access – файл базы данных доступа sendmail
  • aliases – синонимы почтовых ящиков
  • local-host-names или sendmail.cw – список хостов, для которых sendmail принимает почту
  • mailer.conf – настройки почтовой программы
  • mailertable – куда перенаправлять почту (если требуется)
  • sendmail.mc – основной файл конфигурации sendmail, для обработки препроцессором m4, для получения файла sendmail.cf
  • sendmail.cf – основной файл конфигурации sendmail
  • relay-domains – перечень доменов который поддерживает наш почтовый шлюз
  • virtusertable – таблицы виртуальных пользователей и доменов

Файл access

В данный файл заносим ip нашего внутреннего почтового сервера microsoft exchange, разрешая ему соединяться с sendmail при отправке писем в интернет.


192.168.0.3     RELAY

Пересобираем файл access.db при любом изменении файла access. Файл access.db является бинарной базой данных и именно с ним работает sendmail.


#makemap hash /etc/mail/access < /etc/mail/access

Если у вас нет внутреннего почтовика, то в файл access заносим localhost


localhost     RELAY

Файл aliases

Достаточно часто в unix данный файл находится по пути /etc/aliases, но тогда в /etc/mail/aliases должен находится его симлинк.
В конец файла дописываем строку


root: user

Вместо user заносим свой логин. Теперь вся системная почта, приходящая на пользователя root будет перенаправляться вам.
Пересобираем файл aliases.db командой


#newaliases

Файл local-host-names

Самый простой файл в конфигурации – заносим имя нашего почтового сервера и имена доменов для которых будем принимать почту. Каждый домен на новой строке


name.domain.ru
domen.ru

Будьте внимательны, последняя строка этого фала должна быть пустой, т.к. она не читается конфигурацией sendmail (и как совет, примите к сведению, что последняя строка в конфигурационных файлах unix очень часто должна заканчиваться пустой строкой)
Для этого файла бинарная база данных не требуется

Файл mailer.conf

Если у вас дистрибутив linux, то данный файл вы не обнаружите в каталоге /etc/mail и по сути он вам не нужен. В системе FreeBSD в данном файле заносятся пути до программ, отвечающих за определенные действия по обработке почты. В нашем случае за все действия будет отвечать команда sendmail. Если вы захотите поменять программы отвечающие за те или иные действия по обработке почты, то достаточно будет поменять пути до этих программ в mailer.conf.
Я файл не правил, оставил как было


sendmail        /usr/libexec/sendmail/sendmail
send-mail       /usr/libexec/sendmail/sendmail
mailq           /usr/libexec/sendmail/sendmail
newaliases      /usr/libexec/sendmail/sendmail
hoststat        /usr/libexec/sendmail/sendmail
purgestat       /usr/libexec/sendmail/sendmail

Файл mailertable

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


domen.ru          relay:[192.168.0.3]

Пересобираем файл mailertable.db


#makemap hash /etc/mail/mailertable < /etc/mail/mailertable

Файл sendmail.mc

Вот и добрались до главного файла с помощью которого и формируется конфигурационный файл sendmail.cf с помощью препроцессора m4. Препроцессор создает более понятный для машинной обработке файл, чтобы увеличить скорость работы почтовой программы.
Файл не обязательно может называться sendmail.mc, можно создавать свои названия файлов конфигураций, но расширение файла должно быть .mc.
Файл конфигурации у меня получился такой.


divert(-1)
divert(0)
include(`/usr/share/sendmail/cf/m4/cf.m4')
OSTYPE(freebsd)
DOMAIN(generic)

FEATURE(`nouucp',`reject')
FEATURE(`always_add_domain')
FEATURE(`allmasquerade')
MASQUERADE_AS(`domen.ru')
FEATURE(`masquerade_envelope')
Dmdomen.ru

FEATURE(access_db, `hash -o -T /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')

FEATURE(use_cw_file)
define(`confCW_FILE', `-o /etc/mail/local-host-names')

define(`confTO_IDENT', `0')
define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
define(`confPRIVACY_FLAGS', `needmailhelo,authwarnings,noexpn,novrfy,noverb')

FEATURE(`no_default_msa')
DAEMON_OPTIONS(`Port=smtp, Name=MTA')
DAEMON_OPTIONS(`Port=987, Name=MSA, M=E')

MAILER(local)dnl
MAILER(smtp)dnl

Кому интересно замысловатые названия команд и макросов, можно прочитать мои комментарии показать


После составления файла .mc преобразовываем его в sendmail.cf командой


#m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

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

Файл relay-domains

Прописываем взаимодействие только с нашим доменом или доменами (по каждому на одной строке). Если файл отсутствует, то создаем его сами.


domen.ru

Файл бинарной базы данных не требуется

Файл virtusertable

У меня он пока пустой. Если у вас ситуация, что имя внутреннего домена на локальном почтовике отличается от внешнего, то сюда следует прописать соответствие всех почтовых ящиков этих доменов.


@domen.ru %1@int.domen.ru

Также сюда можно прописывать соответствие алиасов ящиков пользователей, синтаксис файла смотрите в документации и не забудьте пересобрать virtusertable.db

На этом конфигурации закончена. Перезапускаем сервис sendmail и первым делом идем смотреть логи в /var/log/maillog. Если все хорошо, то там должна быть запись


Nov 19 23:35:03 m1k sm-mta[2954]: restarting /usr/sbin/sendmail due to signal
Nov 19 23:35:03 m1k sm-msp-queue[2957]: restarting /usr/sbin/sendmail due to signal
Nov 19 23:35:04 m1k sm-msp-queue[3772]: starting daemon (8.14.4): queueing@00:25:00
Nov 19 23:35:04 m1k sm-mta[3774]: starting daemon (8.14.4): SMTP+queueing@00:25:00

Можно приступать к тестированию по отправке/приемке почты 🙂
Не забывайте перезапускать sendmail при любом изменении его файлов конфигурации и пересобирать бинарные базы данных там, где это требуется.

Запись опубликована в рубрике Сервера с метками , . Добавьте в закладки постоянную ссылку.

7 комментариев Настройка Sendmail как внешнего почтового шлюза

  1. Ярослав говорит:

    а как сделать в sendmail, чтобы он был релеем для локальной сети?

    сейчас при попытке отправить письмо с ящика на любой другой – “550 5.1.1 anyuser@example.com… User unknown”

    • mik говорит:

      А как в статье написано вставить в файл access строку с RELAY делали?

      • Ярослав говорит:

        да… разобрался…
        все оказывается работает, кроме одного домена… локального…
        буду искать далее)

        спасибо!

      • Ярослав говорит:

        хотя, после проведенных тестов, вопрос таки задам….

        user@ubuntu:~$ telnet 192.168.1.1 25
        Trying 192.168.1.1…
        Connected to 192.168.1.1.
        Escape character is ‘^]’.
        220 gw ESMTP Sendmail 8.14.7/8.14.7; Mon, 7 Apr 2014 19:27:55 +0400 (MSK)
        helo gw
        250 gw Hello ubuntu.local [192.168.1.220] (may be forged), pleased to meet you
        mail from: asdasdasdasd@testing.ru
        250 2.1.0 asdasdasdasd@testing.ru… Sender ok
        rcpt to: y.n@example.com
        550 5.1.1 y.n@example.com… User unknown
        rcpt to: root@example.com
        250 2.1.5 root@example.com… Recipient ok
        rcpt to: anyshit@mail.ru
        250 2.1.5 anyshit@mail.ru… Recipient ok
        ^]
        telnet> quit
        Connection closed.

        такое впечатление, что он проверяет пользователей в /etc/passwd и именно тех, кто в домене example.com.

        вопрос: почему? что упущено? 🙂

        example.com в данном случае локальный домен компании… и внутри сети есть АД.
        но сам гейтвей не является членом АД. и даже ДНС в /etc/resolv.conf указывают на 8.8.8.8 и 8.8.4.4
        единственная связь, которая может быть – это внешний ip.

  2. mik говорит:

    User unknown довольно общая ошибка в таких случаях 🙁 Что приходит мне на ум..
    Это может быть или из-за ошибки конфига sendmail, в частности переменной SMART_HOST в mc файле. А также из-за ошибок DNS. Возможно надо еще раз проверить DNS записи, в частности mx запись – это если сервер с “белым” ip.
    Если сервер за NAT, тогда проверить файлы /etc/host на предмет чтобы файл sendmal – local-host-names и /etc/host совпадали по имени хоста. Например у меня relay внутри локальной сети с такими файлами.

    mik@mik@# cat ./hosts
    127.0.0.1 localhost.localdomain localhost
    192.168.0.1 server.domain.ru server

    mik@mik@# cat /etc/mail/local-host-names
    server.domain.ru

    Ну и само собой в mc файле из которого формируется sendmail должна быть строка про файл local-host-names
    В общем еще раз надо почитать рабочие примеры конфигов relay и все перепроверить 🙂

  3. Владимир говорит:

    Если domain.ru присутствует в /etc/mail/local-host-names (как это написано в статье), то почта не рэлеится на этот домен, а считается локальной, даже не смотря на присутствие domain.ru в файле relay-domains.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *