Почтовый сервер под Ubuntu Server: связка DBmail + Postfix + sasl + spamassassin + clamav
В статье будет описано создание связки DBmail, Postfix, sasl, spamassassin и clamav.
О каждом поподробнее:
DBmail будет использоваться для хранения почты, учетных записей в базе данных mysql.
Postfix — для отправки писем и получения из вне.
Sasl используется для авторизации, чтобы использовать postfix как relay, для того чтобы отправлять почту вне нашего домена.
Spamassassin для поиска спама в письмах.
Clamav — антивирус который будет в данном случае проверять почту.
перед установкой DBmail необходимо установить mysql-server
apt-get install mysql-server
Шаг 1. Установка DBmail
Для установки DBmail в Ubuntu уже имеется готовый пакет.
apt-get install dbmail-mysql
Создаем базу данных для хранения писем и учетных записей.
mysql -p
вводим пароль root mysql сервера
CREATE DATABASE dbmail;
GRANT ALL ON dbmail.* TO 'dbmail'@'localhost' IDENTIFIED BY 'пароль';
\q
gunzip < /usr/share/doc/dbmail-mysql/examples/create_tables.mysql.gz |mysql dbmail -p
База создана, переходим к настройке DBmail.
Открываем любимым редактором файл /etc/default/dbmail и вносим такие строчки:
START_IMAPD=1
START_LMTPD=1
Это необходимо для автоматического старта из скрипта /etc/init.d/dbmail.
Редактируем сам скрипт запуска /etc/init.d/dbmail, приводим к вот такому виду:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IMAPD=/usr/sbin/dbmail-imapd
LMTPD=/usr/sbin/dbmail-lmtpd
IMAPD_NAME=dbmail-imapd
LMTPD_NAME=dbmail-lmtpd
NAME="dbmail"
PID_DIR="/var/run/$NAME/"
DESC="dbmail servers"
test -x $IMAPD || exit 0
test -x $LMTPD || exit 0
set -e
. /lib/lsb/init-functions
[ -e /etc/default/dbmail ] && . /etc/default/dbmail
if [ ! -d ${PID_DIR} ]; then
mkdir -p -m 0755 ${PID_DIR}
chown dbmail:dbmail ${PID_DIR}
fi
service_start() {
eval '_daemon=$'$1
eval '_name=$'$1'_NAME'
[ -e $_daemon ] || return 0
log_progress_msg "$_name"
start-stop-daemon --start --exec $_daemon
r=$?
if [ $r -gt 0 ]; then
log_failure_msg "failed"
return $r
fi
return 0
}
service_stop() {
eval '_daemon=$'$1
eval '_name=$'$1'_NAME'
log_progress_msg "$_name"
start-stop-daemon --stop --retry 10 \
--pidfile ${PID_DIR}/${_name}.pid >/dev/null 2>&1 || true
pidof ${_name} >/dev/null 2>&1 || return 0
# try harder
echo -n "."
killall ${_name} >/dev/null 2>&1 || true
sleep 4
pidof ${_name} >/dev/null 2>&1 || return 0
echo -n "."
killall -9 ${_name} >/dev/null 2>&1 || true
sleep 2
pidof ${_name} >/dev/null 2>&1 || return 0
echo -n "."
log_failure_msg "failed"
return 1
}
service_reload() {
eval '_daemon=$'$1
eval '_name=$'$1'_NAME'
log_progress_msg "$_name"
start-stop-daemon --stop --signal HUP --quiet --pidfile ${PID_DIR}/${_name}.pid
r=$?
if [ $r -gt 0 ]; then
log_failure_msg "failed"
return $r
fi
return 0
}
case "$1" in
start)
log_daemon_msg "Starting $DESC"
r=0
if [ "$START_IMAPD" ]; then service_start "IMAPD" || r=1; fi
if [ "$START_LMTPD" ]; then service_start "LMTPD" || r=1; fi
log_end_msg $r
;;
stop)
log_daemon_msg "Stopping $DESC"
r=0
if [ "$START_IMAPD" ]; then service_stop "IMAPD" || r=1; fi
if [ "$START_LMTPD" ]; then service_stop "LMTPD" || r=1; fi
log_end_msg $r
;;
reload)
log_daemon_msg "Reloading $DESC"
r=0
if [ "$START_IMAPD" ]; then service_reload "IMAPD" || r=1; fi
if [ "$START_LMTPD" ]; then service_reload "LMTPD" || r=1; fi
log_end_msg $r
;;
restart|force-reload)
$0 stop
$0 start
;;
*)
N="$NAME"
echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
exit 1
;;
esac
exit 0
Теперь редактируем конфигурационных файл /etc/dbmail/dbmail.conf и до водим его до такого состояния.
# Configuration file for DBMAIL
[DBMAIL]
driver = mysql
authdriver = sql
host = localhost
sqlport = 3306
sqlsocket = /var/run/mysqld/mysqld.sock
user = dbmail
pass = пароль_который_был_создан_при_создании_базы_данных
db = dbmail
table_prefix = dbmail_
encoding = latin1
default_msg_encoding = latin1
postmaster = postmaster@ваш_хост_точка_чего_то
sendmail = /usr/sbin/sendmail
TRACE_SYSLOG = 3
TRACE_STDERR = 1
EFFECTIVE_USER = dbmail
EFFECTIVE_GROUP = dbmail
BINDIP = *
NCHILDREN = 2
MAXCHILDREN = 10
MINSPARECHILDREN = 2
MAXSPARECHILDREN = 4
MAXCONNECTS = 10000
MAX_ERRORS = 500
TIMEOUT = 300
login_timeout = 60
RESOLVE_IP = no
logfile = /var/log/dbmail/dbmail.log
errorlog = /var/log/dbmail/dbmail.err
pid_directory = /var/run/dbmail
state_directory = /var/run/dbmail
query_time_info = 10
query_time_message = 20
query_time_warning = 30
[LMTP]
BINDIP = 127.0.0.1
PORT = 24
[IMAP]
PORT = 143
TIMEOUT = 4000
IMAP_BEFORE_SMTP = no
# end of configuration file
Рестартуем DBmail: /etc/init.d/dbmail restart
Проверяем: netstat -an |grep 24
и netstat -an |grep 143
Если все поднялось заводим новые учетки:
dbmail-users -a юзер@твой_хост_точка_чего_то -w пароль_нового_ящика
Шаг 2. Установка Postfix
Установка стандартна:
apt-get install postfix-mysql
В появляющемся окне нажимаем Internet Site, вводим полное название вашего хоста.
Редактируем файл /etc/postfix/master.cf .
Добавляем в конец файла:
dbmail-lmtp unix - - n - - lmtp
Не забываем про пустую строку в конце файла.
Редактируем файл /etc/postfix/main.cf
local_recipient_maps = mysql:/etc/postfix/dbmail-aliases.cf mysql:/etc/postfix/dbmail-recip.cf
mailbox_transport = dbmail-lmtp:127.0.0.1:24
Так же не забываем про пустую строку.
Создаем файл который будет отвечать за извлечение логинов и паролей из БД:
/etc/postfix/dbmail-aliases.cf
user = dbmail
password = пароль
hosts = 127.0.0.1
dbname = dbmail
table = dbmail_aliases
select_field = alias
where_field = alias
/etc/postfix/dbmail-recip.cf
user = dbmail
password = пароль
hosts = 127.0.0.1
dbname = dbmail
table = dbmail_users
select_field = userid
where_field = userid
В этих файлах была зарыта собака которую я искал 2 часа 🙁
Если указывать hosts = localhost, то postfix лезет в mysql не через порт 3306, а через сокет.
А если указать ip то все нормально.
Все можем перезагружать Postfix: /etc/init.d/postfix restart
В итоге у нас работающая почтовая система, но без пересылки, без авторизации, без антиспама и антивируса.
Шаг 3. Установка SASL для авторизации, с помощью которой будет разрешать пересылка (relay).
По умолчанию при установке Posfix-а sasl и tls устанавливаются автоматически, но для авторизации в mysql необходимо доставить пакет libsasl2-modules-sql:
apt-get install libsasl2-modules-sql
Для того чтобы активировать sasl и научить его брать пароли из mysql нужно создать файл /etc/postfix/sasl/smtpd.conf и внести данные соединении.
auxprop_plugin: sql
sql_engine: mysql
sql_user: dbmail
sql_passwd: пароль
sql_hostnames: 127.0.0.1
sql_database: dbmail
sql_statement: select passwd from dbmail_users where userid='%u@%r'
Вносим изменения в /etc/postfix/main.cf
smtpd_sasl_local_domain =
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_tls_auth_only = no
smtp_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
И как бы все 🙂 Перезапускаем и проверяем.
Шаг 4. Установка антиспама Spamassassin.
Устанавливаем:
apt-get install spamassassin
Для автостарта антиспама надо внести изменения в /etc/default/spamassassin
ENABLED=1
Создаем пользователя для запуска антиспама:
adduser --disabled-password --disabled-login --home /etc/spamassassin spamd
Приводим файл конфигурации антиспама /etc/spamassassin/local.cf к такому:
rewrite_header Subject *****SPAM*****
report_safe 0
required_score 5.0
use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
Стартуем /etc/init.d/spamassassin start .
Редактируем файл постфикса /etc/postfix/master.cf
Строку smtp inet n - - - - smtpd
заменяем на:
smtp inet n - - - - smtpd -o content_filter=spamassassin
Перед dbmail-lmtp unix - - n - - lmtp
добавляем:
spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/spamc -s 5120000 -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Шаг 5. Установка антивируса Clamav.
Устанавливаем:
apt-get install clamsmtp
Редактируем /etc/clamsmtpd.conf : OutAddress: 10026
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.ctl
Header: X-AV-Checked: ClamAV using ClamSMTP
TempDirectory: /tmp
PidFile: /var/run/clamsmtp/clamsmtpd.pid
Quarantine: off
TransparentProxy: off
User: clamsmtp
Перезапускаем: /etc/init.d/clamsmtp restart
Редактируем конфиг постфикса /etc/postfix/main.cf :
content_filter = avscan:127.0.0.1:10025
receive_override_options = no_address_mappings
Добавляем в /etc/postfix/master.cf до dbmail-lmtp unix - - n - - lmtp
строки:
avscan unix - - n - 10 smtp -o smtp_send_xforward_command=yes
127.0.0.1:10026 inet n - n - 10 smtpd -o content_filter=
spamassassin unix - n n - - pipe user=spamd argv=/usr/bin/spamc -s 5120000 -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Перезапускаем: /etc/init.d/postfix restart
Вот как бы и все.
P.S. При настройке почтовой программы либо еще чего, логин к почте пишется полностью вместе с @ и доменом:
root@vpupkin.ru
При вставке текста в конфиги лучше использовать nano т.к. он расставляет табуляцию как надо.
Спасибо.
А это проверенный конфиг, в плане, он 100% рабочий?
не прослушивается 25 порт, с чем может быть связано?
спс
Да 100% уже лично около 5 машин настроил и все подкорректировал в конфиге.
А до изменений работало? Попробуй по чистому поставить posftix-mysql не редактируя конфиг и посмотреть, а потом добавляй. Скорее всего ты что-то пропустил при настройке.
p.s. посмотри логи: /var/log/mail.log mail.err mail.warn
Да, всё правильно. Крутой мануал, спасибо (ток я на пгскл собирал).
Такой вопрос, а веб морду никакую не прикручивал к этому безобразию?
нет не прикручивал.. не было пока такой надобности, только для себя однако делал.
Слушай, а никаких ошибок не было потом, и всё стабильно работает, быстро открывается, и т.д. и т.п.???
Подскажите в чём проблема:
Всё настроил по мануалу, всё прошло без ошибок, пользователи создаются, почта отправляетс на адрес пользователя, а вот подключиться к учётной записи пользователя не получается, пишет что не верно введён парольпользователя
Постваил систему, работает. Во всяком случает отправляет… а управление БД можно визуализировать? например при помощи phpmyadmin?
elerond можно визуализировать, достаточно знать капельку SQL. phpmyadmin тоже подойдет
lukas соединение с БД может тупит? либо ип проверь БД
да нет всё пашет, в БД учётка пользователя с паролем видна через phpmyadmin
Письма отправляются а на почту ни чего не приходит. Прикрутил fetchmail что бы он доставлял постифику письма из вне… постфиксу он их перепоавляет, а вот куда они дельше исчезают не понятно…
Долго и упорно плясал с бубном, потом наткнулся на IREDMAIL поставил и всё заработало «из коробки»
lukas
Говняка 70% была в куске:
auxprop_plugin: sql
sql_engine: mysql
sql_user: dbmail
sql_passwd: пароль
sql_hostnames: 127.0.0.1
sql_database: dbmail
sql_statement: select passwd from dbmail_users where userid=’%u@%r’
В базе проверял запросом, что выдавал? А скорее всего что-то не то.
А IP адрес должен быт 127,0,0,1 или Айпи провайдера? и ещё на другие сервера отправляет?