Задача – сделать почтовый шлюз на базе 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 при любом изменении его файлов конфигурации и пересобирать бинарные базы данных там, где это требуется.
а как сделать в sendmail, чтобы он был релеем для локальной сети?
сейчас при попытке отправить письмо с ящика на любой другой – “550 5.1.1 anyuser@example.com… User unknown”
А как в статье написано вставить в файл 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.
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 и все перепроверить 🙂
Если domain.ru присутствует в /etc/mail/local-host-names (как это написано в статье), то почта не рэлеится на этот домен, а считается локальной, даже не смотря на присутствие domain.ru в файле relay-domains.
Владимир, это утверждение или вопрос?