FastNetMon

Wednesday 1 April 2009

Postfix перед Plesk

Ставим блокировку SMTP в Plesk
В панели Плеск: сервер - почта -- "POP3 время блокирования" ставим галочку и выставляем минут 30. Т.е. теперь посла забора почты по ПОП3 айпи адрес клиента будет становиться "доверенным" и с него можно будет отправлять почту.

Ставим особый магический Постфикс :)

В /etc/yum.repos.d/CentOS-Base.repo добавляем строку:

[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
baseurl=http://mirror.yandex.ru/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=1


Ищем особый постфикс в указанном репо:
sudo yum --disablerepo=base,updates,addonse,extrase,rpmforge,addons,extras search postfix

Ставим его: sudo yum --disablerepo=base,updates,addonse,extrase,rpmforge,addons,extras install postfix (среди мелькающих на фоне непонятных букавок должно появицца "2:2.3.3-2.1.centos.mysql_pgsql")

Даём полномочия доступа в БД Плеска юзеру Постфикса:

[root@plesk:~]# mysql -u admin -pmysql -uadmin -p`sudo cat /etc/psa/.psa.shadow`
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 43 to server version: 4.1.20

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> grant SELECT on psa.smtp_poplocks to postfix@localhost;
Query OK, 0 rows affected (0.02 sec)

mysql> grant SELECT on psa.misc to postfix@localhost;
Query OK, 0 rows affected (0.02 sec)

mysql> set password for postfix@localhost = password ('oog1Pheo');
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit;



Проверим доступ к указанным таблицам: mysql -upostfix -poog1Pheo -Dpsa -e 'select * from smtp_poplocks'

+------------+---------+-----------+
| ip_address | ip_mask | lock_time |
+------------+---------+-----------+
| 127.0.0.0 | 8 | NULL |
+------------+---------+-----------+



На этом этапе давайте создадим тестовый почтовый ящик на сервере и попробуем с него забрать почту (после чего айпи будет "заблокирован" и появится в указанной таблице). Я использовал Thunderbird.

После проверки почты через почтовик, таблица smtp_poplocks стала выглядеть примерно так:
+----------------+---------+---------------------+
| ip_address | ip_mask | lock_time |
+----------------+---------+---------------------+
| 127.0.0.0 | 8 | NULL |
| 94.180.x.x | 32 | 2009-04-01 07:28:56 |
| 94.180.x.x | 32 | 2009-04-01 07:28:58 |
+----------------+---------+---------------------+

Что говорит о правильности настроек Плеска, если у вас не так, то мучаем Плеск дальше.

Теперь создаём конфиг для авторизации по базе: /etc/postfix/mysql-psa-smtp_poplocks.cf

user = postfix
password = oog1Pheo
dbname = psa
query = SELECT CASE WHEN '%s' = (SELECT ip_address FROM smtp_poplocks WHERE ip_address='%s' AND(lock_time > DATE_SUB(NOW(), INTERVAL(SELECT val FROM misc WHERE param=’poplock_time’ LIMIT 1)MINUTE))LIMIT 1)THEN 'OK' END AS response;


После этого пробуем проверить какой-то айпи на возможность доступа: /usr/sbin/postmap -q 96.640.72.378 mysql:/etc/postfix/mysql-psa-smtp_poplocks.cf

Мне вот выдало "postmap: fatal: unsupported dictionary type: mysql", сейчас будем бороться. Проверим список доступных плагинов авторизации: /usr/sbin/postconf -m


/usr/sbin/postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
static
unix


Такая ошибка возможна, если вы накосячили и поставили стандартный Постфикс, а не из Центос+, возвращайтесь наверх =) Вот так вывод команды будет выглядеть при корректной установке:


/usr/sbin/postconf -m
btree
cidr
environ
hash
ldap
mysql
nis
pcre
pgsql
proxy
regexp
static
unix


Проверим почту на сервере и сразу проверим свой айпи:

/usr/sbin/postmap -q "94.180.189.254" mysql:/etc/postfix/mysql-psa-smtp_poplocks.cf
OK


А теперь проверим какой-нить мусор:


/usr/sbin/postmap -q "254.254.254.254" mysql:/etc/postfix/mysql-psa-smtp_poplocks.cf


Создадим файлик с отлупом в случае неверных авторизационных (айпи не залочен) данных:
/etc/postfix/regexp-authentication_required.cf

/./ 530 Authentication required


Конфигурируем главный конфиг Постфикса:

sudo /usr/sbin/postconf -e "smtpd_recipient_restrictions = check_client_access mysql:/etc/postfix/mysql-psa-smtp_poplocks.cf, check_client_access regexp:/etc/postfix/regexp-authentication_required.cf, reject"


Теперь осталось настроить Постфикс на релей писем в Кумыло (сначала поставим Постфикс на 325 порт для тестов). Настраиваем форвард всех писем на Кумыло (стоит локально):
sudo /usr/sbin/postconf -e "relayhost = 127.0.0.1:25"

Настроимся на 325 порт.
В файле: /etc/postfix/master.cf

ищем строку:
smtp inet n - n - - smtpd


и заменяем на:
325 inet n - n - - smtpd


Выберем интерфейсы, на которых будет работать Постфикс:
sudo /usr/sbin/postconf -e "inet_interfaces = xx.xx.xx.100, xx.xx.xx.200, 127.0.0.1"

Тут есть особая тонкость, нам нужно ДВА внешних IP адреса для осуществления затеи проброса почты qmail`у, почему именно два я объясню позже.

На и наконец пускаем Постфикс: sudo /etc/init.d/postfix start

Теперь делаем telnet localhost 325 и получаем примерно следующее:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 sometestserver.ru ESMTP Postfix


Включение логов Постфикса.
Для того, чтобы дальше настроить Постфикс, надо видеть его логи, для их включения идём в файл: /etc/syslog.conf и добавляем строку:

*.* /var/log/syslog.log

после этого все сообщения демона Syslog будут падать в этот файл и нам надо будет за ним следить вот так: tail -f /var/log/syslog.log | grep postfix -i

А теперь о том, нафика два айпи:
После попытки отправить почту через Постфикс видим сие чудо в логе: (delivery temporarily suspended: mail for 127.0.0.1 loops back to myself)
Т.е. Постфикс считает 127.0.0.1 своим родным айпи и не позволяет самому себе кинуть почту несмотря на то, что порты разные. Для этого нам надо убрать один айпи адрес в файле /etc/postfix/main.cf из списка

inet_interfaces = xx.xx.xx.100, xx.xx.xx.200, 127.0.0.1


Допустим, для клиентов Постфикса будет использоваться айпи: xx.xx.xx.200, поэтому .100 удаляем из списка и после этого Постфикс не будет считать его своим родным. В тоже время на .100 висит qmail.

Теперь в том же файле настраиваем:
relayhost = xx.xx.xx.100:25

и рестартим Постфикс =)

Продолжаем устранять зацикливания:
Теперь ошибка вот такая warning: host xx.xx.xx.100:25 greeted me with my own hostname "servername.ru", происходит она по причине, что имя сервера Постфикса совпадает с именем сревера, которое возвращает qmail. Чтобы это исправить, надо указать новое имя для Постфикс сервера выше директивы relayhost:
myhostname = newservernameforpostfix.ru

(оно НЕ должно совпадать с выдачей команды hostname)

Последний шаг -- немного мышковозения. Ошибка такая "said: 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1) (in reply to RCPT TO command)", она возникает по причине, что наш скрытый айпи "xx.xx.xx.100" не указан доверенным для qmail. Открываем Plesk -> Сервер -> Почта -> "Белый список" -> "Добавить сеть" -> xx.xx.xx.100

Пробуем отправить почту ещё раз, она должна заработать на ура! :)

Основано на статье: http://illc0mmunication.org/illc0mm/dustbin/centos-plesk-postfix-mysql-qmail-something-good/

2 comments :

  1. Из-за чего может возникать ошибка: Frequently "553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)" ?

    ReplyDelete
  2. Добрый вечер!

    Постфикс говорит, что не нашел запрошенный домен в списке тех6 которые он должен обслуживать. Если не изменяет память, то этот файл /etc/postfix/rcphosts или local-domains, точно не помню

    ReplyDelete

Note: only a member of this blog may post a comment.