Настройка почтового сервера Postfix в Debian Squeeze
Подготовка
Требования
- Хранение почты на сервере
- Фильтрация спама
- Проверка вложений на вирусы
- Возможность использовать дополнительные домены
- Средние нагрузки (250+ пользователей)
- Списки рассылок
- WEB клиент
Используемое ПО
- Postfix
- Courier
- Amavis
- Spamassassin
- Razor
- ClamAV
- Roundcube
- Mailman
- Mailgraph
- AwStats
- MySQL
- Saslauth
- phpMyAdmin
Причины отказа от индивидуального квотирования
- В большинстве случаев для не публичных почтовых серверов квоты не нужны
- Для работы с индивидуальными квотами на postfix необходимо накладывать патч, что не позволит в дальнейшем стандартное обновление
Причины отказа от Pyzor
- Более полутора лет назад выпущена последняя версия
- Практически нет документации
Причины отказа от DCC
- Отсутствие в стандартном репозитории, что не позволит в дальнейшем стандартное обновление
- Непонятки с лицензией
Причины отказа от грэй листов
- Теоретически возможно частичные потери входящей почты
Выбор оборудования
- Гостевая система KVM
- CPU: 2x ядра Intel(R) Xeon(R) CPU E5506 @2.13GHz
- RAM: 2Gb
- HDD: 15Gb для системы, 150gb для хранилища почты
- Lan: 1Glan
Предварительные работы
- Настройка сетевого интерфейса для работы со статический белым IP адресом (либо ваша собственная конфигурация NAT-а и др.)
- Запись в прямой и обратной зоне DNS имени системы
- Запись MX, PTR и SPF в DNS
- Отдельный диск для хранилища почты (второй жесткий диск в /mnt/vdb1)
Советы
- Перед редактированием какого либо конфигурационного файла создаем резервную копию оригинала (cp /path/filename /path/filename_orig)!
Установка Postfix, Courier, Saslauth, MySQL, phpMyAdmin
Для установки вышеперечисленного выполняем:
apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql postfix-pcre gamin
Будут заданы следующие вопросы:
- Пароль пользователя root для сервера баз данных mysql
- Создать ли каталоги для веб-администрирования? Выбираем "Да"
- Выберите тип настройки почтового сервера, который оптимально удовлетворяет ваши требования. Выбираем "Интернет-сайт".
- "Почтовое имя". Вводим имя почтового хоста с полным доменным именем. Предположим это будет
mail.вашдомен.ru
- Требуется сертификат SSL. Жмем Enter.
- Выберите веб-сервер, который будет автоматически настроен для запуска phpMyAdmin. Выбираем Apache.
- Настроить базу данных для phpmyadmin с помощью dbconfig-common? Вводим пароль root для mysql.
- Пароль для пользователя базы phpmyadmin. Вводим пароль (не обязательно совпадающий с паролем root-а сервера mysql).
Создание базы данных для Postfix/Courier
Для создания базы данных воспользуемся phpmyadmin:
http://mail.вашдомен.ru/phpmyadmin
- Создаем новую базу данных mail. В поле сравнение выбираем utf8_general_ci
- Добавляем нового пользователя с именем mail_admin и паролем (этого пользователя будут использовать Postfix и Courier для доступа к базе mail
- Добавляем права на SELECT, INSERT, UPDATE, DELETE для пользователя mail_admin на базу mail
- Перезагружаем привилегии
- Добавляем таблицы в базу
CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, description TEXT NOT NULL, PRIMARY KEY (source) );
CREATE TABLE users ( email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email));
CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain));
В таблице domains будут хранится имена доменов, для которых Postfix будет принимать почту. Для нас достаточно одной записи:
domain |
вашдомен.ru |
В таблице forwardings будут хранится алиасы.
source | destination | description |
director@вашдомен.ru | secretar@вашдомен.ru | Перенаправление почты директора на секретаря. Не все директора умеют пользоваться электронкой :) |
ivanov@вашдомен.ru | ivanov@вашдомен.ru
petrov@вашдомен.ru |
Письма Иванова дублируются Петрову. Иванов часто не выходит на работу, а на его адрес приходят срочные письма! |
В таблице users хранятся данные о пользователях почты - адрес электронной почты, пароль:
password | |
director@вашдомен.ru | No9.E4skNvGa. |
Тут нужно заметить, что пароль хранится в зашифрованном виде (функцией encript в mysql).
При необходимости, вы можете добавить другие поля в таблицу users - например номер телефона и кабинета в котором работает сотрудник (главное не забываем о 152-ФЗ).
Таблица transport содержит записи, указывающие Postfix, письма каких пользователей (доменов) обрабатывать самому, а каких пересылать (существует возможность пересылать письма определенных пользователей, или даже целый доменов на другой почтовый сервер).
domain | transport |
вашдомен.ru | : |
вашдомен.ru | smtp:[a.b.c.d] |
director@вашдомен.ru | smtp:[c.d.e.f] |
В первом примере почта будет доставляться локально (складываться в локальное хранилище).
Во втором примере, вся почта для домена "вашдомен.ru" будет пересылаться на сервер с ip адресом: [a.b.c.d]
И наконец третий пример указывает постфиксу пересылать почту пришедшую на адрес "director@вашдомен.ru" серверу с ip адресом [a.b.c.d].
Для более подробной информации смотрите
man transport
Помните, что порядок записей в транспортной таблице важен! Кроме этого знайте - данные из таблицы транспорта кэшируются и для применения изменений в базе данный необходима перезагрузка параметров Postfix-а командой:
/etc/init.d/postfix reload
В первом примере, все пришедшие письма Postfix будет пересылать другому почтовому серверу (определенному по MX записи для домена "другойдомен.ru") письма адресованные director@вашдомен.ru будут пересланы на другой домен.
Второй пример аналогичен первому за исключением того, что письма будут пересылаться на другой почтовый сервер с IP адресом "a.b.c.d" (нужно заметить, что в случае пересылки на заданный IP, сам IP указывается в квадратных скобках).
И наконец для третьего примера, письма пришедшие на конкретный адрес "director@вашдомен.ru" буду пересланы на сервер с IP "c.d.e.f".
Конфигурирование Postfix
Добавим пользователя Postfix в группу sasl:
adduser postfix sasl
Проверим, что сервер mysql ожидает соединений по адресу 127.0.0.1. В файле /etc/mysql/my.cnf переменная bind-address должна иметь значение 127.0.0.1:
bind-address = 127.0.0.1
В случае если это не так, внесем необходимые изменения и рестартуем сервер mysql:
/etc/init.d/mysql restart
Для проверки того, что мы сделали все верно запустим команду:
netstat -tap
Среди прочего, в выводе команды, мы должны увидеть:
tcp 0 0 localhost:mysql *:* LISTEN 4556/mysqld
где 4556 это PID процесса и у всех будет разный. Если такая строка присутствует в выводе команды значит mysql работает правильно.
Настройка извлечения данных из mysql
Создадим папку для дополнительных конфигурационных файлов:
mkdir /etc/postfix/config
Теперь нам необходимо указать Postfix, как извлекать информацию из созданной нами базы. Для этого мы создадим пять текстовых файлов.
mcedit /etc/postfix/config/mysql-virtual_domains.cf
user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1
mcedit /etc/postfix/config/mysql-virtual_forwardings.cf
user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1
mcedit /etc/postfix/config/mysql-virtual_mailboxes.cf
user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1
mcedit /etc/postfix/config/mysql-virtual_email2email.cf
user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1
mcedit /etc/postfix/config/mysql-virtual_transports.cf
user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1
где mail_admin это имя пользователя созданного нами ранее, mail_admin_password его пароль.
Теперь создадим пользователя и группу для работы с хранилищем почты. Домашний каталог пользователя и будет корнем хранилища. Я буду использовать для хранилища почты отдельный раздел на отдельном диске (смонтированный в каталог /mnt/vdb1/vmail). Вы же указываете свой путь для хранилища почты.
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /mnt/vdb1/vmail -m
Общее
Дальше займемся конфигурированием Postfix. Редактируем файл /etc/postfix/main.cf:
#Время, в течении которого письма будут находится в очереди maximal_queue_lifetime = 10d #Ограничение на размер письма в байтах message_size_limit = 10000000 #Дополнительные файлы конфигурации additional_config_dir = /etc/postfix/config alias_maps = hash:/etc/aliases #Соответствует полному доменному имени (FQDN) myhostname = mail.вашдомен.ru #Список доменов, для которых почта будет доставляться локально, а не пересылаться на другой хост. mydestination = $myhostname, localhost, localhost.$mydomain, $myhostname.$mydomain #Локальные сети mynetworks = 127.0.0.0/8 10.0.0.0/8 #Карта алиасов virtual_alias_maps = proxy:mysql:$additional_config_dir/mysql-virtual_forwardings.cf, mysql:$additional_config_dir/mysql-virtual_email2email.cf #Карта расположения почтовых ящиков virtual_mailbox_maps = proxy:mysql:$additional_config_dir/mysql-virtual_mailboxes.cf #Содержит имена обслуживаемых доменов virtual_mailbox_domains = proxy:mysql:$additional_config_dir/mysql-virtual_domains.cf #Нужен чтобы по MAIL FROM узнать логин и затем сверить с логином, по которому прошла аутентификация. smtpd_sender_login_maps = mysql:$additional_config_dir/mysql-virtual_email2email.cf #Путь до каталога хранилища почты virtual_mailbox_base = /mnt/vdb1/vmail #Карта UID-ов виртуальных пользователей virtual_uid_maps = static:5000 #Тоже самое для групп: virtual_gid_maps = static:5000 #Поддержку sasl авторизации smtpd_sasl_auth_enable = yes #Поддержки старых версий почтовых клиентов, например Microsoft Outlook Express 4 и Microsoft Exchange 5, использующих другую форму команды AUTH broken_sasl_auth_clients = yes #Требуем, чтобы удаленный SMTP клиент представлял себя в начале SMTP сессии с помощью команды HELO или EHLO. smtpd_helo_required = yes #Всегда отправлять EHLO вначале SMTP сессии smtp_always_send_ehlo = yes #Отключает SMTP команду VRFY. В результате чего, невозможно определить существование определенного #ящика. Данная техника (применение команды VRFY) используется спамерами для сбора имен почтовых ящиков. disable_vrfy_command = yes #Сообщать ли клиентам о возможности использования TLS (шифрования соединения) smtpd_use_tls = yes #Расположение файла сертификата сервера smtpd_tls_cert_file = /etc/ssl/certs/mail.вашдомен.ru.crt #Расположение файла открытого ключа smtpd_tls_key_file = /etc/ssl/private/mail.вашдомен.ru.key #Карта транспорта transport_maps = proxy:mysql:$additional_config_dir/mysql-virtual_transports.cf #Список таблиц, которым разрешено работать через proxymap (кэширует запросы и снижает нагрузку на БД) proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
Параметр proxy_read_maps описывается в одну строку. Переносы добавлены для лучшего отображения в MediaWiki.
Ограничения
#Создаем классы: smtpd_restriction_classes = verify_sender, rbl_cbl_abuseat_org, rbl_sbl_spamhaus_org, rbl_dul_ru, rbl_spamcop, white_client_ip, black_client_ip, block_dsl, helo_access, white_client, mx_access #Описание классов: verify_sender = reject_unverified_sender, permit rbl_cbl_abuseat_org = reject_rbl_client cbl.abuseat.org rbl_dul_ru = reject_rbl_client dul.ru rbl_sbl_spamhaus_org = reject_rbl_client sbl.spamhaus.org rbl_spamcop = reject_rbl_client bl.spamcop.net #IP адреса, которые нужно пропускать не смотря ни на что white_client_ip = check_client_access hash:$additional_config_dir/white_client_ip #IP адреса, которые нужно блокировать не смотря ни на что black_client_ip = check_client_access hash:$additional_config_dir/black_client_ip #Правила для блокировки dsl/модемных пулов, с которых подключаются клиенты. block_dsl = regexp:$additional_config_dir/block_dsl #Соблюдение документа RFC 2821 helo_access = check_helo_access pcre:$additional_config_dir/helo_checks white_client = check_sender_access pcre:$additional_config_dir/access_vip_sender mx_access = check_sender_mx_access cidr:$additional_config_dir/mx_access #Далее restrictions: #Проверки клиентского компьютера (или другого почтового сервера), #который соединяется с сервером postfix для отправки письма smtpd_client_restrictions = black_client_ip, #Принимать письма от клиентов локальной сети permit_mynetworks, #Пропускать письма от авторизованный пользователей permit_sasl_authenticated, #Если клиент не из mynetworks оценивает reject_unauth_destination. Отклоняется попытки пересылки, если получатель #сообщения не относится к доменам места назначения и доменам пересылки, указанным в ваших настройках reject_unauth_destination, white_client_ip, #Отвергает запрос, когда клиент отправляет команды SMTP раньше времени, еще не зная о том, #действительно ли Postfix поддерживает конвейерную обработку команд ESMTP reject_unauth_pipelining, helo_access, block_dsl, #блокируем клиентов с адресами from, домены которых не имеют A/MX записей reject_unknown_address, #блокирует почту от несуществующих доменов reject_unknown_recipient_domain, #Проверяем домен на записи типа A и MX в DNS — если нет, то отклоняем reject_unknown_sender_domain, rbl_dul_ru, rbl_sbl_spamhaus_org, rbl_spamcop, rbl_cbl_abuseat_org #Проверки исходящей или пересылаемой через нас почты smtpd_sender_restrictions = white_client, white_client_ip, black_client_ip, #если пользователь авторизуется как user1@domain.com и попытается передать письмо в #котором в качестве обратного адреса указан user2@domain.com, то в ответ получит ошибку reject_authenticated_sender_login_mismatch, #Отклоняет сообщения в не существующие домены reject_unknown_recipient_domain, #Проверяем домен на записи типа A и MX в DNS — если нет, то отклоняем reject_unknown_sender_domain, #Если имя получателя не соответствует FQDN то отклоняем reject_non_fqdn_recipient, #Если имя отправителя не соответствует FQDN - отклоняем reject_non_fqdn_sender, permit_sasl_authenticated, permit_mynetworks, #Содержит список приватных сетей, которые по всем канонам глобальной сети интернет #не могут быть использованы в качестве IP для MX записей mx_access, #Отклонение писем с несуществующим адресом отправителя reject_unlisted_sender, #Если клиент не из mynetworks оценивает reject_unauth_destination. Отклоняется попытки пересылки, если получатель reject_unauth_destination #Правила приема почты нашим сервером: smtpd_recipient_restrictions = white_client, #блокирует почту от несуществующих доменов reject_unknown_recipient_domain, #Проверяем домен на записи типа A и MX в DNS — если нет, то отклоняем reject_unknown_sender_domain, #Если имя получателя не соответствует FQDN — отклоняем reject_non_fqdn_recipient, #Если имя отправителя не соответствует FQDN - отклоняем reject_non_fqdn_sender, #Отвергает запрос, когда клиент отправляет команды SMTP раньше времени, еще не зная о том, #действительно ли Postfix поддерживает конвейерную обработку команд ESMTP reject_unauth_pipelining, #Пропускать письма от авторизованный пользователей permit_sasl_authenticated, #Принимать письма от клиентов локальной сети permit_mynetworks, helo_access, #Отклонить, если адреса RCPT TO нет в допустимых получателей reject_unlisted_recipient, #блокируем клиентов с адресами from, домены которых не имеют A/MX записей reject_unknown_address, #Если клиент не из mynetworks оценивает reject_unauth_destination. Отклоняется попытки пересылки, если получатель #сообщения не относится к доменам места назначения и доменам пересылки, указанным в ваших настройках reject_unauth_destination, #Для отказа в приеме сообщениям с пустым именем отправителя конверта, предназначенным нескольким получателям reject_multi_recipient_bounce smtpd_data_restrictions = reject_unauth_pipelining, reject_multi_recipient_bounce, permit #Пропустить серверы, которые приветствуют нас кодом состояния 5xx smtp_skip_5xx_greeting = no #Отклонение писем с несуществующим адресом отправителя smtpd_reject_unlisted_sender = yes #Отклонение писем с несуществующим адресом получателя smtpd_reject_unlisted_recipient = yes
Создадим файлы с правилами, используемые в конфиге:
touch /etc/postfix/config/white_client_ip touch /etc/postfix/config/black_client_ip touch /etc/postfix/config/white_client touch /etc/postfix/config/access_vip_sender
mcedit /etc/postfix/config/helo_checks
С таким содержимым:
/^\[?10\.\d{1,3}\.\d{1,3}\.\d{1,3}\]?$/ REJECT Address in RFC 1918 private network /^\[?192\.\d{1,3}\.\d{1,3}\.\d{1,3}\]?$/ REJECT Address in RFC 1918 private network /^\[?172\.\d{1,3}\.\d{1,3}\.\d{1,3}\]?$/ REJECT Address in RFC 1918 private network /\d{2,}[-\.]+\d{2,}/ REJECT Invalid hostname (D-D) /^(((newm|em|gm|m)ail|yandex|rambler|hotbox|chat|rbc|subscribe|spbnit)\.ru)$/ REJECT Faked hostname ($1) /^(((hotmail|mcim|newm|em)ail|post|hotbox|msn|microsoft|aol|news|compuserve|yahoo|google|earthlink|netscape)\.(com|net))$/ REJECT Faked hostname ($1) /[^[] *[0-9]+((\.|-|_)[0-9]+){3}/ REJECT Invalid hostname (ipable) /(modem|dia(l|lup)|cp[ce]|dsl|p[cp]p|cable|catv|poo(l|les)|pppoe|dhcp|client|customer|user|host|[0-9]{4,})(-|_|\.|[0-9])/ REJECT Invalid hostname (client)
mcedit /etc/postfix/config/mx_access
С таким содержимым:
127.0.0.1 DUNNO 127.0.0.2 550 Domains not registered properly. Can't assign requested address 0.0.0.0/8 REJECT Domain MX in broadcast network 10.0.0.0/8 REJECT Domain MX in RFC 1918 private network 127.0.0.0/8 REJECT Domain MX in loopback network 169.254.0.0/16 REJECT Domain MX in link local network 172.16.0.0/12 REJECT Domain MX in RFC 1918 private network 192.0.2.0/24 REJECT Domain MX in TEST-NET network 192.168.0.0/16 REJECT Domain MX in RFC 1918 private network 224.0.0.0/4 REJECT Domain MX in class D multicast network 240.0.0.0/5 REJECT Domain MX in class E reserved network 248.0.0.0/5 REJECT Domain MX in reserved network
mcedit /etc/postfix/config/block_dsl
С таким содержимым:
/^dsl.*\..*/i 553 AUTO_DSL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /.*\.dsl\..*/i 553 AUTO_DSL2 We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /[a|x]dsl.*\..*\..*/i 553 AUTO_[A|X]DSL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /client.*\..*\..*/i 553 AUTO_CLIENT We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /cable.*\..*\..*/i 553 AUTO_CABLE We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /pool\..*/i 553 AUTO_POOL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /.*dial(\.|-).*\..*\..*/i 553 AUTO_DIAL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /ppp.*\..*/i 553 AUTO_PPP We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /dslam.*\..*\..*/i 553 AUTO_DSLAM We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /dslb.*\..*\..*/i 553 AUTO_DSLB We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /node.*\..*\..*/i 553 AUTO_NODE We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /.*\.dynamicIP\..*/i 553 AUTO_DYNAMIC We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server. /[ax]dsl.*\..*\..*/i REJECT Your message looks like SPAM 01 /\.dsl.*\..*\..*/i REJECT Your message looks like SPAM 02 /cable.*\..*\..*/i REJECT Your message looks like SPAM 03 /client.*\..*\..*/i REJECT Your message looks like SPAM 04 /dhcp.*\..*\..*/i REJECT Your message looks like SPAM 05 /dial.*\..*\..*/i REJECT Your message looks like SPAM 06 /dialup.*\..*\..*/i REJECT Your message looks like SPAM 07 /dslam.*\..*\..*/i REJECT Your message looks like SPAM 08 /node.*\..*\..*/i REJECT Your message looks like SPAM 09 /pool.*\..*\..*/i REJECT Your message looks like SPAM 10 /ppp.*\..*\..*/i REJECT Your message looks like SPAM 11 /user.*\..*\..*/i REJECT Your message looks like SPAM 12 /[0-9]+-[0-9]+/ REJECT Invalid hostname (D-D) (dsl) /(modem|dia(l|lup)|cp[ce]|dsl|p[cp]p|cable|catv|poo(l|les)|pppoe|dhcp|client|customer|user|host|[0-9]{4,})(-|_|\.|[0-9])/ REJECT Invalid hostname (client)
mcedit /etc/postfix/config/white_client_ip
С таким содержимым:
dwhite.ltd OK 10.11.12.13 OK
Где dwhite.ltd 10.11.12.13 имя домена и ip адреса сервер, которые заблокированы в каком либо блэк листе (например rbl)
Выставим права доступа:
chown root:postfix /etc/postfix/config/ -R chmod 650 /etc/postfix/config/ -R
После каждого изменения конфигурационных файлов имеющих тип hash, необходимо выполнить:
postmap /etc/postfix/config/имя_конфигурационного_файла
В нашем случае таким файлом например является white_client_ip. Тип файла указывается в main.cf. Например: white_client_ip = check_client_access hash:$additional_config_dir/white_client_ip
Создание сертификата
Создадим приватный ключ:
openssl genrsa -des3 -out mail.вашдомен.ru.key 2048
На запрос два раза вводим пароль (и обязательно запомним)!
Теперь создадим подписанный сертификат:
openssl req -new -key mail.вашдомен.ru.key -out mail.вашдомен.ru.csr
На запрос вводим:
Country Name: RU Страна, в виде двухсимвольного ISO-кода. State or Province Name (full name) [Some-State]: Altai Область, в которой официально зарегистрирована организация (на английском языке) Locality Name (eg, city) []: Pavlovsk Город, где официально зарегистрирована организация (на английском языке) Organization Name (eg, company) [Internet Widgits Pty Ltd]: Точное наименование организации в соответствии с Уставом организации на английском языке GlavRazvedUprav (Не используйте сокращенное наименование организации) Organizational Unit Name (eg, section) []: IT Наименование отдела, подразделения (на английском языке) Common Name (eg, YOUR name) []: mail.вашдомен.ru Полное доменное имя для вашего веб-сервера. Email Address []: postmaster.вашдомен.ru postmaster@вашдомен.ru Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Просмотреть данные сертификата можем с помощью команды:
openssl req -noout -text -in mail.вашдомен.ru.csr
Удалим пароль из ключа:
cp mail.вашдомен.ru.key mail.вашдомен.ru.key_orig openssl rsa -in mail.вашдомен.ru.key_orig -out mail.вашдомен.ru.key Enter pass phrase for debianworld.ru.key_orig: (Вводим пароль указанный при создании mail.вашдомен.ru.key) writing RSA key
Генерируем SSL сертификат:
openssl x509 -req -days 3650 -in mail.вашдомен.ru.csr -signkey mail.вашдомен.ru.key -out mail.вашдомен.ru.crt Signature ok subject=/C=RU/ST=Russia/O=mail.вашдомен.ru/CN=mail.вашдомен.ru/emailAddress=ssl@вашдомен.ru Getting Private key
Переместим сертификат и ключ в положенное место:
mv mail.вашдомен.ru.crt /etc/ssl/certs/ mv mail.вашдомен.ru.key /etc/ssl/private/
И заметем следы :) :
rm mail.вашдомен.ru.csr mail.вашдомен.ru.key_orig
Укажем web серверу использовать новый сертификат:
mcedit /etc/apache2/sites-available/default-ssl
SSLCertificateFile /etc/ssl/certs/mail.вашдомен.ru.crt SSLCertificateKeyFile /etc/ssl/private/mail.вашдомен.ru.key
Конфигурирование Saslauthd
Создаем каталог:
mkdir -p /var/spool/postfix/var/run/saslauthd
Редактируем файл конфигурации:
mcedit /etc/default/saslauthd
#Включаем автозапуск START=yes #Изменим значение PARAMS OPTIONS="-m /var/spool/postfix/var/run/saslauthd -r" #Добавим новый параметр PIDFILE PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"
Создадим файл /etc/pam.d/smtp
mcedit /etc/pam.d/smtp
со следующим содержимым:
auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
Где mail_admin и mail_admin_password это имя и пароль созданного выше пользователя базы данных.
Далее создадим файл /etc/postfix/sasl/smtpd.conf:
mcedit /etc/postfix/sasl/smtpd.conf
Со следующим содержимым:
pwcheck_method: saslauthd mech_list: plain login allow_plaintext: true auxprop_plugin: mysql sql_hostnames: 127.0.0.1 sql_user: mail_admin sql_passwd: mail_admin_password sql_database: mail sql_select: select password from users where email = '%u'
На забываем про mail_admin и mail_admin_password.
После проделанных операций, для применения новых параметров, необходимо перезагрузить Postfix и Saslauth:
/etc/init.d/postfix restart /etc/init.d/saslauthd restart
Конфигурирование Courier
Необходимо указать Courier-у, где у нас хранятся авторизационные данные пользователей. Для этого в конфигурационном файле /etc/courier/authdaemonrc изменим значение authmodulelist на "authmysql":
mcedit /etc/courier/authdaemonrc
authmodulelist="authmysql"
Редактируем файл /etc/courier/authmysqlrc
mcedit /etc/courier/authmysqlrc
После редактирования он должен иметь следующее содержимое:
MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/mnt/vdb1/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
Не забыв подставить свои авторизационные данные к базе и путь к хранилищу почты.
Мне предпочтительнее, чтобы пользователи хранили свою почту на сервере (использовали IMAP). Основной причиной этого является отсутствие возможности потери почтовых сообщений из за выхода их строя жесткого диска на клиентской машине. Плюс к этому IMAP позволяет работать с почтой через web интерфейс. По этим причинам отключим протокол POP3. В файле /etc/courier/pop3d поправим:
... POP3DSTART=NO ...
В файле /etc/courier/pop3d-ssl:
... POP3DSSLSTART=NO ...
К тому же отключим не шифрованное соединение по протоколу IMAP. Файле /etc/courier/imapd:
... IMAPDSTART=NO ...
Увеличим количество одновременных подключений для IMAP (максимальное количество запускаемых копий демона), и укажем сертификат:
mcedit /etc/courier/imapd-ssl
... MAXDAEMONS=300 TLS_CERTFILE=/etc/courier/mail.вашдомен.ru.crt ...
Создадим для Courier сертификат в том формате, в котором он требует:
cp /etc/ssl/certs/mail.вашдомен.ru.crt /etc/courier/ cat /etc/ssl/private/mail.вашдомен.ru.key >> /etc/courier/mail.вашдомен.ru.crt
Перезагружаем все сервисы Courier-а:
/etc/init.d/courier-authdaemon restart /etc/init.d/courier-imap restart /etc/init.d/courier-imap-ssl restart /etc/init.d/courier-pop restart /etc/init.d/courier-pop-ssl restart
Для проверки работоспособности Courier-а подключимся к порту IMAP-SSL (993 порт) с помощью телнета:
telnet localhost 993
Если в ответ вы увидели нечто, похожее на это:
Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'.
значит Courier работает. Для выхода из telnet достаточно шесть раз нажать ENTER :)
Изменение /etc/aliases
В файле /etc/aliases мы определим администратора почты.
mcedit /etc/aliases
root: postmaster postmaster: postmaster@вашдомен.ru
Теперь почта адресованная пользователю root будет перенаправлена postmaster-у. А почта postmaster-а в свою очередь будет переправлена на postmaster@вашдомен.ru
Для применения изменений необходимо выполнить команду:
newaliases
И перезагрузить Postfix:
/etc/init.d/postfix restart
Установка amavisd-new, SpamAssassin, и ClamAV
Для установки amavisd-new, spamassassin и clamav необходжимо установить следующие пакеты:
apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax
Для правильной работы Amavasd-new необходимо отредактировать три файла.
Включим ClamAV и SpamAssassin. Для этого разкоментируем строки с @bypass_virus_checks_maps и @bypass_spam_checks_maps:
mcedit /etc/amavis/conf.d/15-content_filter_mode
После редактирования файл должен выглядеть так:
use strict; # You can modify this file to re-enable SPAM checking through spamassassin # and to re-enable antivirus checking. # # Default antivirus checking mode # Uncomment the two lines below to enable it back # @bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); # # Default SPAM checking mode # Uncomment the two lines below to enable it back # @bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); 1; # insure a defined return
Дальше необходимо взглянуть на настройки определения спама и действий выполняемых со спамом в файле /etc/amavis/conf.d/20-debian_defaults. Сам файл мы не редактируем, а все необходимые параметры добавляем в файл /etc/amavis/conf.d/50-user:
mcedit /etc/amavis/conf.d/50-user
use strict; $pax='pax'; #Считываем таблицу обслуживаемых доменов. Письма адресованные пользователям этих доменов будут проверяться на спам @lookup_sql_dsn = ( ['DBI:mysql:database=mail;host=127.0.0.1;port =3306', 'mail_admin', 'password']); $sql_select_policy = 'SELECT domain FROM domains'; #Что дописываем в тему спам сообщения $sa_spam_subject_tag = '***СПАМ***'; $sa_spam_modifies_subj = 1; #Дописывать данные о проверке на спам в заголовок письма всегда $sa_tag_level_deflt = undef; #Пропускаем спам письма адресату. $final_spam_destiny = D_PASS; #Пропускаем письма содержащие вирус адресату. $final_virus_destiny = D_PASS; $final_banned_destiny = D_PASS; #Добавляем в тему письма содержащего вирус $subject_tag_maps_by_ccat{+CC_VIRUS} = [ '***ВИРУС*** ' ]; #Таким образом отключим оповещения о вирусах и спаме $virus_admin = undef; $spam_admin = undef; 1;
Теперь добавим пользователя clamav в группу amavis и перезагрузим amavis и clamav:
addgroup clamav amavis /etc/init.d/amavis restart /etc/init.d/clamav-daemon restart /etc/init.d/clamav-freshclam restart
Теперь мы должны реконфигурировать Postfix так, чтобы он пропускал всю входящую почту через amavisd-new. Для этого добавим в конфигурационный файл main.cf строки:
content_filter = amavis:[127.0.0.1]:10024 receive_override_options = no_address_mappings
И в конец файла /etc/postfix/master.cf следующие строки:
amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes 127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtpd_bind_address=127.0.0.1
После чего рестартуем Postfix:
/etc/init.d/postfix restart
Для проверки работоспособности всего того, что мы настроили запустим следующую команду:
netstat -tap
Среди прочего мы должны увидеть строки подобные этим:
tcp 0 0 localhost.localdo:10024 *:* LISTEN 16043/amavisd tcp 0 0 localhost.localdo:10025 *:* LISTEN 15794/master tcp 0 0 *:smtp *:* LISTEN 15794/master
Первая строка говорит нам о том, что порт 10024 слушает amavisd, а порты 10025 и 25 (smtp) слушает postfix.
Установка и конфигурирование SpamAssassin
Редактируем файл конфигурации SpamAssassin:
mcedit /etc/spamassassin/local.cf
После редактирования файл должен выглядеть примерно так:
# Указываем какие подсети будут "доверенными", письма с которых не будут считаться спамом trusted_networks 10.0.0.0/8 # Включаем bayes обучение системы use_bayes 1 use_bayes_rules 1 # Указываем путь до базы bayes bayes_path /var/lib/amavis/.spamassassin/bayes # SA будет автоматически добавлять сообщения, распознанные как SPAM #на 100% или на 100% как не SPAM сообщения, в bayes базу данных bayes_auto_learn 1 # Не отключаем разные сетевые проверки skip_rbl_checks 0 # Указываем SA использовать Razor use_razor2 1 # Указываем SA не использовать DCC use_dcc 0 # Указываем SA не использовать Pyzor use_pyzor 0 #Следующие строчки указывают, на каких языках Вам обычно приходят письма. Если #проверяемое письмо будет на другом языке, то его Spam-Level повысится. ok_languages en ru ok_locales en ru
Перезагрузим amavis для применения параметров:
/etc/init.d/amavis restart
Установка и конфигурирование Razor
Устанавливаем пакет:
apt-get install razor
Создаем конфигурацию по умолчанию:
razor-admin -create
(конфигурационные файлы будут созданы в ~/.razor) Регистрируемся на сервера razor:
razor-admin -register -user=user -pass=pass
Тестирование Postfix
Чтобы проверить работоспособность Postfix-а коннектимся на 25 порт телнетом:
telnet localhost 25
После установки соединения, передадим Postfix-у команду:
ehlo localhost
Вы должны увидеть ответ такого содержания:
250-server1.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Обратите внимание на эти строки:
250-STARTTLS 250-AUTH PLAIN LOGIN
Если они есть то все отлично.
Чтобы выйти наберите quit.
Наполнение базы и тестирование
Будем добавлять данные в базу. Для этого как и прежде воспользуемся phpmyadmin.
В таблицу domains добавим запись:
domains |
вашдомен.ru |
В таблицу users добавим пользователей:
password | |
secretar@вашдомен.ru | secr |
director@вашдомен.ru | direct |
Для поля password, в phpmyadmin указываем функцию encript. Это позволить хранить хэши паролей, а ни сами пароли в открытом виде.
В таблицу forwards добавим один алиас:
source | distanation | description |
director@вашдомен.ru | secretar@вашдомен.ru | Почту директора пересылаем секретарю |
Данная запись укажет Postfix-у на то, что письма пришедшие на director@вашдомен.ru нужно переслать на адрес secretar@вашдомен.ru. В данном примере директор не получит ни единого письма, так как вся его почта будет пересылаться секретарю. Если же мы хотим, чтобы директор получал свою почту, а секретарь получал копию писем пришедших на директорский адрес, вместо указанной выше записи, следует использовать такую:
source | distanation | description |
director@вашдомен.ru | director@вашдомен.ru
secretar@вашдомен.ru |
Шлем секретарю копии директорских писем |
В таблицу transport добавим:
domain | transport |
вашдомен.ru | : |
Эта запись укажет Postfix-у на то, что почтовые адреса с доменом "вашдомен.ru" он будет обрабатывать сам, а не пересылать куда либо. Изменения в данную таблицу нам понадобится вносить в том случае, если мы захотим чтобы наш сервер обслуживал более одного домена.
Перегрузим Postfix для применения новых параметров:
/etc/init.d/postfix reload
Отправка первого сообщения для создания структуры каталогов maildir
После того как вы создали нового пользователя в базе данных, необходимо отправить письмо на адрес этого пользователя, чтобы в хранилище почты создалась необходимая структура каталогов для этого пользователя. В противном случае, при попытке соединиться с IMAP сервером вы получите ошибку.
Установим пакет mailutils
apt-get install mailutils
Для отправки сообщения добавленному пользователю secretar@вашдомен.ru выполним команду:
mailx secretar@вашдомен.ru
Жмем enter, вводим тему письма, жмем enter, пишем текст письма, жмем enter, CTRL-D и еще раз enter.
#mailx secretar@вашдомен.ru Cc: <-- ENTER Subject: Welcome <-- ENTER Welcome! Have fun with your new mail account. <-- ENTER <-- CTRL+D #
Логирование
mcedit /etc/logrotate.d/rsyslog
Удаляем строки:
/var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log
Создаем:
mcedit /etc/logrotate.d/mail
Такого содержания:
/var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log { rotate 24 weekly missingok notifempty compress delaycompress sharedscripts postrotate invoke-rc.d rsyslog reload > /dev/null endscript }
Ротироваться лог файлы почты будут каждый день, хранится в течении 24 месяцев. Вы можете выбрать и другие значения, но знайте, что при достаточно высокой нагрузке, лог файлы будут очень быстро расти и за месяц по объему могут перевалить за сотни мегабайт.
Теперь отключим запись логов в /etc/var/log/syslog:
mcedit /etc/rsyslog.conf
Добавляем запись "mail.none" в строку "*.*;auth,authpriv.none -/var/log/syslog"
*.*;mail.none,auth,authpriv.none -/var/log/syslog
Установка RoundCube
Установка
apt-get install roundcube roundcube-mysql
На вопрос "Прежде чем использовать пакет roundcube, нужно установить и настроить его базу данных" отвечаем утвердительно.
Использовать будем базу данных mysql.
Вводим пароль root для mysql.
Два раза вводим пароль для создаваемого автоматически пользователя roundcube.
Настроим работу RoundCube через https.
mv /etc/apache2/conf.d/roundcube /etc/apache2/sites-available/ a2ensite roundcube a2enmod ssl
Файл /etc/apache2/sites-available/roundcube приведем к следующему виду
mcedit /etc/apache2/sites-available/roundcube
<VirtualHost _default_:443> ServerName mail.вашдомен.ru DocumentRoot /var/www Alias /roundcube/program/js/tiny_mce/ /usr/share/tinymce/www/ Alias /roundcube /var/lib/roundcube <Directory "/usr/share/tinymce/www/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny allow from all </Directory> <Directory /var/lib/roundcube/> Options +FollowSymLinks AllowOverride All order allow,deny allow from all </Directory> <Directory /var/lib/roundcube/config> Options -FollowSymLinks AllowOverride None </Directory> <Directory /var/lib/roundcube/temp> Options -FollowSymLinks AllowOverride None Order allow,deny Deny from all </Directory> <Directory /var/lib/roundcube/logs> Options -FollowSymLinks AllowOverride None Order allow,deny Deny from all </Directory> SSLEngine on SSLCertificateFile /etc/ssl/certs/mail.вашдомен.ru.crt SSLCertificateKeyFile /etc/ssl/private/mail.вашдомен.ru.key Alias /awstatsicons /usr/share/awstats/icon ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> </VirtualHost>
Настроим перенаправление с адреса http://mail.вашдомен.ru:
mcedit /etc/apache2/sites-enabled/000-default
И добавим в начало файла следующие строки:
<VirtualHost *:80> ServerAdmin administrator@вашдомен.ru ServerName mail.вашдомен.ru DocumentRoot /var/www RewriteEngine on RewriteRule ^(.*)$ https://mail.вашдомен.ru/roundcube RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 2 </VirtualHost>
Включим модуль rewrite:
a2enmod rewrite
Конфигурирование
В файле /etc/roundcube/main.inc.php содержится значительное количество параметров. Поправим некоторые из них:
//Принудительное использование https. Не гоже чтобы пароли к почте гуляли в открытом виде: $rcmail_config['force_https'] = TRUE; //IMAP сервер. Тут шифрацию включать не будем, потому как и IMAP сервер и RoundCube находятся на одной машине: $rcmail_config['default_host'] = 'ssl://mail.вашдомен.ru'; //Почтовый домен. Пропишем его, если не собираемся использовать несколько виртуальных доменов. Это упростит ввод авторизационных данных при регистрации: $rcmail_config['username_domain'] = 'вашдомен.ru'; $rcmail_config['mail_domain'] = 'mail.вашдомен.ru'; //Наш smtp сервер: $rcmail_config['smtp_server'] = 'localhost'; //Преверять все папки на предмет новых сообщений $rcmail_config['check_all_folders'] = FALSE; //Не отображать удаленные письма $rcmail_config['skip_deleted'] = TRUE; //При первом логине пользователя создаются стандартные почтовые папки (Входящие, Исходящие, Корзина и тд.) $rcmail_config['create_default_folders'] = TRUE;
И еще поправим некоторые параметры в файле /usr/share/roundcube/.htaccess:
#Объем вложений: php_value upload_max_filesize 10M #В конфиге по умолчанию, этот параметр указан на 20% больше чем выше. Мы поступим так же: php_value post_max_size 12M #Выделяемый объем оперативной памяти. Немного увеличим: php_value memory_limit 128M
Рестартуем apache:
/etc/init.d/apache2 restart
Теперь web интерфейс к нашей почте доступ по адресу:
http://mail.вашдомен.ru
Статистика
Установка AwStats
apt-get install awstats
Конфигурируем awstats:
mcedit /etc/awstats/awstats.postfix.conf
LogFile = "perl /usr/share/doc/awstats/examples/maillogconvert.pl standard < /var/log/mail.log |" LogType = M LogFormat = "%time2 %email %email_r %host %host_r %method %url %code %bytesd" SiteDomain = "mail.вашдомен.ru" HostAliases = "127.0.0.1 localhost REGEX[mail.вашдомен\.ru$]" DirData = "/mnt/vdb1/awstats" DirCgi = "/awstats" DirIcons = "/awstatsicons" AllowFullYearView = 3 AllowToUpdateStatsFromBrowser = 0 LevelForBrowsersDetection = 0 LevelForOSDetection = 0 LevelForRefererAnalyze = 0 LevelForRobotsDetection = 0 LevelForWormsDetection = 0 LevelForSearchEnginesDetection = 0 LevelForFileTypesDetection = 0 UseFramesWhenCGI = 1 ShowSummary = HB ShowMonthStats = HB ShowDaysOfMonthStats = HB ShowDaysOfWeekStats = HB ShowHoursStats = HB ShowDomainsStats = 1 ShowHostsStats = HBL ShowAuthenticatedUsers = 0 ShowRobotsStats = 0 ShowEMailSenders = HBML ShowEMailReceivers = HBML ShowSessionsStats = 0 ShowPagesStats = 0 ShowFileTypesStats = 0 ShowFileSizesStats = 0 ShowBrowsersStats = 0 ShowOSStats = 0 ShowOriginStats = 0 ShowKeyphrasesStats = 0 ShowKeywordsStats = 0 ShowMiscStats = 0 ShowHTTPErrorsStats = 0 ShowSMTPErrorsStats = 1 LoadPlugin = "decodeutfkeys"
Настраиваем ежечасное автоматическое обновление данных:
echo "55 * * * * root /usr/lib/cgi-bin/awstats.pl -config=postfix -update > /dev/null" >> /etc/cron.d/awstats
Отредактируем настройки виртуального хоста mail.вашдомен.ru:
mcedit /etc/apache2/sites-enabled/roundcube
Alias /awstatsicons /usr/share/awstats/icon ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory>
Для отображения иконок в awstats выполняем:
ln -s /usr/share/awstats/icon/ /var/www/awstatsicons
Создадим каталог, в котором Awstats будет хранить свои данные (этот же каталог указан в конфиге):
mkdir /mnt/vdb1/awstats chown www-data:www-data /mnt/vdb1/awstats
Теперь по адресу:
https://mail.вашдомен.ru/cgi-bin/awstats.pl?config=postfix
мы можем видеть статистику.
Установка MailGraph
apt-get install mailgraph
Теперь по адресу:
http://mail.вашдомен.ru/cgi-bin/mailgraph.cgi
можно посмотреть графики работы почтового сервера.
Источники информации
Фильтрация спама регулярными выражениями (rus)
Virtual Users And Domains With Postfix, Courier And MySQL (eng)
Установка и настройка SpamAssassin (rus)
Фильтрация спама в postfix посредством регулярных вырежений (rus)
Настройка связки Postfix + amavisd-new + SpamAssassin (rus)
Распределенные методы обнаружения спама (часть 2) (rus)
Два средства против спама (rus)
Postfix - проверка отправителя (rus)
Настройка почтового сервера (Postfix, Dovecot, DSpam, SQLGrey, DomainKeys, SPF) (rus)
Защита пользователей почтового сервера от спамеров (rus)
HowTo. Почтовый сервер Postfix, Courier, MySQL и SquirrelMail (Ubuntu 8,04)
Обсуждение
Вопросы, предложения, правки оставляем тут