• Cài đặt Postfix Mail server + Dovecot + Mysql trên CentOS

  • ITtoday.vn - Bài viết này sẽ hướng dẫn các bạn cài đặt Mail server Postfix sử dụng Virtual Domain và Virtual User dựa trên database Mysql.

  • Sunday, 26 July 2015, 05:07:32 PM
  • Cài đặt Postfix Mail server + Dovecot + Mysql trên CentOS
  • 1.Chuẩn bị

    Cài đặt các gói cần thiết:

    yum -y install mysql mysql-devel dovecot cyrus-sasl mysql-server

    Kiểm tra nếu server có Postfix rồi thì remove đi

    Tại sao chúng ta lại remove bản posfix có sẵn hoạc yum của CentOS,default chưa có compile module pos mysql.

    Check bằng command:

    postconf -m

    Check trong kết quả trả về sẽ ko có mysql, nếu có mysql thì không cần phải remove và không cần phải thực hiện bước 3 ( trên centos 6.x thì có thể bạn không cần phải thực hiện bước này )

    yum remove postfix

    2. Cài đặt Postfix

    version 2.5.1

    ftp://ftp.cuhk.edu.hk/pub/packages/mail-server/postfix/official/postfix-2.5.1.tar.gz

    Xả nén file source. Vào thư mục source vừa xả nén.

    Chaỵ command:

    make -f Makefile.init makefiles \
    CCARGS=’-DUSE_SASL_AUTH -I/usr/include/sasl \
    -DHAS_MYSQL -I/usr/include/mysql’ \
    AUXLIBS=’-L/usr/lib64 -lldap -L/usr/lib64 -llber -L/usr/lib64 -lsasl2 \
    -L/usr/lib64/mysql -lmysqlclient -lz -lm’

    Lưu ý chỗ bold, chỗ đó là khai báo lib của CentOS, ở đây LM build trên CentoS 64bit, vì thế phaỉ khai báo là /usr/lib64 nếu bạn dung 32bit thì thế /usr/lib64 thành /usr/lib

    Tiến hành Compile:

    make

    Tiến hành install

    make install

    Lưu ý: khi install nó sẽ hỏi các option và dir ở đâu, default nên enter hết để cho các phần sau map đúng các dir của postfix.

    Sau khi xong, tiến hành test

    postfix start

    postconf –m

    Sẽ thấy có dòng chứa mysql.

    3. Thiết lập Mysql DB lưu trữ domain và account email.

    Tạo database tên là mailserver

    Login vào mysql console:

    mysql -u root -p

    Tạo user mailserver với password vnlamp

    mysql>create database mailserver;

    GRANT SELECT ON mailserver.* TO mailuser@localhost
    IDENTIFIED BY ‘vnlamp’;
    Exit

    4. Tạo DB Table

    Khi bạn thấy ghi là có mysql> nghĩa là ta đang log vào console của mysql.

    Tạo bảng chứa domain

    mysql>
    CREATE TABLE `virtual_domains` (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL
    );

    Tạo bảng chứa user

    mysql>
    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
    );

    Tạo bảng chứa alias

    mysql>
    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
    );

    5. Cấu hình và tạo các file map cho Postfix

    Tạo file /etc/postfix/mysql-virtual-mailbox-domains.cf với nội dung

    user = mailuser
    password = vnlamp
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT 1 FROM virtual_domains WHERE name=’%s’

    Thiết lập thông số cho postfix, chạy command này nó sẽ add line vào file /etc/postfix/main.cf của postfix

    postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

    Tạo domain test cho db, chạy command

    mysql>
    INSERT INTO virtual_domains (id, name) VALUES (1, ‘example.com’);
    exit

    Thiết lập cho postfix vdomain examaple.com sẽ lấy từ file, chạy command

    postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

    Tạo vmailbox map, chạy command

    groupadd -g 5000 vmail
    useradd -g vmail -u 5000 vmail -d /home/vmail -m

    Khai báo owner, chạy command

    postconf -e virtual_uid_maps=static:5000
    postconf -e virtual_gid_maps=static:5000

    Tạo một user thử, Lưu ý kỹ phần này

    mysql>
    INSERT INTO virtual_users (id, domain_id, user, password)
    VALUES (1, 1, ‘test’, MD5(‘vnlamp’));

    Tạo record trung gian với bảng trung gian, Lưu ý kỹ phần này

    mysql>
    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 với nội dung

    user = mailuser
    password = vnlamp
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT 1 FROM view_users WHERE email=’%s’

    Thiết lập postfix dùng vmailbox, chạy command

    postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

    postmap -q test@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

    Thiết lập alias , Lưu ý kỹ phần này

    mysql>
    INSERT INTO virtual_aliases (id, domain_id, source, destination)
    VALUES (1, 1, ‘test’, ‘test@example.com’),
    (2, 1, ‘test’, ‘test_alias@yahoo.com’);

    Tạo bảng trung gian Lưu ý kỹ phần này

    mysql>
    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;

    Tạo file /etc/postfix/mysql-virtual-alias-maps.cf với nội dung

    user = mailuser
    password = vnlamp
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT destination FROM view_aliases WHERE email=’%s’

    Thiết lập postfix user của domain nào cần alias

    postmap -q test@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

    Tạo file /etc/postfix/mysql-email2email.cf với nội dung

    user = mailuser
    password = vnlamp
    hosts = 127.0.0.1
    dbname = mailserver
    query = SELECT email FROM view_users WHERE email=’%s’

    Rồi chạy command:

    postmap -q test@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

    Security:

    chgrp postfix /etc/postfix/mysql-*.cf
    chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

    7. Cấu hình Dovecot

    Thêm dòng này vào file /etc/postfix/master.cf

    dovecot unix – n n – - pipe flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient}

    Restart Postfix

    postfix reload

    Thiết lập postfix sử dụng dovecot như là transport, chạy command

    postconf -e virtual_transport=dovecot
    postconf -e dovecot_destination_recipient_limit=1

    Edit file /etc/dovecot.conf

     

    protocols = imap imaps pop3 pop3s

    disable_plaintext_auth = no

    mail_location = maildir:/home/vmail/%d/%n

    namespace private {
    separator = .
    prefix = INBOX.
    inbox = yes
    }

    auth default {
    mechanisms = plain login

    passdb sql {
    args = /etc/dovecot-sql.conf
    }

    userdb static {
    args =uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
    }

    user = root
    socket listen {
    master {
    path = /var/run/dovecot/auth-master
    mode = 0600
    user = vmail
    }
    client {
    path = /var/spool/postfix/private/auth
    mode = 0660
    }
    }
    }

    dict {
    }

    Taọ file /etc/dovecot-sql.conf với nội dung

    driver = mysql
    connect = host=127.0.0.1 dbname=mailserver user=mailuser password=vnlamp
    default_pass_scheme = PLAIN-MD5
    password_query = SELECT email as user, password FROM view_users WHERE email=’%u’;

    Restart Dovecot:

    service dovecot restart

    Hoặc /etc/init.d/dovecot restart

    Lưu ý cần theo dõi tail -f /var/log/maillog , dovecot hay postfix có error thì nó sẽ báo.

    dovecot: Dovecot v1.0.rc15 starting up
    dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)

    Module auth-mysql đã được load.

    Security

    chgrp vmail /etc/dovecot/dovecot.conf
    chmod g+r /etc/dovecot/dovecot.conf

    8. Setup SSL/SMTP cho Postfix/Dovecot

    mkdir -p /etc/ssl/private/

    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

    Cấu hình các cilent cho phép relay mail không cần đăng nhập, chạy command

    postconf -e mynetworks=192.168.2.0/24

    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

    Lời kết:

    Lưu ý các dòng In đỏ và các dòng có ghi lưu ý

    Tạo thêm domain thì:

    Trong mysql console chạy

    INSERT INTO virtual_domains (name) VALUES (‘’);

    Khai báo domain mới với postfix

    postmap -q mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

    Còn tạo user mới thì tương tự, xem các dòng màu đỏ.

    Hãy liên hệ với chúng tôi:

    ITtoday

    VP Miền Bắc: 124 Minh Khai, Hai Bà Trưng, Hà Nội - ĐT: 0986.973.209 / 0962.604.887 / 01234.08.1987
    VP Miền Nam: 53/21 Đường 18, Khu phố 5, Phường Ninh Chung,  Quận Thủ Đức, TP Hồ Chí Minh. - ĐT: 0976.413.635
    Email: itotdayvn@gmail.com
    Website: www.ittoday.vn

    Chúc các bạn thành công!