Saturday, January 23, 2010

Postfix MailServer + Dovecot + MySql

Có tìm trên mạng, trên trang chủ của Postfix cũng có tut hướng dẫn chi tiết vấn đề này. Tuy nhiên đó là nền Debian leny. Mình lại dùng CentOS. :(.
Nhưng nói chung giống nhau. Hn viết lại theo chuẩn CentOS :))
Chuẩn bị
Đảm bảo hostname + DNS chuẩn nhé
yum instal -y db4 db4-devel
Cái này để lấy file db.h. hix.
yum -y install mysql mysql-devel dovecot cyrus-sasl
Cấu hình mysqlserver nhé.
Tiếp theo là postfix. Mặc định postfix trên CentOS ko hỗ trợ mysql, do đó cần cài từ source. Đây là đoạn code configure của mình:
make -f Makefile.init makefiles \
CCARGS='-DUSE_SASL_AUTH -I/usr/include/sasl \
-DHAS_MYSQL -I/usr/include/mysql' \
AUXLIBS='-L/usr/lib -lsasl2 \
-L/usr/lib/mysql -lmysqlclient -lz -lm'
make
make install
Trước đó:
groupadd -g 1001 postfix
groupadd -g 1002 postdrop
useradd -g 1001 postfix
useradd -g 1002 postdrop
Cài xong type:
postfix start
postconf -m
Để ý sẽ thấy module mysql
Cái này vì postfix yêu cầu tên 2 user đó độc lập.
Bước vào cấu hình.
Đăng nhập vào mysqlserver nhé:
Bắt đầu nào:
mysql -u root -p
Type pass root, tại dấu nhắc mysql>
create database mailserver;
GRANT SELECT ON mailserver.*
TO mailuser@localhost
IDENTIFIED BY '12346';
Tạo xong user và database, trình SQL có hạn nên chỉ biết có vậy:
Tiếp là tạo table lưu domain:
use mailserver;
CREATE TABLE `virtual_domains` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE = InnoDB;

Table lưu user:
CREATE TABLE `virtual_users` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
user VARCHAR(40) NOT NULL,
password VARCHAR(32) NOT NULL,
CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;

Table alias:
CREATE TABLE `virtual_aliases` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
source VARCHAR(40) NOT NULL,
destination VARCHAR(80) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;
Tạo map file:
Taọ file: /etc/postfix/mysql-virtual-mailbox-domains.cf với nội dung:
user = mailuser
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
Map vào postfix: 
postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Bây h ta add domain, ngừoi ta dùng lệnh nhưng mình xài phpmyadmin; |
Các bạn vào ấy add bt, nếu ko vào mysql:
INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com');
Nhập domain ấy cho postfix:
postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Nếu kết quả là 1 thì ok, còn nếu ko đc thì có thể lỗi phần config connect to mysql
tiếp đến là virtual mailbox: Hiểu đơn giản là postfix nhận thư nhé, deliver tới cho dovecot. Dovecot sẽ chia tới các mail dir. Nhưng mà vì là user ảo nên cần có 1 user thật đứng ra nhận cho nó:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m
postconf -e virtual_uid_maps=static:5000
postconf -e virtual_gid_maps=static:5000
Vào mysql add 1 user:
INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, 'john', MD5('summersun'));
Tạo 1 view trung gian:
CREATE VIEW view_users AS
SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email,
    virtual_users.password
FROM virtual_users 
LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
Tạo file: /etc/postfix/mysql-virtual-mailbox-maps.cf
user = mailuser
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM view_users WHERE email='%s'
Nạp vào cấu hình postfix:
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Map user kia:
postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Tạo:  alias map, dùng để forward mail đó ra một hệ thống khác, kiểu như john@example.com có mail nữa là john@gmail.com. H bạn muốn cả gmail cũng nhận đc thì cần có nó:
INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, 'john', 'john@example.com'),(2, 1, 'john', 'jmiller@gmail.com');
Tạo view, trình sql kém chỉ biết là nhìn cho đẹp:
CREATE VIEW view_aliases AS
SELECT CONCAT(virtual_aliases.source, '@', virtual_domains.name) AS email,
       destination
FROM virtual_aliases
LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;
Map file: /etc/postfix/mysql-virtual-alias-maps.cf:
user = mailuser
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view_aliases WHERE email='%s'
postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

File: etc/postfix/mysql-email2email.cf
user = mailuser
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view_users WHERE email='%s'
postmap -q john@example.com mysql:/etc/postfix/mysql-email2email.cf
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
 
Chmod:
chgrp postfix /etc/postfix/mysql-*.cf 
chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Deliver mail với Dovecot:
Sửa file: /etc/postfix/master.cf. Thêm:
dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}
postfix reload 
postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1
File: /etc/dovecot.conf
Bỏ dấu# :
protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
Sửa các tham số:
mail_location = maildir:/home/vmail/%d/%n/Maildir
namespace private {
    separator = .
    prefix = INBOX.
    inbox = yes
}

mechanisms = plain login
passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
}
userdb static {
    args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
socket listen {
    master {
        path = /var/run/dovecot/auth-master
        mode = 0600
        user = vmail
    }

    client {
        path = /var/spool/postfix/private/auth
        mode = 0660
        user = postfix
        group = postfix
    }
}
protocol lda {
    log_path = /home/vmail/dovecot-deliver.log
    auth_socket_path = /var/run/dovecot/auth-master
    postmaster_address = postmaster@example.com
    global_script_path = /home/vmail/globalsieverc
}

Tạo file: /etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=123456
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM view_users WHERE email='%u';

service dovecot restart
postfix reload
chgrp vmail /etc/dovecot.conf
chmod g+r /etc/dovecot.conf
Phù, tail -f /var/log/maillog, nếu:
dovecot: Dovecot v1.0.rc15 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)

 Là ok, dovecot đã connect tới mysql
Test.
Add domain:
INSERT INTO virtual_domains (name) VALUES ('');
postmap -q mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Add user:
INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, 'test', MD5('hbn'));
postmap -q test@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

xong, vất vả, trong quá trình test, có lỗi gì thì các bạn cứ tail log ra + google là ok thôi.
Cấu hình SSL:
mkdir -p /etc/ssl/private/
mkdir -p /etc/ssl/certs/
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem

chmod o= /etc/ssl/private/dovecot.pem


Hoàn tất cấu hình SMTP

postconf -e smtpd_sasl_type=dovecot
postconf -e smtpd_sasl_path=private/auth
postconf -e smtpd_sasl_auth_enable=yes
postconf -e smtpd_recipient_restrictions=permit_mynetworks,per mit_sasl_authenticated,reject_unauth_destination


Phù, vất vả qúa.
Thanks for reading
---------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------
All my Lab:
Linux Lab -- window and Cisco Lab
to be continued - I will update more.

2 comments:

Anonymous said...

Mình đã thực hiện theo bài viết của bạn nhưng kết quả là không đc , từ phía client khi móc đến server báo lỗi unsupport ssl . trên server kiểm tra /var/log/maillog thì báo lỗi lost connection EHLO . Phiền bạn giúp đỡ mình với nhé . Thanks bạn rất nhiều !

Anonymous said...

Hì sorry vì làm phiền , mình đã thực hiện được rồi , thanks bạn nhiều nhe 1.

Install Xposed Inspector and Frida on Genymotion

Today i had some work with android. So i need trace application. I found 2 nice tool can help me: Xposed Inspector and Frida. To setup ther...