Установка почтового сервера Exim на NetBSD
Автор: EDL
Преамбула:
Была поставлена задача - небольшой конторе настроить сервер для раздачи интернета и обеспечения сотрудников почтой. Соответственно для этих целей был даден компьютер – Core 2 Duo c 4 гигами памяти и жестким диском объемом 320Gb. Две сетевые карточки, одна смотрит в локалку с IP 192.168.1.1 другая в интернет с адресом 111.111.111.111 Был зарегистрирован домен mydomain.ru и прописаны MX записи на DNS серверах. Сервер получил имя mail.mydomain.ru Для поставленных задач была выбрана NetBSD 5.0.1 и установка связки exim+cyrus-saslauthd+qpopper
Так как почтовых ящиков планировалось мало – не более 10, было решено не разворачивать на сервере MySQL, а решть задачи авторизации с помощью saslauthd2. На сервер был установлен сетевой экран PF и прокси сервер SQID. Данная статья попытка обобщить проделанную работу.
Установка: Вся установка велась из портов. Сначала правим файл /etc/mk.conf необходимо добавить строку PKG_OPTIONS.exim+=saslauthd exim-content-scan Это необходимо для того, что бы exim собрался с поддержкой saslauthd и с поддержкой антивирусного сканера. mail# cd /usr/pkgsrc/security/cyrus-sasl mail# make mail# make install mail# cd /usr/pkgsrc/security/ cyrus-saslauthd mail# make mail# make install mail# cd /usr/pkgsrc/mail/exim mail# make mail# make install mail# cd /usr/pkgsrc/mail/qpopper mail# make mail# make install
Убиваем процесс postfix если он запущен.
Сначала настраиваем qpopper. Запускать его будем через inetd. Для этого прописывем в файле /etc/inetd.conf
--------------------------------------------------------------------------------------------
pop3 stream tcp nowait root /usr/pkg/libexec/qpopper qpopper -s -f /etc/qpopper.config
Файл qpopper.config не трогаем – будем использовать по умолчанию, только проверяем, что бы он был в том каталоге, на который указывает параметр -f в inetd. Перезапускаем inetd и смотрим. Должно быть типа такого – видим, что qpopper слушает 110 порт:
mail# sockstat -n|grep 110
root inetd 21792 5 tcp *.110 *.*
Необходимо завести в системе пользователей. Их имена должны совпадать с именами почтовых ящиков. Если мы планируем создать ящик то необходимо завести пользователя market. Можно конечно прописать юзеров в aliases но по мне так проще завести пользоваться в системе, чем возится в дальнейшем с лишним файлом.
Скрипт для добавления пользователей в систему. Запускается ./mailadd.sh user password
#!/bin/sh
#Скрипт для добавления пользователей mailadd
#Превый параметр – имя пользователя, второй параметр – пароль авторизации
#Создается группа mbox
if ! ` /usr/sbin/groupinfo -e mbox`; then
/usr/sbin/groupadd mbox
fi
upswd=` /usr/bin/ pwhash $2`
/usr/sbin/ useradd -m -s /sbin/nologin -g mbox -p $upswd $1
/usr/bin/ touch /var/mail/$1
/usr/sbin/ chown $1:mbox /var/mail/$1
/bin/ chmod 0600 /var/mail/$1
/usr/pkg/sbin/qpopauth -user $1 $2
Добавляем пользователей
mail#./mailadd.sh user1 password1
mail#./mailadd.sh user2 password2
mail#./mailadd.sh user3 password3
Для удаления пользователй из системы (ВНИМАНИЕ! Удаляется почтовый ящик. Соответственно вся почта будет потерянна) запускается ./maildel.sh user Группу mbox при необходимости тоже придется удалять руками.
#!/bin/sh
/usr/sbin/ userdel -r $1
/bin/rm /var/mail/$1
/usr/pkg/sbin/qpopauth -delete $1
Нужно учитывать, что задаваемые пользователям пароли будут предназначаться для авторизации SMTP через saslauthd2, так как демон saslauthd2 читает пароли из /etc/master.passwd поскольку мы пользуемся методо авторизации getpwent.
Настраиваем saslauthd. В принципе в особых настройках он не должен нуждаться, но оказалось, что exim и saslauthd ищут сокет в разных местах. Поэтому я решил просто изменить файл запуска демона /etc/rc.d/saslauthd. При установке в файле прописывается путь /var/run/saslauthd/ его и надо заменить на /var/state/saslauthd
Добавлен ключ запуска -m /var/state/saslauthd и изменены все пути к сокету в блоке
if [ ! -d /var/state/saslauthd ]; then
/bin/mkdir -p /var/state/saslauthd
/bin/chmod 0755 /var/state/saslauthd
/usr/sbin/chown root /var/state/saslauthd
fi
}
Файл /etc/rc.d/saslauthd
#!/bin/sh
#
# $NetBSD: saslauthd.sh,v 1.2 2004/01/12 04:52:34 jlam Exp $
#
# The saslauthd daemon allows cleartext UNIX password authentication via
# several authentication mechanisms with Cyrus SASL.
#
# PROVIDE: saslauthd
# REQUIRE: DAEMON
if [ -f /etc/rc.subr ]; then
. /etc/rc.subr
fi
name="saslauthd"
rcvar="${name}"
command="/usr/pkg/sbin/saslauthd"
pidfile="/var/state/saslauthd/${name}.pid"
start_precmd="saslauthd_precmd"
start_precmd="saslauthd_precmd"
# Default to authenticating against local password database.
: ${saslauthd_flags="-m /var/state/saslauthd -a getpwent"}
saslauthd_precmd()
{
if [ ! -d /var/state/saslauthd ]; then
/bin/mkdir -p /var/state/saslauthd
/bin/chmod 0755 /var/state/saslauthd
/usr/sbin/chown root /var/state/saslauthd
fi
}
if [ -f /etc/rc.subr ]; then
load_rc_config $name
run_rc_command "$1"
else
echo -n " ${name}"
${command} ${saslauthd_flags} ${command_args}
fi
Хотя конечно можно создать и ссылу. По крайней мере для postfixa имеется следующая рекомендация: «To fix it I removed "/var/run/saslauthd", and then recreated it as a
soft link to "/var/spool/postfix/var/run/saslauthd" (make sure that
postfix or whatever the postfix user is, is a part of the sasl group).»
Теперь настраиваем exim
Вот мой рабочий конфигурационный файл /usr/pkg/etc/exim/configure
# $Cambridge: exim/exim-src/src/configure.default,v 1.13 2007/06/26 11:21:36 ph10 Exp $
######################################################################
# MAIN CONFIGURATION SETTINGS #
######################################################################
# Полное имя машины на которой установлен exim
primary_hostname = mail.mydomain.ru
# Имя домена
domainlist local_domains = mydomain.ru
#Имя домена с которого принимается почта
domainlist relay_to_domains =mydomain.ru
#ВНИМАНИЕ! Здесь задаются адреса узлов с которых почта будет приниматься
#без авторизации. Если поставить * то получится открытый релей со всеми
#вытекающими от сюда последствиями. Если авторизация внутри локалки не нужна
#можно указать адрес и маску ЛВС. C внутреннего интерфейса в любом случае
#авторизация не нужна – иначе не будут уходить служебные письма от root.
#hostlist relay_from_hosts = localhost : 127.0.0.1 : 192.168.1.0/24
hostlist relay_from_hosts = localhost:127.0.0.1
# Интерфейсы на которых висит exim
local_interfaces = 127.0.0.1 : 192.168.1.1 : 111.111.111.111
# Оставляем по умолчанию
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
#Здесь подключается сокет ClamAV
#av_scanner = clamd:/tmp/clamd
# Здесь как я понимаю подключается spamd
# spamd_address = 127.0.0.1 783
# Опции подключения TLS – я не использую.
# tls_advertise_hosts = *
# tls_certificate = /etc/ssl/exim.crt
# tls_privatekey = /etc/ssl/exim.pem
# daemon_smtp_ports = 25 : 465 : 587
# tls_on_connect_ports = 465
# Основной домен системы
qualify_domain = mydomain.ru
# Для root мы почту никогда принимать не будем
never_users = root
# Поиск хостов в DNS
host_lookup = *
# Отключаем ident
#rfc1413_hosts = *
rfc1413_query_timeout = 0s
#YНастройки времени отложенной (замороженной)доставки
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d
# Настройки SMTP. Взято один к одному у Лисяры
#за что ему большой респект
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"
auth_advertise_hosts = *
accept_8bitmime = true
smtp_accept_max = 10
smtp_accept_max_per_connection = 25
smtp_connect_backlog = 30
smtp_accept_max_per_host = 5
remote_max_parallel = 5
message_size_limit = 10M
helo_allow_chars = _
smtp_enforce_sync = true
syslog_timestamp = no
# Настройки логов
log_selector = \
+all_parents \
+connection_reject \
+incoming_interface \
+lost_incoming_connection \
+received_sender \
+received_recipients \
+smtp_confirmation \
+smtp_syntax_error \
+smtp_protocol_error \
-queue_run
######################################################################
# ACL CONFIGURATION #
# Specifies access control lists for incoming SMTP mail #
######################################################################
begin acl
# По умолчанию
acl_check_rcpt:
accept hosts = :
# Отпинываем почту с недопустимыми символами в адресе
deny message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
# Если в почте для postmaster больше одного получателя
#то это скорее всего спам – не принимаем
drop message = Legitimate bounces are never sent to more than one recipient.
senders = : postmaster@*
condition = ${if >{$recipients_count}{1}{true}{false}}
#Если отсутствует HELO/EHLO то это нарушение стандарта – на фиг
deny message = "HELO/EHLO require by SMTP RFC"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}
#Мой IP в HELO? Явно спам! Не принимаем.
deny condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "main IP in your HELO! Access denied!"
#Одни цифры в HELO – спам 100% Не принимаем.
deny condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "can not be only number in HELO!"
#Здесь берем регулярные выражения из файла usr/pkg/etc/exim/spam-hosts
#Большинство спама отсеивается именно здесь
#Блокирутся хосты с «левыми» именами содержащими dsl,pool,static,dynamic итд.
drop message = Spam blocking. Your hostname is bad (adsl, pooll, cable, ppp & etc)
hosts = !192.168.10.0/24 : !localhost : !127.0.0.1 : \
wildlsearch;/usr/pkg/etc/exim/spam-hosts
#Проверяем адрес отправителя
deny !verify = sender/callout=postmaster,100s,random
message = No verifiable envelope sender address. See
sender_domains = !+local_domains
# Не правитльно указан домен отправителя – скорее всего спам. В мусор!
deny hosts = !+relay_from_hosts
message = HELO should be Fully Qualified Domain Name Host.Domain.Tld See RFC821
condition = ${if !match\
{$sender_helo_name}\
{\N.*[A-Za-z].*\..*[A-Za-z].*\N}\
{yes}{no}}
# Для постмастера принимаем почту
accept local_parts = postmaster
domains = +local_domains
# Проверка отправителя
require verify = sender
#Отпинываем письма для несуществующих пользователей.
accept domains = +local_domains
endpass
message = "In my mailserver not stored this user"
verify = recipient
#Отпинываеем почту которую не знаем куда слать
accept domains = +relay_to_domains
endpass
message = "mail.mydomain.ru server not know how relay to this address"
verify = recipient/callout=30s/callout_defer_ok
# А вот здесь пускаем хосты без авторизации которые задали
#выше в relay_from_hosts
accept hosts = +relay_from_hosts
control = submission/sender_retain
#Без авторизации никого не пускаем. Проверяем здесь
accept authenticated = *
control = submission
require verify = recipient/callout=5s,use_sender,defer_ok
#Кто не прошел аутентификацию – на фиг
deny !authenticated = *
condition = ${if eq{$sender_address_domain}{mydomayn.ru}{yes}{no}}
message = Sorry, authorization required
#Для всех остальных случаев закрываем все
deny message = "ERROR! Relay not permitted"
# По умолчанию. Проверка сообщения
acl_check_data:
#Здесь в случае применения антивируса блокируем письма с вирусами
#deny demime = *
#malware = *
#message = This message contains a virus ($malware_name).
#Для spamd – не пробовал, не знаю
# warn spam = nobody
# add_header = X-Spam_score: $spam_score\n\
# X-Spam_score_int: $spam_score_int\n\
# X-Spam_bar: $spam_bar\n\
# X-Spam_report: $spam_report
# Accept the message.
accept
######################################################################
# ROUTERS CONFIGURATION #
# Specifies how addresses are handled
######################################################################
begin routers
#Здесь я ничего не менял
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{$local_part}lsearch{/etc/mail/aliases}}
# user = exim
file_transport = address_file
pipe_transport = address_pipe
userforward:
driver = redirect
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
file = $home/.forward
# allow_filter
no_verify
no_expn
check_ancestor
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply
localuser:
driver = accept
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
transport = local_delivery
cannot_route_message = Unknown user
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
begin transports
# Ни чего не менял
remote_smtp:
driver = smtp
local_delivery:
driver = appendfile
file = /var/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
# group = mail
# mode = 0660
address_pipe:
driver = pipe
return_output
address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
address_reply:
driver = autoreply
######################################################################
# RETRY CONFIGURATION #
######################################################################
begin retry
# Address or Domain Error Retries
# ----------------- ----- -------
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
######################################################################
# REWRITE CONFIGURATION #
######################################################################
# There are no rewriting specifications in this default configuration file.
begin rewrite
######################################################################
# AUTHENTICATION CONFIGURATION #
######################################################################
begin authenticators
# В этой секции указываем, что аутентификация происходит через saslauthd
plain:
driver = plaintext
public_name = PLAIN
server_prompts = :
server_condition = ${if saslauthd{{$auth2}{$auth3}}{1}{0}}
server_set_id = $auth2
login:
driver = plaintext
public_name = LOGIN
server_prompts = "Username:: : Password::"
server_condition = ${if saslauthd{{$auth1}{$auth2}}{1}{0}}
server_set_id = $auth1
# End of Exim configuration file
Файл содержащий регулярные выражения ;/usr/pkg/etc/exim/spam-hosts
# spam-hosts
\N^[a-fA-F0-9]{10,}(\.[^\.]+){2,}\N
\N^\d+\.\d+\.\d+\.\d+\.\w+\N
\N^.*?[\w\d]+[\.\-](\w*\d+[\-x]){2,}\w*\d+\.[\w\d]\N
\N^\w+\d{5,}[\w]*[\.\-]\N
\N^\d+\.ya1\.ru\N
nat.sitc.ru
\N^(\d+[\-\.]){2,}[\d\w]+\N
\N^.*?\b(client|dial(ed)?|vpn|modem|dhcp|[dD]ynamic|[iI][pP]|pool|catv|ppp|cable|[xav]?dsl)(\d+\w*)?(\.[^\.]+){2,}$\N
*.comcast.net
\N^([xav]?dsl|client|chello|ppp|dial(ed)?|vpn|dhcp|di(al)?up|[xav]?dsl|modem|pool|catv|tomts|host|[uU][sS][eE][rR])[\d]*[\-\.]?\d+\.\N
*.merr.com
*.wanadoo.fr
\N^(\w+\d+[\-\.]){2,}\N
\N^\w+\d+\.neoline\.com\.br$\N
rsveg.plus.com
*.virtua.com.br
*.door.net
*.utoronto.ca
*.venti.pl
*.t-dialin.net
\N^([\d\w]+[\-\.]){2,}\d+[\-\.]\N
*.fortech.lv
*.tpnet.pl
*.1000lecie.pl
*.superb.net
*.chello.nl
*.mobille.tv
*.upc.cz
*.wroc.pl
*.vnet.ee
*.astral.ro
*.bellnexxia.net
*.mynet.net
*.sgci.com
*.shawcable.com
*.ne.jp
*.co.jp
*.co.uk
*.net.br
*.free.fr
*.wanadoo.fr
*.oleane.fr
*.wanadoo.co.uk
*.pppool.de
*.bah-bonn.de
*.unict.it
*.interpc.pl
*.retevision.es
*.contactel.cz
*.ufmg.br
*.volia.net
*.racsa.co.cr
*.avangarddsl.ru
*.hananet.net
#End of spam-hosts
Подправляем /etc/mail/aliases
Надо указать на какого пользователя должны приходить письма от root,postmaster,webmaster итд
Добавляем строку
root: user1
Теперь все служебные письма будут приходить в почтовый ящик
По скольку exim читает сам файл aliases - команду newaliases можно не выполнять.
Теперь прописываем старт наших сервисов в /etc/rc.conf
saslauthd=YES
exim=YES
postfix=NO
Можно запускать все нужные сервисы
Идем пьем пиво :)
Такое решение снижает количество приходящего спама практически до 0. За пять дней – одно письмо. Из минусов – могут быть проблемы с легитимной почтой, но неправильно настроенной обратной зоной. Я правда еще файрвол подрулил – закрыл полностью Китай и Корею. Кому интересно – IP по странам могут взять
Для нагруженных систем – MySQL рулит
P.S. Предложения и замечания приветствуются.
- EDL's blog
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 1268 просмотра
Интересно. В wiki закиньте
Интересно.
В wiki закиньте plz.