1 (27.04.2010 15:24:10 отредактировано forkostya)

Автор: Кузнецов Константин

[size=7]Почтовый сервер (postfix, dovecot, squirrelmail)[/size]

План:
1. Введение
2. Чего хотим добиться
3. Что нам понадобится
4. Составляем план действий
5. Настройка согласно плану
6. Популярные ошибки и ЧАВО
7. Приложение. Порядок отправки/приёма писем.
8. Используемая и рекомендуемая литература

------------------------------------------------------------

[size=6]1. Введение[/size]

Мало кто будет спорить, что широкому развитию глобальной сети Интернет поспособствовала возможность мгновенного обмена электронной почтой.

Материал из Википедии — свободной энциклопедии
Электронная почта (англ. email, e-mail, от англ. electronic mail) — технология и предоставляемые ею услуги по пересылке и получению электронных сообщений (называемых «письма» или «электронные письма») по распределённой (в том числе глобальной) компьютерной сети. Основным отличием от прочих систем передачи сообщений (например, служб мгновенных сообщений) является возможность отложенной доставки и развитая (и запутанная из-за длительного времени развития) система взаимодействия между независимыми почтовыми серверами.

Трудно себе представить уважающую себя коммерческую организацию, не имеющую собственный почтовый сервер, обрабатывающего почтовые ящики своего домена. Почтовый сервер, работающий под операционной системой GNU/Linux - признак хорошего тона со стороны системного администратора такой компании. О настройке такой системы мы и поговорим в этой статье.

------------------------------------------------------------

[size=6]2. Чего хотим добиться[/size]

Казалось бы, ответ очевиден:
Хотим настроить почтовую систему, да так, чтобы пользователи могли присылать письма нам, мы их могли получать и отвечать на них.
Но такой ответ не подойдет. Есть множество нюансов, в зависимости от которых процесс настройки пойдет в ту или иную сторону. Еще раз, что мы хотим?
Хотим настроить (научиться настраивать) почтовую систему таким образом:
Пункт 1. Чтобы она могла принимать и хранить письма для пользователей нескольких доменов (user1@domain1.ru, user2@domain2.com и т.д.) с поддержкой переадрессации писем на другие адреса (алиас)
По-умолчанию, почтовая система postfix, которую мы используем, принимает письма только для домена, соответствующего названию компьютера (server или computername). Изменить это можно с помощью добавления опции "virtual_mailbox_domains = " (виртуальные почтовые домены).
Пункт 2. Чтобы список этих доменов и их пользователей с алиасами находился в базе данных.
По-умолчанию, используются системные пользователи (которых добавляют с помощью useradd). Так как мы будем настраивать систему, обслуживающую несколько доменов, то такой подход уже подразумевает разбиение всех пользователей на системных и виртуальных, потому что в разных доменах могут быть разные пользователи с одинаковыми именами (user1@domain1.ru, user1@domain2.ru). Причем удобнее всех пользователей делать виртуальными, отказавшись от системных. Там ими и управлять проще, и запутаться будет труднее при настройке, и вообще не удобно в системе держать несколько десятков или сотен пользователей. Виртуальных пользователей можно хранить в текстовом формате в файле (т.е. "добавить пользователя" - будет означать "просто добавить в файл строчку об этом пользователе"), а можно (так будет удобнее) в базе данных mysql (просто добавляем запись в таблицу и пользователь готов).
Пункт 3. Чтобы пользователь мог получать письма по протоколам pop3 и imap4, находясь в любом месте земного шара, зная пароль (который тоже будет храниться в базе mysql).
По-умолчанию, полученные письма складываются в директорию /var/mail/ и представляют собой текстовый файл, имя которого соответствует имени пользователя, например /var/mail/user. Письма эти соответственно могут читать только системные пользователи, например, с помощью команды mail (необходимо установить дополнительный пакет mailutils). Таким образом, для получения письма системному пользователю, находясь удаленно, необходимо залогиниться в системе, например, через ssh, и получить почту командой mail. Но мы хотим пользоваться удобными средствами для приема почты, такими как thunderbird. А для этого одного postfix будет мало - он лишь smtp-сервер. Для наших целей существует pop3-сервер или imap-сервер (более новый протокол доступа к почтовому ящику). Мы будем использовать dovecot.
Пункт 4. Чтобы пользователь мог отсылать письма находясь в любом месте земного шара, зная этот же самый пароль.
По-умолчанию postfix отправляет письма только если в качестве клиента выступает он же (127.0.0.1). Отправлять письма, полученные для отправки от других компьютеров он не может в связи с политикой безопасности - иначе он будет считаться сервером "open relay", через который можно слать спам и прочий хлам без каких-либо препятствий. По-этому необходимо настраивать разрешения на отправку писем через наш сервер. Сначала мы разрешим отправлять письма только с компьютеров, находящихся в одной локальной сети с нашим сервером (permit_mynetworks), а потом только нашим пользователям и только по паролю. За это отвечает опция smtpd_sasl_auth_enable = yes в конфигурационном файле postfix. А механизм аутентификации мы заимствуем у dovecot, чтобы не плодить сущностей.
Пункт 5. Чтобы письма проверялись на спам.
Письма, которые будут проходить через наш сервер, могут быть разными. Причем 90% из них будут скорее всего содержать ненужную надоедливую рекламу - СПАМ. От них можно отбиваться с помощью программы spamassassin.
Пункт 6. Чтобы письма проверялись на вирусы.
Иногда бывает так, что нам пришло письмо содержащее вирус. Такие письма мы тоже будем блокировать - пакеты clamav и clamsmtpd.
Пункт 7. Чтобы присутствовал web-интерфейс для управления письмами.
Ну тут все понятно. Не у всех под рукой бывает почтовый клиент с необходимыми настройками. Squirrelmail - примитивная пародия на интерфейс почтового сервера, например такого крупного, как mail.ru. Нам его хватит за глаза.

------------------------------------------------------------

[size=6]3. Что нам понадобится[/size]

Пункт 1. Нам нужен компьютер с установленной операционной системой GNU|Linux Ubuntu 8.04 LTS желательно со всеми обновлениями и права администратора на нём.

 Консоль:
root@computername:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 8.04.3 LTS
Release:        8.04
Codename:       hardy
root@computername:~# whoami
root
root@computername:~# id
uid=0(root) gid=0(root) groups=0(root)
Пункт №2. На этом компьютере должен быть доступ в интернет. Любой: dhcp, pppoe, pptp, через шлюз, WiMax, WiFi - что угодно.
 Консоль:
root@computername:~# ping -c 1 ya.ru
PING ya.ru (77.88.21.8) 56(84) bytes of data.
64 bytes from ya.ru (77.88.21.8): icmp_seq=1 ttl=60 time=3.89 ms

--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.899/3.899/3.899/0.000 ms

Пункт №3. Открытые в файерволе порты для smtp (tcp 25), pop3 (tcp 110), imap (tcp 143) и http (tcp 80) для доступа через web-интерфейс
 Консоль:
root@computername:~# iptables -nvL INPUT
Chain INPUT (policy DROP 436K packets, 58M bytes)
pkts bytes target     prot opt in     out     source               destination
167K   52M ACCEPT     all  --  lo     *       127.0.0.0/8          127.0.0.1
  69M   78G ACCEPT     all  --  *      *       192.168.0.0/24       192.168.0.1
    2   168 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 0
  421 26628 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 8
  465 24396 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
    5   236 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:25
    5   236 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:110
    5   236 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:143
  10M 9900M ACCEPT     all  --  eth1   *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
Пункт №4. Доступ к нашему компьютеру на перечисленные выше порты из Интернета. Для этого необходим внешний статический (постоянный) ip-адрес на нашем компьютере, либо на компьютере (маршрутизаторе, модеме), который является шлюзом для нашего компьютера, и на котором нужно будет настроить переброс перечисленных портов на внутренний ip-адрес нашего компьютера. Либо динамический (меняющийся вреся от времени) внешний ip-адрес, но при этом необходимо пользоваться услугами сервисов динамических dns. Файервол провайдера не должен резать соединения по этим портам.
 Консоль:
user@client:~# nmap domain.ru
Starting Nmap 4.62 ( http://nmap.org ) at 2010-01-16 23:02 MSK
Interesting ports on 62.5.246.190:
Not shown: 1713 filtered ports
PORT   STATE SERVICE
25/tcp open  smtp
80/tcp open  http
Показаны только те порты, на которых висят службы. В этом примере я еще не поднял pop3 и imap.
Пункт №5. FQDN. Доменное имя, привязанное к нашему внешнему ip-адресу, или mx-запись в dns-зоне на dns-сервере вида
 Консоль:
user@client:~# host -t mx domain.ru
domain.ru mail is handled by 10 62.5.246.190
 Консоль:
user@client:~# nslookup domain.ru
Non-authoritative answer:
Name:   domain.ru
Address: 62.5.246.190
Пункт №6. Пакеты postfix, postfix-mysql, dovecot-pop3d, dovecot-imapd, mysql-server-5.0, mailutils, clamav, clamsmtp, apache2, squirrelmail, squirrelmail-locales, spamassassin, spamc.

------------------------------------------------------------

[size=6]4. Составляем план действий[/size]

Пункт №1. Настраиваем самый простой вариант почтовой системы - обслуживание одного домена, системные пользователи, отправка и получение писем только локально (с помощью команды mail) без поддержки pop3 или imap.
Пункт №2. Устанавливаем и подключаем pop3 и imap серверы (dovecot) для получения писем удаленно.
Пункт №3. Настраиваем SMTP-сервер (postfix) на возможность отправлять письма из локальной сети без проверки подлинности (для общего развития, на деле же считаю это бессмысленным).
Пункт №4. Добавляем в SMTP-сервер возможность проверять пользователя через встроенный в dovecot механизм аутентификации (чтобы письма можно было отправлять не только непосредственно с сервера командой mail или из локальной сети, но и удаленно)
Пункт №5. Добавляем поддержку виртуальных пользователей, хранящихся в текстовом формате.
Пункт №6. Отказываемся от использования системных пользователей. Переносим их в виртуальные.
Пункт №7. Переносим всю информацию о доменах и пользователях из текстовых файлов в базу данных (mysql).
Пункт №8. Установка и настройка http-сервера (apache) и подключение к нему почтового web-интерфейса (squirrelmail).
Пункт №9. Установка и подключение Антиспам-фильтра SPAMASSASIN. Пользователю будет приходить уведомление о том, что ему пытались отправить спам. Исходное помеченное как спам сообщение будет вложено в это письмо.
Пункт №10. Устанавливаем и подключаем антивирусную проверку писем. Пользователю, которому пытались прислать письмо с вирусом, будет приходит вместо этого письма уведомление об этом факте и инструкция, как получить зараженное письмо вопреки всему.

P.S. После выполнения каждого пункта настоятельно рекомендую перезагружать все сервисы, относящиеся к электронной почте.

------------------------------------------------------------

[size=6]5. Настройка согласно плану[/size]

[size=5]Пункт №1. Настраиваем самый простой вариант почтовой системы - обслуживание одного домена, системные пользователи, отправка и получение писем только локально (с помощью команды mail) без поддержки pop3 или imap.[/size]
Устанавливаем пакет postfix, на все вопросы отвечаем так, как предлагают. Не поверите, но после этого можно уже проверить свою службу доставки писем

telnet localhost 25
helo localhost
mail from:<>
rcpt to:<user@computername>
data
тут пишем текст, например hello
. (просто точка)
quit

Получаем в ответ

 Консоль:
250 2.0.0 Ok: queued as 2AB015121B3
После чего проверяем, доставлено ли письмо адресату
 Консоль:
cat /var/log/mail.log|grep 2AB015121B3
В выводе должно быть
 Консоль:
Jan 16 22:55:06 computername postfix/smtpd[19361]: 2AB015121B3: client=localhost[127.0.0.1]
Jan 16 22:55:15 computername postfix/cleanup[19371]: 2AB015121B3: message-id=<20100116195506.2AB015121B3@computername>
Jan 16 22:55:15 computername postfix/qmgr[16712]: 2AB015121B3: from=<>, size=338, nrcpt=1 (queue active)
Jan 16 22:55:15 computername postfix/local[19372]: 2AB015121B3: to=<user@computername>, relay=local, delay=24, delays=24/0.01/0/0.04, dsn=2.0.0, status=sent (delivered to mailbox)
Jan 16 22:55:15 computername postfix/qmgr[16712]: 2AB015121B3: removed
Проверяем
 Консоль:
cat /var/mail/user

From MAILER-DAEMON  Sat Jan 16 17:02:34 2010
Return-Path: <>
X-Original-To: user@computername
Delivered-To: user@computername
Received: from localhost (localhost [127.0.0.1])
        by computername (Postfix) with SMTP id 4C174512135
        for <user@computername>; Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
Message-Id: <20100116140225.4C174512135@computername>
Date: Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
From: MAILER-DAEMON
To: undisclosed-recipients:;

hello

Далее, устанавливаем пакет mailutils и получаем этим пользователем почту.

 Консоль:
root@computername:~/# su user
user@computername:~/# mail

"/var/mail/user": 1 сообщение 1 новое
>N   1 MAILER-DAEMON      Сбт Янв 16  12/416   MAILER-DAEMON
&

 Консоль:
1

Date: Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
From: MAILER-DAEMON
To: undisclosed-recipients:;
hello
&

 Консоль:
q

1 сообщение удержано в /var/mail/user

Отлично, письмо получено. Попробуем отправить письмо:

 Консоль:
echo "hello"|mail -s "Subject" user
Этой командой мы вывели слово hello, но вывод перенаправили в программу mail, которая завернула это слово в текст сообщения (так уж она работает, и это логично), темой сообщения обозначили "Subject" и отправили это все пользователю user. Если мы от его имени проверим почту еще раз - увидим и это сообщение в списке писем. Почтовая система работает, но только внутри системы. Осталось её настроить на нормальную работу.
Забэкапим оригинал конфига
 Консоль:
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
и можно приступать.
Идем в main.cf. После установки его содержимое было таким:

#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = computername
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = computername, localhost.localdomain, , localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

Вносим первые изменения, добавив наш домен для обслуживания почтовой системой

myorigin = domain.ru
myhostname = $myorigin
mydestination = computername, localhost.localdomain, , localhost, $myorigin

Перезагружаем postfix, теперь можем проверить отправку почты внешним адресатам:

 Консоль:
telnet localhost 25
helo localhost
mail from:<user@domain.ru>
rcpt to:<admin@mail.ru>
data
Subject: helloworld
Good mornong
.
Получаем в ответ
 Консоль:
250 2.0.0 Ok: queued as 97B365121B0
или же
 Консоль:
echo "Good job"|mail -s "test message" admin@mail.ru
но тогда мы не узнаем идентификатор письма (97B365121B0) для поиска и устранения ошибок.
На мэйле проверяем письмо через секунд 5-10. Если ничего нет, то выполняем
 Консоль:
cat /var/log/mail.log |grep 97B365121B0
В моем случае все прошло нормально, и в логах об этом сообщают вот что:
 Консоль:
Jan 16 17:30:43 computername postfix/smtpd[16762]: 97B365121B0: client=localhost[127.0.0.1]
Jan 16 17:30:56 computername postfix/cleanup[16765]: 97B365121B0: message-id=<20100116143043.97B365121B0@domain.ru>
Jan 16 17:30:56 computername postfix/qmgr[16712]: 97B365121B0: from=<user@domain.ru>, size=370, nrcpt=1 (queue active)
Jan 16 17:31:01 computername postfix/smtp[16766]: 97B365121B0: to=<admin@mail.ru>, relay=mx.mail.ru[62.32.54.188]:25, delay=26, delays=20/0.01/5.2/0.12, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B8580C7C9F)
Jan 16 17:31:01 computername postfix/qmgr[16712]: 97B365121B0: removed
Ключевое словосочетание status=sent. После этого мы с мэйла отправляем ответ на это письмо нашему пользователю user@domain.ru. Письмо должно прийти, если всё выполняли правильно.
Теперь обратим внимание на две строки в файле main.cf:

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

внимательно посмотрим на содержимое этих файлов

root:   user

Таким образом мы указали, что письма для пользователя root будут пересылаться пользователю user. Таким образом, user является алиасом для root. Проверим это: отправим письмо для root, а получим его user-ом. В логах это видно так:

 Консоль:
Jan 17 12:52:57 computername postfix/local[27259]: 24D4E512109: to=<user@domain.ru>, orig_to=<root@domain.ru>, relay=local, delay=0.14, delays=0.13/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Подмена ящика видна из слов to=<user@domain.ru>, orig_to=<root@domain.ru>.
Если нам понадобится добавить еще один алиас, например

user2: root
postmaster: user2

то после сохранения файла /etc/aliases необходимо выполнить

 Консоль:
postalias /etc/aliases
или просто
 Консоль:
newaliases
потому что postfix работает не с этим файлом напрямую, а с /etc/aliases.db, который получается путем преобразования исходного файла. Причем пользователи postmaster и user2 не обязательно должны присутствовать в системе. Письма для них все равно пересылаются от одного другому, от другого руту, а от рута нашему user-у. Так что алиасы добавляются намного проще, чем пользователи в нашу почтовую систему.
Пока что все отлично. Письма уходят и приходят. Что еще для счастья нужно?

[size=5]Пункт №2. Устанавливаем и подключаем pop3 и imap серверы (dovecot) для получения писем удаленно.[/size]
Устанавливаем dovecot-pop3d и dovecot-imapd. Конфигурационный файл /etc/dovecot/dovecot.conf по-умолчанию такой:

protocols = imap imaps pop3 pop3s
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_privileged_group = mail
protocol imap {
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}
auth default {
  mechanisms = plain
  passdb pam {
  }
  userdb passwd {
  }
  user = root
}
dict {
}
plugin {
}

Бэкапим и редактируем, добавив 1 опцию и отредактировав 1 опцию

# imaps и pop3s нам не нужны
protocols = imap pop3
# разрешаем принимать пароли открытым текстом
disable_plaintext_auth = no

После этого перезапускаем dovecot и проверяем почтовым клиентом pop3 и imap.

[size=5]Пункт №3. Настраиваем SMTP-сервер (postfix) на возможность отправлять письма из локальной сети без проверки подлинности.[/size]
Для общего развития нам необходимо добавить возможность отправлять письма через наш почтовый сервер без авторизации всем, чьи компьютеры расположены в локальной сети сервера. Для этого необходимо в main.cf добавить 1 строку и изменить 1 строку:

mynetworks = 127.0.0.0/8 192.168.0.0/24
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

Очевидно, что если мы туда же запишем наш домашний ip-адрес, то и из дома мы сможем отправлять письма через сервер без пароля. Во второй строке разрешается отправлять письма не только тем, кто находится в "моих сетях", но и прошедшим аутентификацию. Прикрутим её сюда.

[size=5]Пункт №4. Добавляем в SMTP-сервер возможность проверять пользователя через встроенный в dovecot механизм аутентификации.[/size]
/etc/postfix/main.cf:

smtpd_sasl_auth_enable = yes
  smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth

/etc/dovecot/dovecot.conf:

auth default {
mechanisms = plain login

socket listen {
  client {
   path = /var/spool/postfix/private/auth
   user = postfix
  }
}

перезапускаем postfix и dovecot.

[size=5]Пункт №5. Добавляем поддержку виртуальных пользователей, хранящихся в текстовом формате.[/size]
Добавляем в /etc/postfix/main.cf:

# прописываем домены, для чьих пользователей будет принимать письма наш сервер
virtual_mailbox_domains = domain1.ru, domain2.net, domain3.org, domain4.com
# Путь к директории, где будут лежать письма пользователей этих доменов
virtual_mailbox_base = /var/mail/virtual/
# Путь к файлу, где указаны пути к почтовым ящикам относительно переменной $virtual_mailbox_base
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
# Указываем user id (владельца), под чьим именем будут храниться файлы почты
virtual_uid_maps = static:1001
# Указываем group id (группы), под чьим именем будут храниться файлы почты
virtual_gid_maps = static:1001

Добавляем пользователя в систему, под чьим именем будет храниться вся почта

 Консоль:
groupadd -g 1001 vmail
useradd -u 1001 -g 1001 vmail
Создаем папку /var/mail/virtual и назначаем ей права указанного пользователя и группы
 Консоль:
mkdir /var/mail/virtual
chown 1001:1001 /var/mail/virtual
создем файл /etc/postfix/virtual_mailbox_maps с содержимым:
 Консоль:
user@domain111.ru domain111.ru/user/
выполняем:
 Консоль:
postmap /etc/postfix/virtual_mailbox_maps
С smtp-сервером закончили. Теперь идем к pop3/imap. Правим /etc/dovecot/dovecot.conf:

# Тут будет лежать почта виртуальных пользователей
mail_location = maildir:/var/mail/virtual/%d/%n
# Так как у нас могут быть в разных доменах разные пользователи
# с одинаковыми ящиками, то мы меняем аутентификацию на учет
# доменного имени, как части логина (в почтовом клиенте так же
# меняем login:user на login:user@domain
auth_username_format = %Ln@%Ld
# Аутентификация будет происходить на основании паролей, хранящихся в файле
passdb passwd-file {
     args = /etc/dovecot/passwd
  }
# Пользователи со своими UID и GID будут лежать в другом файле
  userdb passwd-file {
    args = /etc/dovecot/users
  }

Добавляем пользователя в /etc/dovecot/users:

user@domain111.ru::1001:1001

Генерируем пароль для пользователя

 Консоль:
dovecotpw -s DIGEST-MD5 -u user@domain111.ru
И кладем его в файл паролей /etc/dovecot/passwd:

user@domain111.ru:{DIGEST-MD5}583d7d41e60ae44911cdb4b3d800aafc

Проверяем - должно все работать.
После этого мои системные пользователи локального домена (domain.ru) работать перестали (не получают и не отправляют почту). Копал-копал и решил, что dovecot-у для проверки пользователя необходимо указать "логин@домен", а системные пользователи у нас работали только через "логин". Я ломать голову не стал и, учитывая что все пользователи все равно у меня будут виртуальными, начал переносить исходный домен с пользователями.

[size=5]Пункт №6. Отказываемся от использования системных пользователей. Переносим их в виртуальные.[/size]
Подправим конфиг постфикса /etc/postfix/main.cf:

# возвращаем обратно
myorigin = computername
# перечисляем домены, для которых будем принимать почту,
# иначе будет ошибка "relay access denied"
virtual_mailbox_domains = domain.ru, domain111.ru, domain222.ru
# Поменяем это значение для общего развития, хотя можно оставить прежним
virtual_uid_maps = hash:/etc/postfix/virtual_uid_maps
# Поменяем это значение для общего развития, хотя можно оставить прежним
virtual_gid_maps = hash:/etc/postfix/virtual_gid_maps
# а если у нас всегда uid=gid, то можно только один файл
# из них сделать и тут указать его в обоих случаях,
# либо virtual_gid_maps = $virtual_uid_maps

Подправим ряды виртуальных пользователей /etc/postfix/virtual_mailbox_maps:

user@domain111.ru domain111.ru/user/
user@domain.ru domain.ru/user/

 Консоль:
postmap /etc/postfix/virtual_mailbox_maps
Создадим файлы с UID-ами и GID-ами /etc/postfix/virtual_uid_maps (virtual_gid_maps в моем случае такой же):

user@domain111.ru 1001
user@domain.ru 1001

 Консоль:
postmap /etc/postfix/virtual_uid_maps
postmap /etc/postfix/virtual_gid_maps
Укажем UID и GID переносимого пользователя для довекота /etc/dovecot/users:

user@domain111.ru::1001:1001
user@domain.ru::1001:1001

Зашифруем пароль пользователя

 Консоль:
dovecotpw -s DIGEST-MD5 -u user@domain.ru
Добавим пользователя с его зашифрованным паролем в базу паролей /etc/dovecot/passwd:

user@domain111.ru:{DIGEST-MD5}582d7341460se47911cdb4b3d800aafc
user@domain.ru:{DIGEST-MD5}4fe5g32cb1at8a13b64cfj4d894e7ae2

Перезапускаем dovecot и postfix, проверяем отправку и получение писем перенесенным пользователем. Теперь его почтовый ящик находится по адресу /var/mail/virtual/domain.ru/user/

[size=5]Пункт №7. Переносим всю информацию о доменах и пользователях из текстовых файлов в базу данных (mysql).[/size]

Устанавливаем mysql-сервер (mysql-server-5.0) и связующее звено между ним и postfix-ом (postfix-mysql).
Переходим в mysql

 Консоль:
mysql -p
Создаем базу
 Консоль:
mysql> create database mail;
В ней создаем таблицу, в зависимости от того, какие значения мы хотим хранить в базе.
 Консоль:
mysql> CREATE TABLE `mail_users` (
  `id` int(10) NOT NULL auto_increment,
  `user` varchar(128) collate cp1251_general_cs NOT NULL,
  `domain` varchar(255) collate cp1251_general_cs NOT NULL default 'squid.cetcoltd.ru',
  `password` varchar(64) collate cp1251_general_cs NOT NULL,
  `active` tinyint(1) NOT NULL default '1',
  `alias` varchar(255) collate cp1251_general_cs NOT NULL default 'info@squid.cetcoltd.ru',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs COMMENT='postfix_dovecot';

Назначаем пользователя, которому можно только делать выборку из баз (только чтение), от имени которого будут получать информацию из базы наши postfix и dovecot.
 Консоль:
mysql> GRANT SELECT ON mail.mail_users TO 'mailuser'@'localhost' IDENTIFIED BY 'password';
Заменяем значение в файле /etc/postfix/main.cf:

#virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf

Создаем файл /etc/postfix/virtual_mailbox_maps.cf , в котором будет храниться информация о том, как из базы mysql получить необходимую информацию:

user = mailuser
password = password
dbname = mail
hosts = 127.0.0.1:3306
query = SELECT CONCAT(domain,'/',user,'/') as home FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'

Строку с запросом так же можно записать другим способом:

query = SELECT '%d/%u/' as home FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'

Тут должно быть понятно. Выбираем объединение домена, /, пользователя, / из таблицы, где пользователь = полученный user, domain = домен. Таким образом запрос должен возвращать ответ вида:

domain.ru/user/

Это значение прибавляется к virtual_mailbox_base и получается полный путь к почтовому ящику

/var/mail/virtual/domain.ru/user/

Тоже самое делаем и с alias. Правим /etc/postfix/main.cf:

virtual_alias_maps = mysql:/etc/postfix/virtual_alias_maps.cf

Файл /etc/postfix/virtual_alias_maps.cf такой же, как и /etc/postfix/virtual_mailbox_maps.cf, за исключением строки запроса:

query = SELECT alias FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'

Так же можно поступить с uid и gid, но для этого нужно было в нашу таблицу добавить соответствующие поля. Я предпочетаю вариант uid и gid = static:1001.
Проверяем, работает ли эта связка. Отправляем себе письмо с другого ящика и смотрим логи. Еще можно проверять размер ящика:

 Консоль:
du -s /var/mail/virtual/domain.ru/user
У меня он меняется килобайта на 4 при приеме тестового письма.
С SMTP закончили, теперь нам нужно изменить dovecot (pop3, imap) на использование данных из mysql. Вносим изменения в файл /etc/dovecot/dovecot.conf:

passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
  userdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }

Теперь редактируем файл /etc/dovecot/dovecot-sql.conf:

# Драйвер - к какой базе данных подключаемся.
driver = mysql
# Перечисляем базу, имя пользователя и его пароль
connect = host=localhost dbname=mail user=mailuser password=password
# Указываем, в каком виде лежит в базе зашифрованный пароль
default_pass_scheme = PLAIN-MD5
# SQL-Запрос на получение пароля из базы.
password_query = SELECT password FROM mail_users WHERE user = '%n' AND domain = '%d'
# SQL-Запрос на получение пути к почтовому ящику.  UID и GID у нас в базе не лежат, по-этому подставляем значение прямо в запрос.
user_query = SELECT '1001' as uid, '1001' as gid FROM mail_users WHERE user = '%n' AND domain = '%d'

%u - это полностью имя пользователя, как его передали, а %n - только его первая часть, в случае если был использован вид user@domain.
Проверяем почту по обоим протоколам pop3 и imap - есть письмо.
Для того, чтобы не было недопонимания, убираем предыдущую поддержку пользователей через passwd-файлы. Для этого нужно закомментировать в файле /etc/dovecot/dovecot.conf строки:

#passdb passwd-file {
    # Path for passwd-file
    #args = /etc/dovecot/passwd
  #}
  #userdb passwd-file {
    # Path for passwd-file
    #args = /etc/dovecot/users
  #}

Готово.

[size=5]Пункт №8. Установка и настройка http-сервера (apache) и подключение к нему почтового web-интерфейса (squirrelmail).[/size]
Устанавливаем пакеты squirrelmail и squirrelmail-locales. Идем в /etc/squirrelmail/apache2.conf, копируем оттуда верхушку

Alias /squirrelmail /usr/share/squirrelmail

<Directory /usr/share/squirrelmail>
  Options Indexes FollowSymLinks
  <IfModule mod_php4.c>
    php_flag register_globals off
  </IfModule>
  <IfModule mod_php5.c>
    php_flag register_globals off
  </IfModule>
  <IfModule mod_dir.c>
    DirectoryIndex index.php
  </IfModule>

  # access to configtest is limited by default to prevent information leak
  <Files configtest.php>
    order deny,allow
    deny from all
    allow from 127.0.0.1
  </Files>
</Directory>

и вставляем в /etc/apache2/apache2.conf или в /etc/apache2/sites-available/default. Куда хотите. Web-интерфейс станет доступен по адресу http://domain.ru/squirrelmail. Можно изменить на http://domain.ru/mail, для этого необходимо в той части, которую копировали изменить первую строку

Alias /mail /usr/share/squirrelmail

Перезагружаем apache, заходим браузером на наш domain.ru/squirrelmail, если работает почтовый клиент по imap протоколу, то и squirrelmail заработает без проблем. Вводим логин, пароль и пользуемся. Для изменения языка интерфейса используем утилиту squirrelmail-configure. Выбираем 10. Languages, приводим значения к виду

1.  Default Language       : ru_RU
2.  Default Charset        : cp1251

[size=5]Пункт №9. Установка и подключение Антиспам-фильтра SPAMASSASIN. Пользователю будет приходить уведомление о том, что ему пытались отправить спам. Исходное помеченное как спам сообщение будет вложено в это письмо.[/size]
Устанавливаем spamassassin и spamc. Конфигурационный файл - /etc/spamassassin/local.cf:

rewrite_header Subject *****SPAM*****

Остальное можно оставить по-умолчанию. Если попытаемся запустить службу

 Консоль:
root@computername:~# /etc/init.d/spamassassin restart
то увидим ошибку

SpamAssassin Mail Filter Daemon: disabled, see /etc/default/spamassassin

Идем в файл /etc/default/spamassassin и исправляем:

ENABLED=1

Далее идем в /etc/postfix/master.cf и прикручиваем туда антиспам проверку.
Вместо строки

smtp      inet  n       -       -       -       -       smtpd

вставляем

smtp      inet  n       -       n       -       -       smtpd
  -o content_filter=spam:dummy

spam      unix  -       n       n       -       -       pipe
  flags=R user=vmail argv=/usr/bin/spamc -u vmail -e /usr/sbin/sendmail -f $sender $recipient

Каждая вторая строчка из приведенных должны начинаться в этом файле с двух пробелов. Только в этом случае она будет считаться продолжением предыдущей. virtual - пользователь, которого мы создали. Перезапускаем postfix, spamassassin и пытаемся сами себе отправить письмо с содержанием сигнатуры спама:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Через несколько секунд нам придет письмо с темой *****SPAM*****, в котором будет рассказано (к сожалению на английском), что нам пытались отправить спам-письмо, которое будет прикреплено вложением и мы его сможем прочитать. Можно настроить, чтобы уведомление приходило на русском языке. Для этого берем шаблон, переводим на русский, переводим в другую кодировку (из utf8 в koi8-r, чтобы русский был, а не крокозябры) и добавляем к конфигу /etc/spamassassin/local.cf

 Консоль:
root@computername:~# cp /usr/share/spamassassin/10_10_default_prefs.cf /tmp/text1

report_charset ru_RU.KOI8-R
clear_report_template
report Система СПАМ-обороны на сервере "_HOSTNAME_"
report пометила данное сообщение как возможную рекламу. Исходное сообщение
report было присоеденино к данному, так что вы можете его просмотреть
report либо добавить фильтр на его основании. Если у вас есть какие-либо
report вопросы, обратитесь к разделу _CONTACTADDRESS_ для получения
report дополнительной информации
report Предпросмотр исходного сообщения:  _PREVIEW_
report
report Content analysis details:   (_SCORE_ points, _REQD_ required)
report
report " pts rule name              description"
report  ---- ---------------------- --------------------------------------------------
report _SUMMARY_

clear_unsafe_report_template
unsafe_report Исходное сообщение не является простым текстом, и открывать его
unsafe_report может быть небезопасно. Оно может содержать подтверждение о том,
unsafe_report что ваш почтовый ящик благополучно получаем спам-сообщения.
unsafe_report Если вы все равно хотите его просмотреть, будет безопасно сделать
unsafe_report это с помощью любого текстового редактора, например "блокнот".

 Консоль:
cat /tmp/text1 |iconv -f utf8 -t koi8-r>/tmp/text2
root@computername:~# cat /tmp/text2 >> /etc/spamassassin/local.cf
Перезагружаем spamassassin, шлем себе тестовое спам-письмо и читаем.

[size=5]Пункт №10. Устанавливаем и подключаем антивирусную проверку писем. Пользователю, которому пытались прислать письмо с вирусом, будет приходит вместо этого письма уведомление об этом факте и инструкция, как получить зараженное письмо вопреки всему.[/size]
Устанавливаем пакеты clamav и clamsmtp. После установки пакетов следует сразу же обновить антивирусные базы командой freshclam. Добавляем в файл /etc/postfix/main.cf строку:

content_filter = scan:[127.0.0.1]:10026

Которая указывает smtp-серверу, чтобы он проверял содержимое письма с помощью фильтра scan, работающего на локальном порту 10026.
В файл /etc/postfix/master.cf первыми строками (перед спам-проверкой):

scan      unix  -       -       n       -       16      smtp
    -o smtp_send_xforward_command=yes
    -o smtp_tls_security_level=none

127.0.0.1:10025 inet  n -       n       -       16      smtpd
    -o content_filter=
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
    -o smtpd_helo_restrictions=
    -o smtpd_client_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks_style=host
    -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Напоминаю, что необходимо ставить два пробела впереди строки, чтобы она считалась продолжением предыдущей.
Конфигурационный файл антивирусного фильтра /etc/clamsmtpd.conf оставляем без изменений:

OutAddress: 10025
Listen: 127.0.0.1:10026
ClamAddress: /var/run/clamav/clamd.ctl
TempDirectory: /var/spool/clamsmtp
PidFile: /var/run/clamsmtp/clamsmtpd.pid
User: clamsmtp

Остальное я оставил так как есть.
По-умолчанию, антивирусный фильтр будет просто молча отбрасывать все письма, содержащие по его мнению вирусы. Согласитесь, было бы неплохо уметь настраивать его так, чтобы нам приходило уведомление об этом с возможностью таки получить это письмо.
Пишем простенький скриптик /tmp/text3:

#!/bin/sh
ADMIN="admin@mail.ru"
MAILTO="$RECIPIENTS,$ADMIN"
SUBJECT=$(cat $EMAIL|grep Subject|awk -F: '{print $2}')
TEXT="ВНИМАНИЕ!!!\n\nНа почтовый адрес $RECIPIENTS пришло сообщение, содержащее ВИРУС!\n"
TEXT=$TEXT"\nНе волнуйтесь, вирус обезврежен антивирусным программным обеспечением, установленным на почтовом сервере."
TEXT=$TEXT"\nВашим данным ничто не угражает."
if [ "x$EMAIL" != "x" ] && [ -f $EMAIL ]
then
TEXT=$TEXT"\nПисьмо добавлено в карантин: $EMAIL \n"
fi
TEXT=$TEXT"\nОтправитель:         $SENDER"
TEXT=$TEXT"\nТема сообщения:        $SUBJECT"
TEXT=$TEXT"\nИдентификатор Вируса:     $VIRUS"
        #TEXT=$TEXT"\nПочтовый клиент:    $CLIENT"
        #TEXT=$TEXT"\nПочтовый сервер:    $SERVER"
TEXT=$TEXT"\n\nЕсли вы уверены, что письмо не содержит вредоносного содержимого, либо, не смотря ни на что, вы все равно хотите прочитать данное сообщение и готовы взять всю ответственность за возможные компьютерные неисправности и сбои на себя, перешлите это сообщение администратору сервера по адресу $ADMIN"
TEXT=$TEXT"\nОбратите внимание, что в карантине зараженные письма находятся 7 дней, после чего удаляются без возможности восстановления!"
TEXT=$TEXT"\n\nС наилучшими пожеланиями,\nВаш администратор."
echo "$TEXT" | mail -s "[ВИРУС] $SUBJECT" $MAILTO

Который так же как и в случае со спамом перекодируем

 Консоль:
cat /tmp/text3|iconv -f utf8 -t koi8-r>/etc/virusaction.sh
делаем его запускным
 Консоль:
chmod +x /etc/virusaction.sh
Добавляем в файл /etc/clamsmtpd.conf строку:

VirusAction: /etc/virusaction.sh

перезапускаем postfix и clamsmtpd, отправляем себе письмо, содержащее в теле сообщения

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Получаем уведомление на русском. Если ваши пользователи могут захотеть получать свои зараженные письма, вам следует в файле /etc/clamsmtpd.conf добавить опцию

Quarantine: on

После чего им в уведомлении будет указан файл-карантин, в котором хранится зараженное письмо.

Письмо добавлено в карантин: /var/spool/clamsmtp/virus.MQYlXX

Вы просто копируете файл-карантин в его папку

 Консоль:
cp /var/spool/clamsmtp/virus.MQYlXX /var/mail/virtual/domain.ru/user/new/
После чего он благополучно получит свое письмецо.

------------------------------------------------------------

[size=6]6. Популярные ошибки и ЧАВО[/size]

Во-первых, Не удалось подружить squirrelmail и отчет о спам- и вирус- блокировках. Видно все крокозябрами, хотя почтовые клиенты отображают все отлично, и squirrelmail видит другие письма на русском нормально.
Во-вторых, я сначала в файле /etc/dovecot/dovecot-sql.conf запрос пароля указал так:

password_query = SELECT user, password FROM mail_users WHERE user = '%n' AND domain = '%d'

После чего испытал такие глюки, каких не ожидал: либо во втором запросе в базу не передавалось значение домена, либо вместо второго запроса подставлялся совершенно другой. Очень удивился, когда все заработало нормально после удаления слова user, из password_query-запроса.

В-третьих, все работало хорошо до некоторых пор. Письма перестали уходить, postqueue -p выдавал большую очередь, у всех зависших писем одна и та же проблема:
(host 127.0.0.1[127.0.0.1] said: 451 Local Error (in reply to end of DATA command))
Начал рыть. Временное решение проблемы - отключить в postfix проверку на вирусы. Для этого необходимо закомментировать в файле /etc/postfix/main.cf строчку content_filter. Письма стали уходить, но без проверки на вирусы. Разбираемся дальше.

tail /var/log/mail.log

выдал

clamsmtpd: 100011: CLAMAV: couldn't connect to: /var/run/clamav/clamd.ctl: No such file or directory

Идем дальше.

/etc/init.d/clamav-daemon status

* clamd is not running.

/etc/init.d/clamav-daemon start

Видим много слов, среди которых

...
This ClamAV version has reached End of Life! Please upgrade to version 0.95 or later.
...

Обновляемся

apt-get update
apt-get install clamav clamav-base

Запускаем

/etc/init.d/clamav-daemon restart
/etc/init.d/clamsmtp restart

Изменяем postfix на использование антивирусной проверки (надо раскомментировать content_filter) и перезапускаемся

/etc/init.d/postfix restart

Проверяем - все работает.

P.S. Данный раздел будет пополняться

------------------------------------------------------------

[size=6]7. Приложение. Порядок отправки/приёма писем.[/size]

Порядок отправки писем

В этой цепочке участвуют только клиентская программа (thunderbird, outlook), наш сервер smtp (postfix), другой сервер smtp (postfix, exim, qmail, exchange...)

Наш сервер postfix принимает соединение на 25 порту. Ему все равно, подключился к нему его клиент через почтовую программу, который хочет отправить это письмо кому-то дальше, или удаленный сервер, который хочет передать нашему серверу письмо для его клиента;
Проверяет, для кого предназначено письмо. Если для домена, который он обслуживает - то принимает письмо, ищет у себя в базе пользователей этого домена путь к ящику вида "/var/mail/virtual/domain.ru/user". Если такой пользователь (ящик) есть - перекладывает файл-письмо туда. Если такого пользователя нет, отправителю исходного письма отправляется соответственное уведомление (письмом).

Если письмо предназначено для пользователя из другого домена - запрашивает логин/пароль (иначе наш сервер считался бы OPEN RELAY и мог слать через себя СПАМ);
Полученные данные отправляет механизму аутентификации, заимствованному у dovecot, через файл /var/spool/postfix/private/auth. Далее рассматриваем только тот случай, если аутентификацию прошли успешно;
Письмо помещается в очередь сообщений.
В это время наш сервер, используя DNS-сервер, прописанный в /etc/resolv.conf, узнает MX-запись (ip-адрес), соответствующую почтовому серверу, обслуживающему домен получателя. При отсутствии MX -записи делается попытка отправить на A запись;
Связывается с полученным ip-адресом на порт 25 (как если бы это был обычный почтовый клиент);
Если этот сервер действительно обслуживает этот домен, то он принимает письмо, проверяет наличие пользователя и помещает его в свою очередь, после чего письмо скорее всего переместится в каталог этого пользователя.
Если же этот сервер ошибочно указан в зоне DNS, как обслуживающий этот домен, то он не станет принимать это сообщение;

Порядок приема писем

В этой цепочке участвуют только сервер pop3/imap (dovecot) и клиентская программа (thunderbird, outlook).

Клиентская программа подключается к серверу на порт 110 (pop3) или imap (143);
Сервер выдает приглашение к аутентификации, получает данные, сверяет с базой. Далее рассматриваем только тот случай, если аутентификацию прошли успешно;
Исходя из принятого логина сервер получает полный путь к каталогу, в котором лежит его почта;
Исходя из содержимого этого каталога сервер предоставляет список всех писем клиенту;
Клиентская программа исходя из полученного списка выдает пользователю на экран перечень писем, хранящихся на сервере;

------------------------------------------------------------

[size=6]8. Используемая и рекомендуемая литература[/size]

http://ru.wikipedia.org/wiki/Электронная_почта
http://www.postfix.org/documentation.html
http://wiki.dovecot.org/
http://dedicatesupport.com/archives/20
http://dedicatesupport.com/archives/21
http://www.sys-adm.org.ua/mail/postfix- … -sa.php#c2

2

толково, полезно.
но вот это убило: "Пишем простенький скриптик /tmp/text3:" ab))))))

Linux можно любить, можно НЕ любить, но совершенно точно его уже нельзя игнорировать.

3 (27.04.2010 15:25:21 отредактировано )

Изменить на "сложненький" ? ab

Добавил
а) Приложение. Порядок отправки/приёма писем (номер 7 в плане)
б) Популярные ошибки и ЧАВО (рабочий сервер перестал слать письма)

4

пункты 5-6-7 очень массивные но об одном и том же, разве нельзя сразу в конфиги записать sql запросы?
и самое страшное, ни слова об администрировании, кок создавать новых пользователей без postfixadmin?

5

Все верно, забыл указать, как администрировать такую почту. Сейчас исправлю.
А что по поводу sql ??

6

system-root пишет:

разве нельзя сразу в конфиги записать sql запросы?

статейка чуток другого формата получится тогда ab

It is good day to die ...
MS Windows 10
Заметки о главном...

7

ну мы сначала создаем домены в файле, а потом отказываемся от них, используя БД, для понимания процессов конечно хорошо, но для некоторых это будет усложнять мне кажется.. не проще сразу дать конфиг dovecot уже с выборкой из базы и прочее?

да, forkostya, как ты поступил с clamv?
я так понял, что его лучше из сырцов ставить с сайта, т.к. он вечно орёт, что у него ядро обновилось и надо новое, которого еще нет в портах.

8

system-root пишет:

да, forkostya, как ты поступил с clamv?
я так понял, что его лучше из сырцов ставить с сайта, т.к. он вечно орёт, что у него ядро обновилось и надо новое, которого еще нет в портах.

6. Популярные ошибки и ЧАВО

...

В-третьих,

оно?

9

system-root пишет:

которого еще нет в портах.

вот в чём проблема-то, я думаю лучше не использовать clamv на машинах, которые создавались почти автономными, где раз в год зайдешь, глянешь и всё.

10

Я внес некоторые изменения в апстрим статьи. Если они будут правильными, то перенесу сюда
http://ubuntologia.ru/forum/viewtopic.p … amp;t=2299

11

Хорошая статья, но не до конца некоторые моменты разжеваны.

Нет ли у тебя аськи - задать пару вопросов по настройке? а то у меня куча ошибок и неясностей.

12

После установки почтового сервера postfix у меня возникла такая проблема: при отправке писем с почтового клиента squirremail письма успешно доходят адресату, а при отправке писем с виндовой машины с qutlok  письма уходят но никуда не доходят. Хотя прием писем на outlok работает нормально. Подскажите в чем может быть проблема?

13

в почтовой программе, а верней в её настройках, либо закрыты порты или не разрешено серверу принимать почту с IP виндоус машины.

14 (27.05.2010 15:30:00 отредактировано )

А поточнее нельзя что и где нужно изменить? вот мои файлы конфигурации postfix: main.cf и master cf. Где в них что нужно добавить или изменить?

soft_bounce = no
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
default_privs = nobody
myhostname = mail-server.company.ru
mydomain = company.ru
myorigin = $mydomain
inet_interfaces = all
mydestination =  localhost.$myhostname, localhost
unknown_local_recipient_reject_code = 550
local_recipient_maps =  $virtual_mailbox_maps, $virtual_alias_maps
mynetworks = 127.0.0.0/8, 192.168.146.0/24
#relay_domains = $mydomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mail_spool_directory = /var/spool/mail
smtpd_banner = $myhostname ESMTP
debug_peer_level = 2
debug_peer_list = 127.0.0.1
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         xxgdb $daemon_directory/$process_name $process_id & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.3.3/samples
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
config_directory = /etc/postfix

virtual_mailbox_domains = mysql:$config_directory/sql/vdomains.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = mysql:$config_directory/sql/vmailbox.cf
virtual_alias_maps = mysql:$config_directory/sql/valias.cf
virtual_minimum_uid = 1000
virtual_uid_maps = static:1000
virtual_gid_maps = static:12
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtpd_recipient_restrictions = permit_mynetworks,
            permit_sasl_authenticated,
            reject_unauth_destination,
            reject_non_fqdn_recipient,
            reject_unverified_recipient,
            reject_rbl_client cbl.abuseat.org,
            reject_rbl_client dialups.mail-abuse.org,

content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings













# Postfix master process configuration file.
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================
smtp       inet  n       -       n       -       -       smtpd
           -o content_filter=spamfilter:dummy

pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
smtp      unix  -       -       n       -       -       smtp
relay     unix  -       -       n       -       -       smtp
        -o fallback_relay=
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache

maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}

old-cyrus unix  -       n       n       -       -       pipe
  flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user}

cyrus     unix  -       n       n       -       -       pipe
  user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}

uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)

ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
   
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient

dovecot unix    -       n       n       -       -       pipe
  flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient)

scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes

127.0.0.1:10026 inet n - n - 16 smtpd
         -o content_filter=
         -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
         -o smtpd_helo_restrictions=
         -o smtpd_client_restrictions=
         -o smtpd_sender_restrictions=
         -o smtpd_recipient_restrictions=permit_mynetworks,reject
         -o mynetworks_style=host
         -o smtpd_authorized_xforward_hosts=127.0.0.0/8

spamfilter unix - n n - - pipe
  flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter -f ${sender} -- ${recipient}

Повторюсь письма у меня из outlok отправляются , правда никуда не доходят, а фаервол у меня отключен порты все открыты.

15

torodion, а в логах то чего?

16

May 27 20:46:05 mail0 dovecot: IMAP(vital@company.ru): maildir:
root=/var/vmail/company.ru/vital, index=/var/vmail/company.ru/vital,
control=, inbox=
May 27 20:46:05 mail0 dovecot: imap-login: Login:
user=<vital@company.ru>, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1,
secured
May 27 20:46:05 mail0 dovecot: IMAP(vital@company.ru): Disconnected:
Logged out

17 (27.10.2010 15:26:42 отредактировано T0PT)

покажите конечные конфигурационный файлы....
запутался пишем, потом удаляем, потом возвращаем..
бардак в конфигах

и где обещаное администрирование через веб


черезе squirrelmail залогинтся не получается .
ERROR
Error connecting to IMAP server: localhost.
111 : Connection refused

18

T0PT пишет:

покажите конечные конфигурационный файлы....
запутался пишем, потом удаляем, потом возвращаем..
бардак в конфигах

и где обещаное администрирование через веб


черезе squirrelmail залогинтся не получается .
ERROR
Error connecting to IMAP server: localhost.
111 : Connection refused

залогинеться не получается потомучто надо dovecot стартануть, у меня тоже такая же ошибка была с dovecot настройками покопался и все стало в порядке)

19

Статья отличная, 5 баллов. Спасибо, Константин.
Прочитал несколько статей, в том числе кнугу про Postfix - много информации, а в голове венегрет.
В других статьях в основном выложены готовые монолитные конфиги - делай так "... и будет тебе щастье". А почему так делать, и что делать, если вдруг счастье не случилось - в рваных обсуждениях под статьями. В книге про Postfix наоборот, все разжевано и перетерто до такой степени, что мысль теряется в деталях.
У Вас же все гармонично.
Благодаря именно Вашей статье весь этот венегрет выстроился в системные знания, и количество перешло в качество.

20

Делал по данной статье все, дошел до 9го пункта, вообщем, письма приходят, но они приходят для системного пользователя, в /var/mail/user, а не для виртуального, но папка для виртуального создана, но там пусто кроме dovecot файлов. Постфикс ошибки не выдает, только это

Jun  9 01:32:15 debian-srv postfix/smtpd[4733]: NOQUEUE: reject: RCPT from mail-iy0-f174.google.com[209.85.210.174]: 550 5.1.1 <ichy@upliti.ru>: Recipient address rejected: User unknown in virtual mailbox table; from=<crashmybrain@gmail.com> to=<ichy@upliti.ru> proto=ESMTP helo=<mail-iy0-f174.google.com>
Jun  9 01:32:16 debian-srv postfix/smtpd[4733]: disconnect from mail-iy0-f174.google.com[209.85.210.174]

/etc/postfix/main.cf

Проверил базу mysql - она пуская полностью, что делать в этом случае?

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = debian-srv.radiogameplay.ru
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = upliti.ru
mydestination = debian-srv.raradiogameplay.ru, debian-srv, localhost.radiogameplay.ru, , localhost
relayhost =
mynetworks = 127.0.0.0/8  192.168.0.0/24
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
#recipient_delimiter = +
#inet_interfaces=all

virtual_mailbox_domains = upliti.ru

virtual_mailbox_base = /var/mail/virtual/

#virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf

virtual_alias_maps = mysql:/etc/postfix/virtual_alias_maps.cf

virtual_uid_maps = hash:/etc/postfix/virtual_uid_maps

virtual_gid_maps = $virtual_uid_maps

Ну и соответственно, через squirrelmail я тоже не могу зайти. Что я не так сделал?

21

Разобрался,  появилась другая проблема, если я папку /var/mail/virtual chown делаю 1001:1001 то нормально получается почта, но не собирается, а если верну vmail, то почта не принимается, но зато в squirrelmail могу посмотреть то что получил, проверил конфиги, все в порядке и по мануалу, что с этим сделать?

22 (19.04.2012 07:23:28 отредактировано sagvir)

Спасибо за тему наглядно и внятно написано! Довелось настроить аналогичную связку, почта работает, из внешки письма уходят и отправка так же работает.

23

Ребят не подскажете как рассылку сделать,тоесть сообщение-оповещение нужно разослать, но чтобы в поле кому, был только 1 адресат, а не перечень кому делал рассылку,как спамеры вообщем делают. Пробовал в /etc/aliases прописывать чтото не дало результат.

24

Видимо я один тему просматриваю)
У меня связка работает с пол года, за это время спамеры обзавелись моим доменом и пытаються его тролить) spamassasin работает корректно создает новое письмо с полем ***SPAM*** но таких писем прилично. Вообще дело в том что spamassasin как видно не обучаеться base базы не заполняються token подскажите у кого нормально бейс база заполняеться и спамассасин обучается

sa-learn --mbox --spam 1340147195.M505192P25223.mailserver\,S\=41018\,W\=41796\:2\, 
Learned tokens from 0 message(s) (0 message(s) examined)
+ открыть спойлер

ll
итого 104
-rw-r--r-- 1 root  root   939 Мар 25  2010 65_debian.cf
-rwxrwxrwx 1 root  root 12288 Авг 23  2011 auto-whitelist
-rwxrwxrwx 1 root  root     0 Июн 23  2011 bayes
-rw-rw-rw- 1 root  root 17024 Авг 23  2011 bayes_journal
-rw-rw-rw- 1 root  root 12288 Авг 23  2011 bayes_seen
-rw-rw-rw- 1 root  root 12288 Авг 23  2011 bayes_toks
-rw-r--r-- 1 root  root  1299 Мар 25  2010 init.pre
-rw-r--r-- 1 root  root  6695 Июн 20 10:20 local.cf
-rw-r--r-- 1 root  root   692 Авг 23  2011 local.cf.new
-rw-r--r-- 1 root  root   772 Авг 30  2011 local.cf.old
-rw-r--r-- 1 root  root  2214 Апр 21  2011 local.cf.rezerv
-rw-r----- 1 spamd root   681 Авг 19  2011 mysql.cf
-rw-r--r-- 1 root  root   465 Авг 18  2011 razor-agent.conf
drwxr-xr-x 2 root  root  4096 Авг 23  2011 sa-update-hooks.d
-rw-r--r-- 1 root  root  2625 Авг 19  2011 v310.pre
-rw-r--r-- 1 root  root  1220 Авг 19  2011 v312.pre
-rw-r--r-- 1 root  root  2416 Мар 25  2010 v320.pre
-rw-r--r-- 1 root  root  1237 Мар 25  2010 v330.pre

25

Поставь грейлистинг.

26

Можно опубликовать конфигурационные файлы полностью, а не только изменения? У меня перестала получаться аутентификация пользователей на этапе вынесения их в текстовый файл. До этого (когда пользователи почты были пользователями системы) всё работало