Установка почтового сервера Exim на NetBSD

EDL аватар

Автор: 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. Предложения и замечания приветствуются.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".
rmx аватар

Интересно. В wiki закиньте

Интересно.
В wiki закиньте plz.

pylxwzhj аватар

DemocratsCoach Factory

Democrats

Coach Factory Outlet

insist that

Coach Factory Store

they were closing in onthe

Coach Outlet

framework of an agreement,

Coach Outlet

but that Republicans

Coach Outlet Online

backed away from

Coach Outlet

their willingness to

Coach Outlet Online

accept significant

Chanel Outlet

revenue increases in

Chanel Outlet

exchange for cuts

Louis Vuitton Outlet

in the growth

Coach Factory Store

of entitlement

Chanel Handbags

programs.Republicans,

Coach Outlet

who agreed that

Chanel Bags

there was a

Louis Vuitton

potential framework

Coach Outlet

a week ago, counter that

Coach Outlet

the deal was spoiled

Coach Outlet

by Democrats, who refused to

Chanel Bags

lock in the level

Coach Outlet

pylxwzhj аватар

What remained unclear on

What remained unclear on

Coach Outlet

Saturday, and what will be a main focus

Coach Outlet

of NATO’s inquiry, was what exactly

Chanel Handbags

prompted the airstrikes and

Coach Outlet

whether they were unprovoked

Chanel Bags

or resulted from a communications mishap.

Coach Factory Outlet

A NATO spokesman, Brig. Gen.

Coach Outlet Online

Carsten Jacobson, offered details

Coach Outlet

suggesting that allied

Coach Outlet

and Afghan troops operating

Coach Outlet Online

near the border came under

Louis Vuitton Bags

fire from unknown enemies and

Coach Factory Outlet

summoned coalition

Louis Vuitton Bags


warplanes for help.

onebylove аватар

The New York TimesCoach

The New York Times

Coach Outlet


is offering

Coach Outlet


digital gift

Chanel Handbags


subscriptions

Coach Outlet


to NYTimes.com

Chanel Bags


and tablet and

Coach Factory Outlet


smartphone apps.

Coach Outlet Online


Subscriptions are available for

Coach Outlet


12 weeks or 26

Coach Outlet


weeks and start

Coach Outlet Online


at $30.

Louis Vuitton Bags


A transparent investigation

Coach Factory Outlet


of the NATO strikes, with

Louis Vuitton Bags


Pakistan’s participation, is essential

onebylove аватар

In Coach Factory

In

Coach Factory Outlet

emerging markets,

Coach Outlet Online

skepticism

Coach Factory Outlet

and schadenfreude abound.

Coach Outlet

"The old

Coach Outlet

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

Coach Factory Online

over," says

Coach Factory Outlet

Rajiv Kumar,

Coach Outlet Store

an Oxford

Coach Outlet

University-trained

Coach Outlet Online

economist who

Coach Factory Outlet

is secretary-general

Chanel Bags

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