Выдалась свободная минутка, напишу пост о том, как поставить почтовый сервер в Ubuntu. Мануалов в интернете тучи, поэтому я взял один и маленько переписал для более быстрого разворота сервера в полевых условиях. Все нижеизложенное не претендует на звание истины в последней инстанции *-)
Итак, мануал для скоростной установки почты в связке postfix + dovecot2 с виртуальными юзерами/доменами, доступом по SMTP/POP3/IMAP и шифрованием SSL/TLS. Данный мануал предполагает что были выполнены предыдущие шаги из цикла статей про VDS сервер, а именно — уже установлен MySQL (если нет то его придется доставить).
Начнем с того, что в системе должен быть объявлен hostname и FQDN. Проверить имя хоста можно так:
hostname
Проверить FQDN можно так:
hostname -f
Они должны быть валидными и скорее всего отличаться друг от друга. У меня это koteika для хоста и koteika.koteika.ru для FQDN. Если у вас эти параметры не настроены, далее продолжать не имеет смысла. Как задать имя хоста и FQDN в Ubuntu я уже писал.
Установка компонентов сервера
Cтавим необходимые компоненты со всеми зависимостями (если у вас не стоит сервер MySQL — придется сначала установить MySQL):
sudo apt-get install postfix postfix-mysql dovecot-mysql dovecot-common dovecot-pop3d dovecot-imapd openssl
Во время установки запустится упрощенный конфигуратор пакета postfix.
- Create a self-signed SSL certificate? — No (создадим сертификат позже)
- General type of mail configuration — Internet Site
- System mail name — koteika.koteika.ru (если FQDN у вас указан правильно, то визард подставит сам)
Далее в визард завершается.
Создание пользователя и таблиц для работы почтового сервера с MySQL
Входим в MySQL client:
mysql -uroot -p -h localhost
Создаем БД для почты и аккаунт для работы с этой БД в MySQL:
CREATE DATABASE `mailserver` /*!40100 CHARACTER SET utf8 COLLATE 'utf8_general_ci' */; grant all on mailserver.* to mailuser@localhost identified by 'mysql_mailuser_password';
Здесь mysql_mailuser_password надо заменить на пароль для учетной записи юзера почты.
Выбераем созданную БД для работы:
USE mailserver;
Создадим таблицы, необходимые для работы почтового сервера:
CREATE TABLE `virtual_domains` ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE = InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `virtual_users` ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, domain_id INT(11) NOT NULL, user VARCHAR(40) NOT NULL, password VARCHAR(32) NOT NULL, CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE = InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `virtual_aliases` ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, domain_id INT(11) NOT NULL, source VARCHAR(40) NOT NULL, destination VARCHAR(80) NOT NULL, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE = InnoDB DEFAULT CHARSET=utf8; CREATE VIEW view_users AS SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email, virtual_users.password FROM virtual_users LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id; CREATE VIEW view_aliases AS SELECT CONCAT(virtual_aliases.source, '@', virtual_domains.name) AS email, destination FROM virtual_aliases LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;
Теперь добавим наш виртуальный домен (у меня это koteika.ru):
INSERT INTO virtual_domains (id, name) VALUES (1, 'koteika.ru');
и нашего виртуального пользователя почты (у меня это postmaster, адрес почты получится postmaster@koteika.ru):
INSERT INTO virtual_users (id, domain_id, user, password) VALUES (1, 1, 'postmaster', MD5('postmaster_password'));
Где postmaster_password надо заменить на пароль пользователя ящика postmaster@koteika.ru.
Выходим из MySQL клиента:
exit;
Конфигурация почтового сервера postfix.
Конфиги postfix находятся в папке /etc/postfix. Если вы вдруг потеряли или испортили конфиг, то его исходник можно скопировать отсюда — /usr/share/postfix.
Создаем файл /etc/postfix/mysql-virtual-mailbox-domains.cf с содержимым (не забываем менять пароль на пароль MySQL пользователя почты):
user = mailuser password = mysql_mailuser_password hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
По аналогии создаем файл /etc/postfix/mysql-virtual-mailbox-maps.cf:
user = mailuser password = mysql_mailuser_password hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM view_users WHERE email='%s'
Создаем файл /etc/postfix/mysql-virtual-alias-maps.cf:
user = mailuser password = mysql_mailuser_password hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM view_aliases WHERE email='%s'
Создаем файл /etc/postfix/mysql-email2email.cf:
user = mailuser password = mysql_mailuser_password hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM view_users WHERE email='%s'
Теперь выставим права на конфиги, чтобы пароли из них не были доступны всем подряд:
sudo chgrp postfix /etc/postfix/mysql-*.cf sudo chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Потребуется пользователь с домашней директорией под почту и отдельная группа для него:
sudo groupadd -g 5000 vmail sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m
Визард конфигурации postfix создал нам упрощенный конфиг. Переконфигурируем его нормально:
sudo dpkg-reconfigure postfix
Далее в визарде выбираем:
- General type of mail configuration — Internet Site
- System mail name — koteika.koteika.ru (если FQDN у вас указан правильно, то визард подставит сам)
- Root and postmaster mail recipient — Адрес postmaster заполняем на свой вкус, ящик надо будет создать на этом домене. (Например postmaster@koteika.ru)
- Other destinations to accept mail for — оставляем пустым (все равно это перекрывается виртуальными обработчиками)
- Force synchronous updates on mail queue — Форсировать синхронное обновление почты — нет
- Local networks — 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 (подсеть адресов, отправка почты с которых будет идти без авторизации)
- Mailbox size limit — 0 (без ограничений)
- Local address extension character — пустое поле
- Internet protocols to use — All
Вносим дополнительные изменения в основной конфиг postfix:
sudo postconf -e virtual_uid_maps=static:5000 sudo postconf -e virtual_gid_maps=static:5000 sudo postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf sudo postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf sudo postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf sudo postconf -e virtual_transport=dovecot sudo postconf -e dovecot_destination_recipient_limit=1
Редактируем файл /etc/postfix/master.cf
В конец дописываем:
dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
Два пробела перед «flags=» обязательны!! Далее перезапускаем postfix:
sudo service postfix restart
Настройка виртуального транспорта dovecot
Конфиги dovecot находятся в папке /etc/dovecot. Если вы потеряли или испортили конфиг, то исходник можно взять отсюда — /usr/share/dovecot. Приступаем к редактированию конфигов:
/etc/dovecot/dovecot-sql.conf.ext (не забываем менять юзера\пароль на юзера\пароль MySQL пользователя почты):
driver = mysql connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mysql_mailuser_password default_pass_scheme = MD5 password_query = SELECT email as user, password FROM view_users WHERE email='%u'; user_query = SELECT 5000 AS uid, 5000 AS gid, '/home/vmail/%d/%n' AS home
/etc/dovecot/conf.d/10-auth.conf — правим, чтобы было то что ниже, остальное закоменчиваем.
disable_plaintext_auth = yes auth_mechanisms = plain login !include auth-sql.conf.ext
/etc/dovecot/conf.d/auth-sql.conf.ext
# Look up user passwords from a SQL database as # defined in /etc/dovecot/dovecot-sql.conf.ext passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } # Look up user information from a SQL database as # defined in /etc/dovecot/dovecot-sql.conf.ext userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext }
/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/vmail/%d/%n namespace { type = private separator = . prefix = INBOX. inbox = yes } mail_uid = vmail mail_gid = vmail
/etc/dovecot/conf.d/10-master.conf — правим секцию auth, остальное не трогаем
service auth { unix_listener auth-userdb { mode = 0600 user = vmail group = vmail } unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } }
/etc/dovecot/conf.d/10-ssl.conf
ssl = yes ssl_cert = </etc/ssl/certs/dovecot.pem ssl_key = </etc/ssl/private/dovecot.pem
/etc/dovecot/conf.d/15-lda.conf — указываем адрес админа почты
postmaster_address = postmaster@daily-notes.ru
Выставляем права на конфиги
chown -R vmail:dovecot /etc/dovecot chmod -R o-rwx /etc/dovecot
Настройка TLS/SSL сертификатов
Создаем сертификат для dovecot:
sudo openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \ -keyout /etc/ssl/private/dovecot.pem
При создании старайтесь указывать реальные данные:
Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Novosibirskaya oblast Locality Name (eg, city) []:Novosibirsk Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyOrg Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:MyName Email Address []:postmaster@koteika.ru
Выставим права на полученый сертификат:
sudo chmod o= /etc/ssl/private/dovecot.pem
Создаем сертификат для postfix:
sudo openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \ -keyout /etc/ssl/private/postfix.pem
Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Novosibirskaya oblast Locality Name (eg, city) []:Novosibirsk Organization Name (eg, company) [Internet Widgits Pty Ltd]:CCS Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:Codeblight Email Address []:postmaster@koteika.ru
Выставим права на полученый сертификат:
sudo chmod o= /etc/ssl/private/postfix.pem
Теперь еще немного подкрутим postfix и добавим информацию о сертификатах и настройках авторизации:
sudo postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem sudo postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem sudo postconf -e smtpd_use_tls=yes sudo postconf -e smtpd_sasl_type=dovecot sudo postconf -e smtpd_sasl_path=private/auth sudo postconf -e smtpd_sasl_auth_enable=yes sudo postconf -e smtpd_helo_required=yes sudo postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unknown_client,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_hostname,reject_non_fqdn_sender,reject_unknown_sender_domain,reject_non_fqdn_recipient,reject_unauth_pipelining,reject_unauth_destination,reject_unlisted_recipient,permit
Перезапускаем postfix и dovecot:
sudo service postfix restart sudo service dovecot restart
Информацию об ошибках и прочих событиях можно найти в лог-файлах, располагающихся здесь:
/var/log/mail.log
/var/log/mail.err
/var/log/mail.warn
/var/log/mail.info
Если Dovecot не запускается, то с консоли можно поглядеть на проблемы в конфиге:
dovecot -n
Как настраивать DNS ?
На VDS в Hetzner, при использовании Nameserver Robot, настройка DNS генерируется автоматически и выглядит примерно так:
$TTL 86400 @ IN SOA ns1.first-ns.de. postmaster.robot.first-ns.de. ( 2011080200 ; serial 14400 ; refresh 1800 ; retry 604800 ; expire 86400 ) ; minimum @ IN NS robotns3.second-ns.com. @ IN NS robotns2.second-ns.de. @ IN NS ns1.first-ns.de. @ IN A 78.47.88.87 localhost IN A 127.0.0.1 mail IN A 78.47.88.87 www IN A 78.47.88.87 @ IN AAAA 2a01:4f8:d16:4346::2 mail IN AAAA 2a01:4f8:d16:4346::2 www IN AAAA 2a01:4f8:d16:4346::2 ftp IN CNAME www imap IN CNAME www loopback IN CNAME localhost pop IN CNAME www relay IN CNAME www smtp IN CNAME www @ IN MX 10 mail @ IN TXT "v=spf1 +mx +a +include:gmail.com -all"
Подробнее про синтакс SPF можно прочитать тут.
[…] Установка и настройка почтового сервера Postfix + Dovecot из р… […]
Здравствуйте! Хороший мануал, правда не завелась почта. В логе mail.info письмо приходит
Apr 8 22:04:03 yahydeu postfix/smtpd[3087]: connect from mail-pz0-f49.google.com[209.85.210.49]
Apr 8 22:04:04 yahydeu postfix/smtpd[3087]: AB7C485C2: client=mail-pz0-f49.google.com[209.85.210.49]
Apr 8 22:04:35 yahydeu postfix/smtpd[3087]: disconnect from mail-pz0-f49.google.com[209.85.210.49]
Только при тестировании подключения через Thunderbird не подключается. В mail.err ничего по теме нет. Может быть у вас есть соображения где может быть ошибка.
Причина кроется в конфиге dovecot .
Вот что выдал файл /home/vmail/dovecot-deliver.log .
Проверил скобки в конфиге все закрыты, похоже ему не нравятся указанные параметры.
Оказывается забыл точку поставить после INBOX
prefix = INBOX.
Возникли еще вопросы 🙂
С получением все прекрасно. А вот отправка хромает. Ни через 25 порт (наверное закрыт провайдером), ни через 465 порт не хочет авторизоваться. Хотя почта с сервера с помощью программы mutt от рута уходит.
Мне интересно узнать системные требования для железа.
Никогда подобного не делал будет первый опыт.
Заранее спасибо.
Для Postfix-Dovecot ? Или для linux ? Ubuntu server я поднимал на довольно древнем PIII 1.2Ghz и 384мб оперативы — работало неплохо для домашнего файлового сервера. У Postfix-Dovecot тоже требования думаю не сильные — процессы памяти немного жрут, если их в большом кол-ве не разрешать (т.к. их постоянно будут долбить спам-боты и в памяти они постоянно будут все заняты «делом»). Вообщем весь этот пост можно провернуть на небольшом VDS с объемом памяти в 0.5-1гб…
Здравствуйте!
А после всей настройки-то что дальше? Как пользоваться почтой? Второй день рыщу по интернету, но единственное, что более-менее нормальное — это Ваша статья. Но и здесь зашел в тупик…
И по поводу настройки. Что возвращает запросы:
query = SELECT 1 FROM virtual_domains WHERE name=’%s’
и
query = SELECT 1 FROM view_users WHERE email=’%s’
??
Подскажите, пожалуйста, или хотя бы направьте….
Предположительно эти запросы использует postfix чтобы проверить есть ли такой виртуальный домен или юзер. Если есть — на выходе 1, если нет — на выходе 0 строк.
В почту ходить по POP-IMAP, отправлять через SMTP, юзеров я создаю через SQL запросы — может не очень удобно но я делаю это раз в год, т.ч. нормально.
А какой вид должна иметь запись в таблице «virtual_aliases»? На данный момент таблица пустая, но к ней идет обращение.
Чего-то я не так делаю….
Через postfixadmin письмо отправляется.
Thunderbird не подключается.
postfix check молчит.
А вот что пишет doveconf -n:
# 2.1.7: /etc/dovecot/dovecot.conf
doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -n > dovecot-new.conf
doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘imaps’ protocol is no longer necessary, remove it
doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘pop3s’ protocol is no longer necessary, remove it
doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:56: namespace private {} has been replaced by namespace { type=private }
doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 66: Unknown setting: mechanisms
doveconf: Error: managesieve-login: dump-capability process returned 89
doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -n > dovecot-new.conf
doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘imaps’ protocol is no longer necessary, remove it
doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:21: ‘pop3s’ protocol is no longer necessary, remove it
doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:56: namespace private {} has been replaced by namespace { type=private }
doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 66: Unknown setting: mechanisms
в 66 строке конфига довекота косяк 😉 (судя по тому что он пишет).
В 66 строке как раз написано mechanisms = plain login. А он пишет, что unknown setting: mechanisms. Это как это unknown???? А вообще у меня dovecot.conf был странный. Там небыло нифига половины секций, что описаны.
Dovecot версии 2.1.7
У меня, кстати, тоже VDS Hetzner. Я заметил, что Hetzner во внешние репозитории не пускает, а ставит из своих.
Наверное какой-то секции нужной не описано или где-то опечатка. Я правил эти конфиги — http://daily-notes.ru/files/2013/03/dovecot_conf.zip — попробуй на них.
Ок, спасибо, сейчас попробую. По результатам отпишусь.
Вобщем, проблема в том, что .conf файлы от dovecot 1 не подходят для dovecot 2. А вот как настраивать dovecot 2 и на английском-то манов почти нету… Тупик.
Dovecot rое-как настроил, но теперь новая проблема:
Mar 17 11:08:29 da dovecot: auth: Fatal: Unknown database driver ‘mysql’
Mar 17 11:08:29 da dovecot: master: Error: service(auth): command startup failed, throttling for 60 secs
Mar 17 11:08:29 da postfix/smtpd[3263]: fatal: no SASL authentication mechanisms
http://daily-notes.ru/2013/12/vds_mail_server_postfix_dovecot2/ — вот короче дошли руки
Спасибо за ответ. Заработало кое как. ))
А не подскажете такую вещь? Я вижу в логах, что постфикс принимает и отправляет письма. Могу посмотреть письма в очереди, но после отправки в очереди они удаляются (в принципе, это понятно). Но хотелось бы знать сохраняются ли они куда-то после отправки и удаления из очереди. Можно ли где-то посмотреть уже отправленные письма.
P.S. отправляю письма не через почтовый агент, а через внешнюю почту на один из ящиков своего почтового сервера.
/home/vmail/domain-name/account-login/.Sent
Не уверен правда, пишется ли туда если отправлять вашим способом.
К сожалению там их нет… Никак не могу найти… Но всё таки спасибо.
Можно ли как решить такую ситуацию? Postfix автоматически создал три почтовых ящика: root, www-data и smmsp. С этими ящиками postfix постоянно работает. С www-data периодически отправляются письма (если я правильно понял, они отправляются на root и www-data). Никак не могу найти как и каким образом postfix это делает. И уж тем более как это отключить, не знаю и в интернете найти не могу.
Если кто в курсе как это исправить подскажите, пожалуйста.
Мдя.
В новой версии dovecot все эти настройки раскиданы по файлам в папке /etc/dovecot/conf.d/
А есть совсем непонятные вещи. К примеру подключение протоколов идет из папки /usr/share/dovecot/protocols.d/*.protocol
И т.п.
Похоже сложно будет мне закончить то, что уже начал…
Ну вряд ли это невозможно — настроить Dovecot2 %) вот буквально дня 2 назад видел в инете мануалы по настройке.
http://daily-notes.ru/2013/12/vds_mail_server_postfix_dovecot2/ — руки дошли
[…] разнесли на несколько маленьких конфигов. Читаем про установку postfix+dovecot под ubuntu и делаем все до секции «Настройка виртуального […]
Создаем БД для почты и аккаунт для работы с этой БД в MySQL:
grant all on mailserver.* to mailuser@localhost identified by ‘mysql_mailuser_password’;
Выбераем созданную БД для работы:
USE mailserver;
Возникла заминка на данном шаге. Выдается:
mysql> USE mailserver;
Database changed
Спасибо большое, по вашей инструкции смог настроить почтовый сервер в Ubuntu Server 16.04