Това е може би една от най-сложните задачи.
И така имаме следното: - FQDN: mail.tlan.local - WEB сървър с IP:10.25.0.6.
Хоста ще се казва web.example.tlan.net със следните мрежови настройки:
# vi /etc/network/interfaces iface ens33 inet static address 10.25.0.6 netmask 255.255.255.0 gateway 10.25.0.1 # vi /etc/hosts 127.0.0.1 localhost 127.0.1.1 mail.tlan.local mail # vi /etc/hostname mail # vi /etc/resolv.conf nameserver 10.25.0.3
С това приключваме настройката на мрежовата част. Следва самата инсталация и настройка. За инсталиране на пакетите погледнете в Инсталиране и настройка на Mail sserver. В подглавите ще видите за различните пакети различни инсталации.
Да започнем с PsotFix, като в началото обновим системата:
# apt-get update # apt-get upgrade # apt-get install postfix General type of mail configuration: Internet Site System mail name: mail.example.tlan.net
Инсталираме и връзката с MySQL:
# apt-get install postfix-mysql
Да създадем виртуалните домейни, пощенски кутии и псевдоними:
# postconf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf # vi /etc/postfix/mysql-virtual-mailbox-domains.cf user = pfuser password = pfpass hosts = 10.25.0.4 dbname = pfdb query = SELECT 1 FROM virtual_domains WHERE name='%s' # postconf virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf # vi /etc/postfix/mysql-virtual-mailbox-maps.cf user = pfuser password = pfpass hosts = 10.25.0.4 dbname = pfdb query = SELECT 1 FROM virtual_users WHERE email='%s' # postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf # vi /etc/postfix/mysql-virtual-alias-maps.cf user = pfuser password = pfpass hosts = 10.25.0.4 dbname = pfdb query = SELECT destination FROM virtual_aliases WHERE source='%s' # postconf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf # vi /etc/postfix/mysql-email2email.cf user = pfuser password = pfpass hosts = 10.25.0.4 dbname = pfdb query = SELECT email FROM virtual_users WHERE email='%s'
И да пробваме, като първо рестартираме PostFix:
# /etc/init.d/postfix restart # /etc/init.d/postfix status # postmap -q mail.example.tlan.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf postmap: warning: connect to mysql server sql.tlan.local: Access denied for user 'pfuser'@'10.25.0.6' (using password: YES) postmap: fatal: table mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf: query error: No such file or directory
Това е така, защото първо нямаме база, и после базата няма таблици. Още едно много важно нещо, трябва да има потребител pfuser с парола pfpass който да е дефиниран в SQL сървъра и също така да има права върху базата pfdb. За начало обаче ще инсталираме mysql-client:
# apt install mysql-client
Сега да се занимаем с базата данни и потребителя:
# mysql -u root -p -h 10.25.0.4 Enter password: MySQL MariaDB [(none)]> CREATE DATABASE pfdb; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE USER 'pfuser'@'10.25.0.6' IDENTIFIED BY 'pfpass'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON pfdb.* TO 'pfuser'@'10.25.0.6'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> CREATE USER 'pfadmin'@'10.25.0.6' IDENTIFIED BY 'adminpass'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON pfdb.* TO 'pfadmin'@'10.25.0.6'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> USE pfdb; Database changed MariaDB [pfdb]> CREATE TABLE IF NOT EXISTS `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected, 1 warning (0.01 sec) MariaDB [pfdb]> CREATE TABLE IF NOT EXISTS `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `email` varchar(100) NOT NULL, `password` varchar(150) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected, 1 warning (0.00 sec) MariaDB [pfdb]> CREATE TABLE IF NOT EXISTS `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected, 1 warning (0.00 sec) MariaDB [pfdb]> show databases; +-----------------------------+ | Database | +-----------------------------+ | information_schema | | mysql | | performance_schema | | pfdb | +-----------------------------+ 4 rows in set (0.00 sec) MariaDB [pfdb]> show tables; +---------------------+ | Tables_in_pfdb | +---------------------+ | virtual_aliases | | virtual_domains | | virtual_users | +---------------------+ 3 rows in set (0.00 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> QUIT Bye
Имаме база и таблиците. Да ги попълним с данни, като влезем в MySQL-a с pfadmin.
# mysql -u pfadmin -p -h 10.25.0.4 Enter password: adminpass MariaDB [pfdb]> show databases; +-----------------------------+ | Database | +-----------------------------+ | information_schema | | pfdb | +-----------------------------+ 2 rows in set (0.00 sec) MariaDB [(none)]> USE pfdb; Database changed MariaDB [(none)]> INSERT INTO `pfdb`.`virtual_domains` (`id` ,`name`) VALUES ('1', 'example.tachko.com'), ('2', 'example.tlan.net'); MariaDB [pfdb]> select * from virtual_domains; +---+----------------------------+ | id | name | +---+----------------------------+ | 1 | example.tachko.com | | 2 | example.tlan.net | +---+----------------------------+ 2 rows in set (0.00 sec) MariaDB [pfdb]> INSERT INTO `pfdb`.`virtual_users` (`id`, `domain_id`, `password` , `email`) VALUES ('1', '1', ENCRYPT('Iceman', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'tachko@example.tlan.net'), ('2', '1', ENCRYPT('tit', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'tit@example.tlan.net'); Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0 MariaDB [pfdb]> INSERT INTO `pfdb`.`virtual_aliases` (`id`, `domain_id`, `source`, `destination`) VALUES ('1', '1', 'tit@example.tlan.net', 'tachko@example.tlan.net'); Query OK, 1 row affected (0.01 sec) MariaDB [pfdb]> select * from virtual_users; MariaDB [pfdb]> select * from virtual_aliases; MariaDB [pfdb]> quit Bye
Таблиците са запълнени с данни. Да тестваме връзката между PostFix и MySQL:
# postmap -q example.tachko.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf 1 # postmap -q example.tlan.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf 1
Нещата с домейните работи, да тестваме и останалите неща. Започваме с пощенските кутии:
# postmap -q tachko@example.tlan.net mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf 1
Тестваме и псевдонимите:
# postmap -q tit@example.tlan.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf tachko@example.tlan.net # postmap -q tit@example.tlan.net mysql:/etc/postfix/mysql-email2email.cf tit@example.tlan.net
Всичко е наред.
# groupadd -g 5000 vmail # useradd -g vmail -u 5000 vmail -d /home/vmail -m
Пощенските кутии и съдържанието в тях ще се разполагат в: /home/vmail/
За справка Инсталиране и конфигуриране на Dovecot.
# apt-get install dovecot-mysql dovecot-pop3d dovecot-imapd dovecot-managesieved dovecot-lmtpd # vi /etc/dovecot/conf.d/10-auth.conf auth_mechanisms = plain login #!include auth-system.conf.ext !include auth-system.conf.ext # vi /etc/dovecot/conf.d/auth-sql.conf.ext ### Търсим секцията userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } ### Трием горното и слагаме това: userdb { driver = static args = uid=vmail gid=vmail home=/home/vmail/%d/%n } # vi /etc/dovecot/conf.d/10-master.conf ### Търсим пасажа: service auth { ### ……………………………. писано ……………………………. ### # Postfix smtp-auth #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #} ### Трябва да изглежда: service auth { ### ……………………………. писано ……………………………. ### # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { #размаркирва се mode = 0660 #размаркирва се user = postfix group = postfix } #размаркирва се # vi /etc/dovecot/conf.d/10-ssl.conf ### Търсим реда: ssl = no ### Трябва да изглежда: ssl = yes ### Търсим още: #ssl_cert = </etc/dovecot/dovecot.pem #ssl_key = </etc/dovecot/private/dovecot.pem ### Трябва да изглежда: ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
Внимание: сертификатите в SQL сървъра и в Mail сървъра трябва да са едни и същи. По лесния вариант е копирайте сертификатите от WEB сървъра на SQL сървъра и Mail сървъра.
Първо да влезем във WEB сървъра:
# ssh tachko@10.25.0.5 The authenticity of host '10.25.5 (10.25.0.5)' can't be established. ECDSA key fingerprint is SHA256:SfLFOmKVGyEPEcz7hX4kkTjZZhfF1xkUaXAbKYRbJXQ. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.25.5' (ECDSA) to the list of known hosts. tachko@10.25.5's password: Iceman tachko@web:~$ su Password: rootpass root@web:/home/tachko# cp /etc/ssl/certs/ssl-cert-snakeoil.pem ./ root@web:/home/tachko# cp /etc/ssl/private/ssl-cert-snakeoil.key ./ root@web:/home/tachko# chown tachko:tachko ssl* root@web:/home/tachko# exit tachko@web:~$ exit # logout Connection to 10.25.5 closed.
Копирахме файловете в папка видима от отдалечените компютри за потребител tachko. Файловете от тази директория ги направихме собственост на групата tachko:tachko. Готови сме да ги копираме на Mail сървъра:
/# cd /home/tachko/ root@mail:/home/tachko# scp tachko@10.25.0.5:/home/tachko/ssl* . tachko@10.25.0.5's password: Iceman ssl-cert-snakeoil.key 100% 1704 1.6MB/s 00:00 ssl-cert-snakeoil.pem 100% 1078 1.2MB/s 00:00
Сега да им върнем собствеността на root:root
root@mail:/home/tachko# chown root:root ssl* root@mail:/home/tachko# ls -l total 8 -rw-r----- 1 root root 1704 Jul 15 03:07 ssl-cert-snakeoil.key -r--r--r-- 1 root root 1078 Jul 15 03:07 ssl-cert-snakeoil.pem
И да препокрием нашите файлове:
root@mail:/home/tachko# cp ssl-cert-snakeoil.pem /etc/ssl/certs/ root@mail:/home/tachko# cp ssl-cert-snakeoil.key /etc/ssl/private/
Вече сертификатите на WEB сървъра и Mail сървъра са едни и същи. Продължаваме:
# vi /etc/dovecot/conf.d/15-mailboxes.conf # Най-отдолу преди затварящата скоба '}' се слага следното: mailbox INBOX.Junk { auto = subscribe special_use = \Junk } mailbox INBOX.Trash { auto = subscribe special_use = \Trash } } # vi /etc/dovecot/dovecot-sql.conf.ext driver = mysql connect = host=10.25.0.4 dbname=pfdb user=pfuser password=pfpass default_pass_scheme = SHA256-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'; # chown root:root /etc/dovecot/dovecot-sql.conf.ext # chmod go= /etc/dovecot/dovecot-sql.conf.ext # > /var/log/mail.log # > /var/log/mail.err # /etc/init.d/dovecot restart # /etc/init.d/dovecot status # vi /var/log/mail.log
Всичко е наред, видими грешки няма.
# vi /etc/dovecot/conf.d/10-master.conf service lmtp { unix_listener lmtp { # lmtp трябва да се премахне #mode = 0666 } # Create inet listener only if you can't use the above UNIX socket #inet_listener lmtp { # Avoid making LMTP visible for the entire internet #address = #port = #} } ### Трябва да изглежда така service lmtp { #unix_listener lmtp { #mode = 0666 #} unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix } # Create inet listener only if you can't use the above UNIX socket #inet_listener lmtp { # Avoid making LMTP visible for the entire internet #address = #port = #} } # /etc/init.d/dovecot restart # /etc/init.d/dovecot status
Отново без забележки
# postconf virtual_transport=lmtp:unix:private/dovecot-lmtp
# vi /etc/dovecot/conf.d/20-lmtp.conf ### Търсим секцията protocol lmtp { # Space separated list of plugins to load (default is global mail_plugins). #mail_plugins = $mail_plugins } ### Трябва да изглежда така protocol lmtp { # Space separated list of plugins to load (default is global mail_plugins). #mail_plugins = $mail_plugins mail_plugins = $mail_plugins sieve } # /etc/init.d/dovecot restart # /etc/init.d/dovecot status
Без забележки.
# postconf smtpd_sasl_type=dovecot # postconf smtpd_sasl_path=private/auth # postconf smtpd_sasl_auth_enable=yes
# postconf smtpd_tls_security_level=may # postconf smtpd_tls_auth_only=yes # postconf smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem # postconf smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
# apt-get install telnet # telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 mail.tlan.local ESMTP Postfix (Debian/GNU) ehlo example.tlan.net 250-mail.tlan.local 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN quit 221 2.0.0 Bye Connection closed by foreign host. # telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 mail.tlan.local ESMTP Postfix (Debian/GNU) ehlo example.tlan.net 250-mail.tlan.local 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN starttls 220 2.0.0 Ready to start TLS quit Connection closed by foreign host. # openssl s_client -connect localhost:25 -starttls smtp Появяват се много символи и накрая въвеждаме: ehlo example.tlan.net Резултата е следния: 250-mail.tlan.local 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN И сега трябва да се напише криптиран код: AUTH PLAIN am9obkBleGFtcGxlLm9yZwBqb2huQGV4YW1wbGUub3JnAHN1bW1lcnN1bg == 501 5.5.4 Syntax: AUTH mechanism quit 221 2.0.0 Bye closed
# perl -MMIME::Base64 -e 'print encode_base64("tachko\@example.tlan.net\0tachko\@example.tlan.net\0Iceman")'; dGFjaGtvQGV4YW1wbGUudGxhbi5uZXQAdGFjaGtvQGV4YW1wbGUudGxhbi5uZXQASWNlbWFu # openssl s_client -connect localhost:25 -starttls smtp ............................. 250 DSN ehlo example.tlan.net Резултата е следния: 250-mail.tlan.local 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN atth 502 5.5.2 Error: command not recognized auth plain dGFjaGtvQGV4YW1wbGUudGxhbi5uZXQAdGFjaGtvQGV4YW1wbGUudGxhbi5uZXQASWNlbWFu 235 2.7.0 Authentication successful quit 221 2.0.0 Bye closed
До тук всичко е наред
# vi /etc/postfix/master.cf # # Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master" or # on-line: http://www.postfix.org/master.5.html). # # Do not forget to execute "postfix reload" after editing this file. # # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (no) (never) (100) # ========================================================================== smtp inet n - y - - smtpd #smtp inet n - y - 1 postscreen #smtpd pass - - y - - smtpd #dnsblog unix - - y - 0 dnsblog #tlsproxy unix - - y - 0 tlsproxy #submission inet n - y - - smtpd submission inet n - - - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth -o smtpd_sasl_security_options=noanonymous -o smtpd_sender_login_maps=mysql:/etc/postfix/mysql-email2email.cf -o smtpd_sender_restrictions=reject_sender_login_mismatch -o smtpd_sasl_local_domain=$myhostname -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject # -o syslog_name=postfix/submission # -o smtpd_tls_security_level=encrypt # -o smtpd_sasl_auth_enable=yes # -o smtpd_reject_unlisted_recipient=no # -o smtpd_client_restrictions=$mua_client_restrictions # -o smtpd_helo_restrictions=$mua_helo_restrictions # /etc/init.d/postfix restart # /etc/init.d/postfix status
Добре, продължаваме напред.
Самата инсталация, както и конфигурация може да се види на:RoundCube. За начало да създадем базата за RoundCUbe.
# mysql -u tachko -p -h 10.25.0.4 MariaDB [(none)]> create database roundcube; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE USER 'roundcube'@'10.25.0.5' IDENTIFIED BY 'rcpass'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> grant all privileges on roundcube.* to roundcube@10.25.0.5 identified by 'rcpass'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> exit Bye
# apt-get install roundcube roundcube-plugins roundcube-plugins-extra php-net-sieve
На първия екран където иска да се конфигурира базата данни на RoundCube, избираме No, ще я настроим по-късно За начало да разрешим RoundCube да се вижда от всички:
# vi /etc/roundcube/apache.conf # Размаркирваме реда: Alias /roundcube /var/lib/roundcube # /etc/init.d/apache2 restart # /etc/init.d/apache2 status
Но още няма да работи, защото не е свързан с базата данни:
# dpkg-reconfigure roundcube-core
Дефинираме IP адреса на Mail сървъра:
Езика по подразбиране на RoundCube
Да преинсталираме базата данни за RoundCube
Тъй като базата данни е на друг компютър ще ползваме TCP/IP протокола
Дефинираме IP адреса на сървъра с базата данни, ако го няма избираме new host и после го указваме
Порта за връзка с SQL сървъра
Базата данни за RoundCube
Потребителя който ще работи с базата данни на RoundCube
Паролата на потребителя
Потребителя имащ администраторски права с SQL сървъра, който ще създаде базата данни roundcube
Паролата на администратора на SQL сървъра
Дефинираме какъв ни е WEB сървъра
Предлага да се рестартира WEB сървъра за а влязат промените в сила Сега ако напишем в браузъра http://example.tlan.net/roundcube ще се отвори RoundCube