Очередная статья, как настроить почтовый сервер.
Задача: есть домен и свободная виртуалка, почему бы не настроить почтовый сервер. Настраивать будем на домене samara-it.ru и в качестве ОС будем использовать CentOS 8. Знаю, что есть Zimbra\iRedMail, которые «ставятся и работают», но хочется пройти процесс установки с самого начала, чтоб «прочувствовать».
Что должно получится: Почтовый сервер, с удобной web-почтой (Roundcube), и управлением через PostfixAdmin.
Текущая схема сети.
В качестве router-а используется CentOS 8. На нем настроен dnsmasq, iptables, настройка роутера не описывается, только приведу изменения, необходимые для работы.
На сервере mail (буду так указывать, для простоты) используется CentOS 8 и установлены: wget, mc, htop, atop, nano и т.д. Не думаю, что для вас это будет проблемой.
1. Настраиваем\проверяем настройки DNS у хостера. Обязательно должна быть запись MX, без этого работать не будет! Т.к. почта должна ходить на домен samara-it.ru, значит должна быть такая MX запись:
1 2 |
samara-it.ru. IN MX 10 mail.samara-it.ru mail.samara-it.ru. 3600 IN A 37.xx.xx.xx |
Так же, мы должны добавить PTR запись, для этого обращаемся к хостеру и просим его добавить эту запись. У меня получилось так:
1 2 |
# host 37.xx.xx.xx xx.xx.xx.37.in-addr.arpa domain name pointer mail.samara-it.ru. |
2. Настраиваем имя хоста
Проверяем на mail, если не так, меняем
1 2 |
cat /etc/hostname mail.samara-it.ru |
1 2 3 4 5 6 7 8 9 10 11 |
hostnamectl Static hostname: mail.samara-it.ru Icon name: computer-vm Chassis: vm Machine ID: 81b77189e5a948ad9345928b45b21598 Boot ID: 7dbf58515d1d409eaf634bb37637ee74 Virtualization: kvm Operating System: CentOS Linux 8 (Core) CPE OS Name: cpe:/o:centos:centos:8 Kernel: Linux 4.18.0-80.11.2.el8_0.x86_64 Architecture: x86-64 |
Если не так, меняем:
1 2 |
hostnamectl set-hostname mail.samara-it.ru systemctl restart systemd-hostnamed |
ВАЖНО: 192.168.33.91 mail.samara-it.ru <- эта запись должна быть первой!!!
1 2 3 4 |
cat /etc/hosts 192.168.33.91 mail.samara-it.ru samara-it.ru mail 127.0.0.1 localhost ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 |
Проверяем:
1 2 |
hostname mail.samara-it.ru |
Теперь вносим изменения на router
1 2 3 4 |
cat /etc/hosts 192.168.33.91 mail.samara-it.ru samara-it.ru mail 127.0.0.1 localhost ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 |
3. Установка и настройка Nginx
ВАЖНО: Все дальнейшие настройки и установку делаем на mail.
Подключим репозиторий nginx, стабильной версии. Для этого создадим файл
1 |
nano /etc/yum.repos.d/nginx.repo |
и добавим в него следующие
1 2 3 4 5 6 7 |
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true |
Устанавливаем:
1 |
dnf install nginx -y |
Настроем основной конфиг nginx.
Сохраним оригинальный конфиг.
1 |
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig |
Приведем его /etc/nginx/nginx.conf к такому виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; # Уменьшает число системных вызовов gettimeofday(), что приводит к увеличению производительности timer_resolution 100ms; # Изменяет ограничение на число используемых файлов RLIMIT_NOFILE для рабочего процесса. worker_rlimit_nofile 8192; # Директива задаёт приоритет рабочих процессов от -20 до 20 (отрицательное число означает более высокий приоритет). worker_priority -5; events { worker_connections 1024; # Будет принимать максимально возможное количество соединений multi_accept on; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] $host "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; # Будет отправлять заголовки и начало файла в одном пакете tcp_nopush on; tcp_nodelay on; # Если клиент перестал читать отвечать, Nginx будет сбрасывать соединение с ним reset_timedout_connection on; # Будет ждать 100 секунд тело запроса от клиента, после чего сбросит соединение client_body_timeout 100; client_max_body_size 10M; gzip on; gzip_disable "msie6"; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; open_file_cache max=200000 inactive=600s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; # Не показывать текущую версию nginx server_tokens off; # Уберем хедеры, чтоб скрыть информацию proxy_hide_header X-Powered-By; proxy_hide_header X-Generator; # Добавим виртуальные хосты include /etc/nginx/conf.d/*.conf; } |
Создадим конфиг с ssl. Сертификаты ssl я использую от Let’s Encrypt, получение сертификата расписывать не буду. У меня wildcard сертификат. Создадим каталог и файл с настройками.
1 2 |
mkdir /etc/nginx/includes nano /etc/nginx/includes/ssl |
и добавим в файл это:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
ssl_certificate /etc/pki/tls/certs/fullchain.pem; ssl_certificate_key /etc/pki/tls/private/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; ssl_prefer_server_ciphers on; # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months) #add_header Strict-Transport-Security max-age=15768000; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; "; #add_header X-Frame-Options "DENY"; # OCSP Stapling --- # fetch OCSP records from URL in ssl_certificate and cache them ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem; resolver 8.8.8.8 valid=300s; resolver_timeout 5s; |
Обращаем внимание на строки с сертификатом и его ключом. Правим пути под свои, так же, не забываем устанавливать необходимые права на файлы сертификата и ключа. В моем случае это:
1 2 3 4 5 |
chown root:root /etc/pki/tls/private/privkey.pem chmod 600 /etc/pki/tls/private/privkey.pem chown root:root /etc/pki/tls/certs/fullchain.pem chmod 644 /etc/pki/tls/certs/fullchain.pem |
4. Установка и настройка PHP-FPM для Nginx.
Устанавливать будет PHP 7.4, для этого добавим репозиторий Remi и включим его
1 2 |
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm dnf module enable php:remi-7.4 |
Ставим php-fpm
1 |
yum install php php-fpm php-mysqlnd php-imap php-mbstring php-common php-pdo php-xml php-cli php-pear php-gd php-pecl-mcrypt -y |
Проверяем
1 2 3 4 5 6 |
php -v PHP 7.4.1 (cli) (built: Dec 17 2019 16:35:58) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.1, Copyright (c), by Zend Technologies |
Настраиваем
1 2 3 4 5 |
cp /etc/php.ini /etc/php.ini.bak sed -i 's/;date.timezone =/date.timezone = Europe\/Samara/g' /etc/php.ini sed -i 's/expose_php = On/expose_php = Off/g' /etc/php.ini sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 200M/g' /etc/php.ini sed -i 's/post_max_size = 8M/post_max_size = 10M/g' /etc/php.ini |
1 2 3 4 5 6 7 8 9 10 11 |
cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.bak sed -i 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf sed -i 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf sed -i 's/listen = \/run\/php-fpm\/www.sock/listen = \/var\/run\/php-fpm\/php-fpm.sock/g' /etc/php-fpm.d/www.conf sed -i 's/;listen.owner = nobody/listen.owner = nginx/g' /etc/php-fpm.d/www.conf sed -i 's/;listen.group = nobody/listen.group = nginx/g' /etc/php-fpm.d/www.conf sed -i 's/;listen.mode = 0660/listen.mode = 0660/g' /etc/php-fpm.d/www.conf sed -i 's/;env/env/g' /etc/php-fpm.d/www.conf chgrp -R nginx /var/lib/php/session/ |
Проверяем и если все ОК, запускаем и добавляем в автозагрузку
1 2 3 |
php-fpm -t systemctl enable php-fpm.service systemctl start php-fpm.service |
5. Установка и настройка MySQL
Установка MySQL 8
1 |
dnf install mysql-server -y |
Запускаем и настраиваем
1 2 3 4 5 |
systemctl start mysqld.service systemctl enable mysqld.service # Запустим настройку (смена пароля root, удаление анонимных пользователей и т.д.) /usr/bin/mysql_secure_installation |
6. Установка PostfixAdmin
1 2 3 4 5 6 7 8 9 |
cd /var/www/html/ wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz tar -xvf postfixadmin.tar.gz # У меня версия 3.2, у вас может быть другой mv /var/www/html/postfixadmin-3.2/ /var/www/html/postfixadmin rm -f /var/www/html/postfixadmin.tar.gz chown -R nginx:nginx /var/www/html/postfixadmin |
Создаем базу, она будет нужна для работы Postfix, Dovecot, PostfixAdmin
1 |
mysql -u root -p |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> CREATE DATABASE mail_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; Query OK, 1 row affected (0,00 sec) mysql> CREATE USER user_db@localhost IDENTIFIED BY 'My$upperPa$$word'; Query OK, 0 rows affected (0,01 sec) mysql> GRANT ALL PRIVILEGES ON mail_db.* TO user_db@localhost; Query OK, 0 rows affected (0,00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0,01 sec) mysql> quit Bye |
Сделаем копию файла настроек PostfixAdmin и внесем изменения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cp /var/www/html/postfixadmin/config.inc.php /var/www/html/postfixadmin/config.local.php sed -i 's/change-this-to-your.domain.tld/samara-it.ru/g' /var/www/html/postfixadmin/config.local.php nano /var/www/html/postfixadmin/config.local.php $CONF['configured'] = true; $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'user_db'; $CONF['database_password'] = 'My$upperPa$$word'; $CONF['database_name'] = 'mail_db'; $CONF['encrypt'] = 'dovecot:CRAM-MD5'; // Мы будем использовать dovecot, поэтому убираем префикс $CONF['create_mailbox_subdirs_prefix']=''; |
ВНИМАНИЕ! в виду того, что мы используем шифрование «dovecot:CRAM-MD5», нам необходимо установить сам dovecot, настраивать его мы будем позже.
1 |
dnf install dovecot dovecot-mysql -y |
Настраиваем виртуальный хост на Nginx, создаем файл
1 |
nano /etc/nginx/conf.d/postfixadmin.conf |
И добавляем в него содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
server { listen 80; server_name postfixadmin.samara-it.ru; # enforce https return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name postfixadmin.samara-it.ru; access_log /var/log/nginx/postfixadmin-access.log; error_log /var/log/nginx/postfixadmin-error.log; include /etc/nginx/includes/ssl; # Path to the root root /var/www/html/postfixadmin/public/; location / { index index.php; allow XX.XX.XX.XX; deny all; } # ############### Статика ########################## location ~* /.+(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|woff|exe|jpeg)$ { # Only for / !!!! root /var/www/html/postfixadmin/public/; expires max; # add_header X-debug-message "This is static main" always; access_log off; allow XX.XX.XX.XX; deny all; } location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; try_files $uri =404; fastcgi_buffers 8 256k; fastcgi_buffer_size 128k; fastcgi_intercept_errors on; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; allow XX.XX.XX.XX; deny all; } } |
Обратите внимание на строки: allow XX.XX.XX.XX; — я разрешил доступ к серверу только с определенного ip. Если это не надо, уберите строки allow XX.XX.XX.XX; и deny all; Так же, можно настроить доступ через авторизацию.
Далее, необходимо создать директорию templates_c
1 2 |
mkdir /var/www/html/postfixadmin/templates_c chown -R nginx:nginx /var/www/html/postfixadmin/templates_c |
Добавляем запись А в DNS: postfixadmin.samara-it.ru -> 37.xx.xx.xx.
Открываем доступ по порту 80 и 443 через iptables, на сервере mail.
1 2 |
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT |
Делаем проброс портов на router
1 2 |
iptables -A PREROUTING -p tcp -m tcp --dport 80 -m comment --comment mail -j DNAT --to-destination 192.168.33.91:80 iptables -A PREROUTING -p tcp -m tcp --dport 443 -m comment --comment mail -j DNAT --to-destination 192.168.33.91:443 |
запускаем nginx
1 2 |
systemctl start nginx.service systemctl enable nginx.service |
Открываем браузер и заходим на сайт: https://postfixadmin.samara-it.ru/setup.php
Вводим пароль в строке: Setup password, получаем хеш пароля, добавляем его в конфиг:
1 2 3 4 5 6 |
nano /var/www/html/postfixadmin/config.local.php # вместо $CONF['setup_password'] = 'changeme'; # ставим: $CONF['setup_password'] = 'd0caef2ba78e675d20b13d39df5b421f:95361a3fa404910344500ef186bc3e9353fbff1d'; |
В строке Administrator – вводим учетную запись администратора admin@samara-it.ru
Вводим пароль от админсткой учетки.
После чего переименовываем установочный файл
1 |
mv /var/www/html/postfixadmin/public/setup.php /var/www/html/postfixadmin/public/setup.php.bak |
Заходим на сайт: https://postfixadmin.samara-it.ru и добавляем новый домен:
Далее, добавляем новый почтовый ящик
Продолжаем в Часть 2.