Установка почтового сервера 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@mydomain.ru то необходимо завести пользователя 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. Взято один к одному у Лисяры http://www.lissyara.su/
#за что ему большой респект
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 http://www.sput.nl/spam/
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
Теперь все служебные письма будут приходить в почтовый ящик user1@mydomain.ru
По скольку exim читает сам файл aliases - команду newaliases можно не выполнять.
Теперь прописываем старт наших сервисов в /etc/rc.conf
saslauthd=YES
exim=YES
postfix=NO
Можно запускать все нужные сервисы
Идем пьем пиво :)
Такое решение снижает количество приходящего спама практически до 0. За пять дней – одно письмо. Из минусов – могут быть проблемы с легитимной почтой, но неправильно настроенной обратной зоной. Я правда еще файрвол подрулил – закрыл полностью Китай и Корею. Кому интересно – IP по странам могут взять
Для нагруженных систем – MySQL рулит
P.S. Предложения и замечания приветствуются.
- EDL's blog
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 3854 просмотра
Интересно. В wiki закиньте
Интересно.
В wiki закиньте plz.
DemocratsCoach Factory
Democrats
insist thatthey were closing in onthe framework of an agreement, but that Republicans backed away from their willingness to accept significant revenue increases in exchange for cuts in the growth of entitlement programs.Republicans, who agreed that there was a potential framework a week ago, counter that the deal was spoiled by Democrats, who refused to lock in the levelWhat remained unclear on
What remained unclear on
Saturday, and what will be a main focus of NATO’s inquiry, was what exactly prompted the airstrikes and whether they were unprovoked or resulted from a communications mishap. A NATO spokesman, Brig. Gen. Carsten Jacobson, offered details suggesting that allied and Afghan troops operating near the border came under fire from unknown enemies and summoned coalitionwarplanes for help.
The New York TimesCoach
The New York Times
is offering
digital gift
subscriptions
to NYTimes.com
and tablet and
smartphone apps.
Subscriptions are available for
12 weeks or 26
weeks and start
at $30.
A transparent investigation
of the NATO strikes, with
Pakistan’s participation, is essential
In Coach Factory
In
emerging markets, skepticism and schadenfreude abound. "The old paradigm in which the smart guys from Europe and America harangue us, wag a finger and tell us: 'This is what you've got wrong'—that's over," says Rajiv Kumar, an Oxford University-trained economist who is secretary-general of the Federation of Indian Chambers of CommerceandIndustryThe global financial crisis exposed shortcomings of U.S.-style capitalism, the inadequacies of what the British dubbed