BÀI VIẾT

Hướng dẫn cài đặt và cấu hình máy chủ Email với Exim, Roundcube và Dovecot trên CentOS 7

4.8K
author Tuấn Ngọc Nguyễn - 2022-07-01 10:22:42 (GMT+7)

Giới thiệu

Ngày nay, email đóng một vai trò vô cùng quan trọng trong công việc và đời sống hàng ngày. Nhằm tăng sự thuận tiện, bảo mật và độ chuyên nghiệp thì nhiều ngươi dùng doanh nghiệp và cá nhân đã lựa chọn Mail Server (Máy chủ email) để nhận gửi, quản lý email của mình.

Khi nhắc đến các mail server thì ta sẽ nghĩ đến Exim, Postfix, Sendmail và Qmail. Trong bài ngày hôm nay mình sẽ cùng các bạn đi qua các bước sử dụng Exim để tạo ra một máy chủ Email cho riêng mình.

Yêu Cầu

  • Hệ thống CentOS 7
  • Quyền root
  • Đã có DNS, Domain

Bước 1: Thiết lập hostname và DNS Records

1. DNS Record:

Ở bước DNS Records sẽ có một chút trở ngại vì mỗi nhà cung cấp sẽ có một giao diện cấu hình riêng nhưng chung quy lại đều sẽ có 4 mục để chúng ta thay đổi:

  • A Record: Đây là một bản ghi mà liên kết một tên tới một địa chỉ IP tĩnh . Ví dụ như bạn đăng nhập một cổng web (web portal) tại example.com và tạo một A Record cho mail tại 192.168.0.1, điều này sẽ tạo một địa chỉ mail.example.com mà sử dụng được trên Internet. Tuy vậy, mailserver vẫn sẽ không biết gửi mail tới đâu, lúc này MX Record được sử dụng. Nhập địa chỉ IP tĩnh của server của bạn
  • MX Record: Bản ghi này sẽ nói với các mail server khác rằng "gửi mail tới mail.example.com à ? Gửi vào server này nhé". Điều đó đồng nghĩa rằng bản ghi định vị mail server cho một tên miền cụ thể nào đó. Nhập tên mail server
  • PTR Record (Pointer record translate): Bản ghi PTR là một bản ghi tra cứu ngược. Thay vì tra cứu từ tên sang địa chỉ IP, nó sẽ tra cứu ngược lại. Một số máy chủ mail chỉ tin tưởng nhận thư của bạn khi mà họ có thể tuy ngược DNS. Đây cũng là một trong những yếu tố để đánh giá thư có phải là spam hay không. Nhập tên mail server
  • TXT Record: Bản record sẽ cho nhập các ghi chú chứa thông tin cho các nguồn bên ngoài tên miền của các bạn. Có thể sử dụng cho nhiều mục đích như xác thực chủ sỡ hữu, bảo mật, phòng ngừa email spam. Nhập TXT Record

Sau khi hoàn thành thì bạn sẽ có một cấu hình hoàn chỉnh như sau: Record final config

2. Hostname

Bây giờ bạn cần phải chắc chắn rằng hostname của mình đã được cài đặt đúng cách. Ở bước cấu hình DNS, ta đã cài A record = mail.example.com rồi, vì thế nên ta cũng sẽ đặt hostname là mail.example.com luôn.

bash (root)
hostnamectl set-hostname mail.example.com 
domainname mail.example.com

Đồng thời bạn cũng sẽ phải chỉnh sửa địa chỉ IP đúng với hostname trong etc/hosts :

bash (root)
nano /etc/hosts

Hãy thêm địa chỉ IP và hostname, ví dụ như sau:

/etc/hosts
192.168.0.1 mail.example.com

Cuối cùng ta sẽ cài đặt EPEL repo và cập nhật server.

bash (non-root)
sudo yum -y install epel-release
sudo yum -y update

Bước 2: Thiết lập tường lửa.

  1. Để tăng tính bảo mật, bạn nên đóng tất cả các port và chỉ mở port của email mà thôi. Ngoài ra thay đổi cổng SSH cũng rất cần thiết.
bash (non-root)
systemctl start firewalld 
systemctl enable firewalld
  1. Tắt SeLinux bằng cách chuyển enforcing sang trạng thái disable trong File cấu hình SeLinux
bash (root)
nano /etc/selinux/config
  1. Đổi cổng SSH trong file /etc/ssh/sshd_config. Tìm tới dòng #Port 22. Xoá dấu # và thay số 22 thành cổng port SSH của bạn (Điều này cũng có nghĩa bạn sẽ cần mở cổng này bằng firewalld).

Mở cổng 22 trên firewall

bash (root)
firewall-cmd --zone=public --add-port=22/tcp --permanent

Mở file sshd config

bash (root)
nano /etc/ssh/sshd_config
  1. Sau khi hoàn thành các bước trên. bạn cần khởi động lại SSH
bash (non-root)
systemctl restart sshd
  1. Thêm địa chỉ IP vào whitelist (Hay thay IP 192.168.0.1 thành IP của bạn)
bash (non-root)
firewall-cmd --zone=trusted --add-source=192.168.0.1 --permanent
  1. Mở cổng Pop3, Imap, SMTP
bash (non-root)
firewall-cmd --zone=public --add-service=pop3 --permanent 
firewall-cmd --zone=public --add-service=pop3s --permanent
firewall-cmd --zone=public --add-service=smtp --permanent 
firewall-cmd --zone=public --add-service=smtps --permanent 
firewall-cmd --zone=public --add-service=imap --permanent 
firewall-cmd --zone=public --add-service=imaps --permanent 
  1. Tạo Chứng Chỉ SSL (SSL Certificate) Để thuận tiện cho việc mã hoá, bạn sẽ cần tới cert-bot để tạo chứng chỉ SSL cho email server của bạn. Đầu tiên, hãy dừng firewall.
bash (non-root)
systemctl stop firewalld

Sau đó tải cert-bot và tạo chứng chỉ

bash (non-root)
sudo yum -y install certbot
sudo certbot certonly -d mail.example.com

Lưu ý: Certbot sẽ có 2 loại : Standalone (Sử dụng cổng 443 để tạo chứng chỉ) và Webroot (Sử dụng web service để tạo chứng chỉ). Hãy chọn Standalone.

Hãy đảm bảo file config được trao quyền đầy đủ như sau:

bash (non-root)
chmod a+rx /etc/letsencrypt/live 
chmod a+rx /etc/letsencrypt/archive
chmod 0644 /etc/letsencrypt/live/mail.example.com/privkey.pem

Cuối cùng khởi động lại firewall và bắt đầu bước tiếp theo thôi nào!

bash (non-root)
systemctl start firewalld

Bước 3: Cài đặt và cấu hình Exim mail server

Bây giờ sẽ là bước chính để tạo nên máy chủ mail của bạn. Để có thể tuỳ chỉnh sao sao cho chạy một cách mượt mà và phù hợp với nhu cầu của bạn mình khuyến nghị bạn nên đọc Docs của Exim tại đây. Còn nếu muốn chạy cơ bản thì bạn có thể cấu hình như mình thôi. Bắt đầu nào!

Đầu tiền ta cần tải và cài đặt Exim

bash (root)
yum -y install exim
nano /etc/exim/exim.conf

Lúc này một file cấu hình sẽ xuất hiện, bạn sẽ cần thay đổi một chút như sau:

/etc/exim/exim.conf
# 2 dòng này bạn đặt ở đầu file cấu hình. Nó sẽ ngăn exim viết lại địa chỉ của người gửi và gây lỗi SPF check.
untrusted_set_sender = *
no_local_from_check

# Xoá dấu # ở trước và thêm hostname vào sau.
primary_hostname = mail.example.com

domainlist local_domains = @ : localhost : localhost.localdomain : mail.example.com

hostlist relay_from_hosts = localhost : #có thể thêm địa chỉ IP bạn muốn email được gửi từ đó.

# Thay đổi thành nơi bạn lưu chứng chỉ SSL
tls_certificate = /etc/letsencrypt/live/mail.example.com/fullchain.pem 

tls_privatekey  = /etc/letsencrypt/live/mail.example.com/privkey.pem

# Xoá dấu # nơi có dòng
auth_advertise_hosts = ${if eq {$tls_cipher}{}{}{*}}
#Hãy nhớ xoá dòng trống này nhé: auth_advertise_hosts =

# Ở dưới Local Delivery, cấu hình như dưới

local_delivery:
  driver = appendfile
  directory = $home/Maildir
  maildir_format
  maildir_use_size_file
  delivery_date_add
  envelope_to_add
  return_path_add
# Thêm phần này vào  phần AUTHENTICATION CONFIGURATION (Dòng ~1111)

dovecot_login:   
 driver = dovecot   
 public_name = LOGIN   
 server_socket = /var/run/dovecot/auth-client   
 server_set_id = $auth1 

dovecot_plain:   
 driver = dovecot   
 public_name = PLAIN   
 server_socket = /var/run/dovecot/auth-client   
 server_set_id = $auth1

Lưu lại và thoát khỏi trình chỉnh sửa file. Lúc này ta cần thông báo cho hệ thông rằng ta sẽ sử dụng Exim để gửi mail

bash (non-root)
sudo alternatives --set mta /usr/sbin/sendmail.exim

Để đảm bảo mọi thứ đã chính xác hay thử chạy demo:

bash (non-root)
exim -C /etc/exim/exim.conf -bV

Nó sẽ báo lỗi nếu file cấu hình sai, bạn chỉ cần tìm số dòng và chỉnh lại cho đúng là được. Khi mọi thứ đều chạy tốt, hãy khởi động lại Exim.

bash (non-root)
systemctl start exim 
systemctl enable exim

Bước 4: Cài đặt và cấu hình Dovecot

Dovecot sẽ đóng vai trò xác thực người dùng để cho phép sử dụng máy chủ mail. Tải Dovecot và mở file config 10-ssl.conf của Dovecot để đặt đường dẫn chứng chỉ SSL.

bash (root)
yum -y install dovecot
nano /etc/dovecot/conf.d/10-ssl.conf

Tìm tới dòng ssl_cert và thêm đường dẫn chứng chỉ SSL của bạn vào

/etc/dovecot/conf.d/10-ssl.conf
...
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
...

Và đừng quên phân quyền Khoá SSL .

bash (non-root)
sudo chmod 0644 /etc/letsencrypt/live/mail.example.com/privkey.pem

Tiếp theo ta sẽ cấu hình phần xác thực dovecot. Chúng ta sẽ xác thực bằng SSL.

bash (root)
nano /etc/dovecot/conf.d/10-auth.conf
/ etc/dovecot/conf.d/10-auth.conf
...
#Ta sẽ xoá dấu # và đặt thành no.
disable_plaintext_auth = no
...
#Ta sẽ thêm login vào phía sau
auth_mechanisms = plain login
...
bash (non-root)
sudo nano /etc/dovecot/conf.d/10-mail.conf
/etc/dovecot/conf.d/10-mail.conf
...
#Chỉ cần xoá dấu # là được
mail_location = maildir:~/Maildir
...
bash (non-root)
sudo nano /etc/dovecot/conf.d/10-master.conf
/etc/dovecot/conf.d/10-master.conf
...
service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  #user = root
}
#Thêm phần này vào dưới service auth-worker (dòng 108)
service auth {
    unix_listener auth-client {
        mode = 0660
        user = exim
    }
}
...

Lưu ý: Trong file cấu hình exim.conf lúc trước, ta đã bật auth_advertise_hosts = ${if eq {$tls_cipher}{}{}{*}}, điều này cho phép ta sử dụng tài khoản CentOS để xác thực cho exim. Nói cách khác thì khi đăng nhập vào mailserver thì ta sẽ sử dụng luôn tài khoản của hệ thống.

  • Khởi động lại Dovecot
bash (non-root)
systemctl start dovecot
systemctl status dovecot
systemctl enable dovecot

Bước 5: Cấu hình DKIM.

DKIM (Domain Keys Identified Mail) có chức năng xác nhận mail gửi tới đến từ đâu, thuộc miền nào nhằm tránh thư rác, thư spam.

DKIM được tích hợp trong exim nên bạn chỉ cần mở file /etc/exim/exim.conf

bash (root)
nano /etc/exim/exim.conf
/etc/exim/exim.conf
...
remote_smtp:
  driver = smtp
  dkim_domain = ${lc:${domain:$h_from:}}
  dkim_selector = email
  dkim_private_key = /etc/letsencrypt/live/mail.example.com/privkey.pem
  dkim_canon = relaxed
...

Khởi động lại Exim

bash (root)
systemctl restart exim

Cấu hình DNS.

  1. Cấu hình MX Record (tạo một nếu DNS của bạn không có).
  • Priority: 1
  • Host : @
  • Points to: @
  1. Tạo một TXT Record cho SPF.
  • Host: @
  • Txt value: v=spf1 a mx ip4:xxx.xxx.x.xx ip6:xxxx:xxxx:xx:xxxx:: ~ all (Bạn sẽ điền Ip của mailserver vào x)
  1. Tạo một TXT Record cho DKIM.
  • Host: x._domainkey
  • Txt value: v=DKIM1; p=<Hãy copy public key bạn tạo bằng certbot vào đây>

Để kiểm tra DKIM đã hoạt động hay chưa thì bạn có thể vào website dưới đây để test.

Bước 6: Thêm tài khoản email và quản lý người dùng

Như đã nhắc ở bước 4, để thêm một tài khoản email, ta cần tạo một tài khoản CentOS và cho vào nhóm người dùng Exim. Giả sử mình tạo một tài khoản example@mail.example.com

bash (non-root)
adduser -g exim -s /usr/sbin/nologin example

Sau đó đặt mật khẩu cho tài khoản example

bash (non-root)
passwd example
Kết quả
Changing password for user example.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

Còn nếu bạn muốn xoá một tài khoản nào đó ?

bash (non-root)
userdel -r example

Bước 7: Cài đặt và cấu hình Webmail bằng Roundcube

Roundcube là một webmail cung cấp cho người dùng GUI (Graphical User Interface) mà người dùng có thể sử dụng các nút bấm, các trình soạn thảo, tạo và xoá thư mục một cách trực quan, không thông qua các lệnh phức tạp.

  1. Tải Nginx, PHP-FPM và MariaDB.
  • Đầu tiên ta sẽ cần cài các package phụ khác để chạy Roundcube bằng cách:
bash (root)
 yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm 
yum install yum-utils 
yum-config-manager --enable remi-php72
yum install nginx php php-fpm php-mcrypt php-cli php-gd php-curl php-xml php-mysql php-mbstring php-pspell php-imagick mariadb-server php-intl
  • Sau khi tải xong, bạn khởi động web server và cho tự động chạy mỗi lần khởi động
bash (root)
systemctl start nginx 
systemctl enable nginx
systemctl status nginx
  • Mở cổng Port 80
bash (root)
systemctl start firewalld
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload 
  • Mở file etc/php.ini, tìm tới dòng có cgi.fix_pathinfo=1, xoá dấu # và chỉnh về 0. Ngoài ra bạn cũng cần đặt timezone ở dòng date.timezone= như sau.
bash (root)
nano /etc/php.ini
/etc/php.ini
...
cgi.fix_pathinfo=0
...
date.timezone="Asia/Ho_Chi_Minh"
  • Lưu và khởi động lại
bash (root)
systemctl start php-fpm 
systemctl enable php-fpm 
systemctl status php-fpm 
  1. Tải Roundcube.

- Bạn có thể lên trang chủ để tải thủ công hoặc sử dụng wget (tại thời điểm viết bài thì bản mới nhất là 1.5.2).

bash (root)
wget -c https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz
  • Giải nén file.
bash (root)
tar xzf roundcubemail-1.5.2-complete.tar.gz 
  • Đổi tên file vừa mới giải nén thành Roundcube và đặt các quyền cho nó
bash (root)
mv roundcubemail-1.5.2 /var/www/html/roundcubemail
chown -R nginx:nginx /var/www/html/roundcubemail/
  1. Cấu hình Database
  • Khởi động Mariadb.
bash (root)
systemctl start mariadb
systemctl enable mariadb
  • MariaDB mặc định không an toàn. Bạn cần chạy một tập lệnh để bảo mật . Bạn sẽ được yêu cầu đặt mật khẩu gốc, xóa người dùng ẩn danh, vô hiệu hóa đăng nhập root từ xa và xóa cơ sở dữ liệu thử nghiệm.
bash (root)
mysql_secure_installation
  • Truy cập và database, lúc này bạn sẽ nhập mật khẩu gốc mà bạn đã tạo trong quá trình chạy tập lệnh ở trên.
bash (root)
mysql -u root -p
  • Tạo database roundcubemail
bash (root)
MariaDB [(none)]> CREATE DATABASE roundcubemail /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
  • Tạo người dùng roundcube với mật khẩu là =213@!#webL.
bash (root)
MariaDB [(none)]> CREATE USER 'roundcube'@'localhost' IDENTIFIED BY '=213@!#webL';
  • Cấp tất cả các quyền cho người dùng mới tạo.
bash (root)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON roundcubemail.* TO 'roundcube'@'localhost';
  • Thoát khỏi trình database
bash (root)
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit
  • Thêm bảng Roundcube vào database
bash (root)
cd /var/www/html/roundcubemail/
mysql -u root -p roundcubemail < SQL/mysql.initial.sql
  1. Cấu hình Server Block cho Roundcube Web Installer

- Tạo một file cấu hình etc/nginx/conf.d/ như sau :

bash (root)
nano /etc/nginx/conf.d/mail.example.com.conf
/etc/nginx/conf.d/mail.example.com.conf
server {
        listen 80;
        server_name mail.example.com;

        root /var/www/html/roundcubemail;
        index  index.php index.html;

        #i# Logging
        access_log /var/log/nginx/mail.example.com_access_log;
        error_log   /var/log/nginx/mail.example.com_error_log;

        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        location ~ ^/(README.md|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {
                deny all;
        }

        location ~ ^/(config|temp|logs)/ {
                deny all;
        }

        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }

        location ~ \.php$ {
                include /etc/nginx/fastcgi_params;
                #fastcgi_pass 127.0.0.1:9000;
                fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
}
  • Bây giờ ta cần thay đổi một số chỗ trong file /etc/php-fpm.d/www.conf cho PHP-FPM
bash (root)
nano /etc/php-fpm.d/www.conf

Thay đổi user sang nginx, đổi đường dẫn listen và đặt quyền sang nginx.

/etc/php-fpm.d/www.conf
...
user=nginx
group = nginx
...
listen = /var/run/php-fpm/php-fpm.sock
...
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
  • Lưu và khởi động lại NginxPHP-FPM
bash (root)
systemctl restart nginx php-fpm
  1. Cài đặt với Roundcube Installer Trước khi cài đặt, bạn cần đặt lại Owner cho thư mục /var/lib/php/session
bash (root)
chown :nginx /var/lib/php/session/

Bây giờ hay truy cập vào http://mail.example.com/roundcubemail/installer Roundcube setup Tiếp theo, bấm phím Next ở cuối cùng để đi tới cài đặt Database và thêm các thông tin chi tiết.

Có khá nhiều thứ để cấu hình cho webmail nên mình chỉ nói một số cái quan trọng mà thôi. Nếu muốn tìm hiểu bạn có thể lên trang chủ của Roundcube để biết thêm chi tiết. (Hầu hết các thông tin cơ bản đều được điền sẵn nếu bạn config đúng như mình).

  • General Configuration: product_name: Đặt tên cho dịch vụ của bạn (ví dụ như Example.com webmail). Roundcube general setup
  • Database setup: Nhập host, tên, tên đăng nhập và mật khẩu mà bạn đặt ở phần tạo bảng Mariadb để kết nối tới database. Roundcube database setup
  • IMAPSMTP: Để localhost nếu bạn sử dụng chung server mà bạn chạy Roundcube

Sau các thay đổi cấu hình, trình cài đặt sẽ tạo cho bạn một file config.inc.php hãy lưu lại ở địa chỉ /var/www/html/roundcubemail/config/. Một số trường hợp roundcube sẽ tự lưu cho bạn như hình dưới. Roundcube create config - Bình thường nếu sử dụng config này thì ta sẽ không gửi được mail bởi vì SMTP chưa xác thực. Thế nên chúng ta cần thêm các dòng sau.

# Đặt hostname
$config['smtp_server'] = 'tls://mail.example.com'; 

# Đặt cổng, mặc định là 587
$config['smtp_port'] = 587; 
$config['smtp_user'] = '%u'; 
$config['smtp_pass'] = '%p'; 
$config['smtp_auth_type'] = 'PLAIN'; 
$config['smtp_auth_cid'] = null; 
$config['smtp_auth_pw'] = null; 
$config['smtp_helo_host'] = ''; 
$config['smtp_timeout'] = 0;

# Trỏ về ssl-certificate
$config['smtp_conn_options'] = array(    'ssl'         => array(      'verify_peer'  => false,      'verify_depth' => 3,      'cafile'       => '/etc/letsencrypt/live/mail.example.com/fullchain.pem ',    ),  );
  • Hãy xoá thư mục installer đi và chắc chắn rằng bạn đã đặt $config['enable_installer'] = false; trong file config.inc.php .
bash (root)
rm /var/www/html/roundcubemail/installer/ -r

Bước 8. Gửi email đầu tiên

Vậy là bạn đã tạo một Web mail bằng Roundcube thành công. Bây giờ bạn có thể sử dụng tài khoản, mật khẩu đã tạo trước đó để đăng nhập vào. http://mail.example.com/ Login to roundcube Như bạn thấy, giao diện của Roundcube vô cùng dễ dùng và tựa như gmail vậy. Để gửi email, bạn bấm vào icon Compose Logined to roundcube Lúc này cửa sổ soạn thư sẽ hiện ra. Bạn cần nhập thông tin người gửi và người nhận, nội dung, ..v...v mailed by roundcube Bây giờ mình sẽ sử dụng phần mềm thứ 3 là Thunderbird để đăng nhập vào tài khoản admin để xem email đã tới chưa nhé !

Việc đăng nhập trên Thunderbird cũng tương tự với Roundcube, bạn chỉ cần nhập đúng tài khoản và mật khẩu đã tạo là được.

Lưu ý: Nếu bạn sử dụng Self-signed certificate thì thunderbird sẽ xuất hiện thông báo thêm ngoại lệ, chỉ cần bấm Add-exception là được.

Login to thunderbird Voila! Email cuối cùng cũng đã tới người nhận thành công. mail transfer success

Kết bài

Vậy là trong bài hôm nay chúng ta đã tạo thành công một Mailserver giống Gmail cho riêng mình bằng Exim. Bên cạnh đó ta sử dụng dovecot để xác thực và Roundcube để làm webmail. Nếu có câu hỏi nào, bạn có thể comment bên dưới để được giải đáp, chúc các bạn thành công.


Bạn có làm được theo hướng dẫn này không?

Bài liên quan

Lệnh kiểm tra ứng dụng được cài bằng gói RPM nào
Lệnh kiểm tra ứng dụng được cài bằng gói RPM nào
Hướng dẫn cấu hình SSH Key trên CentOS 7
Hướng dẫn cấu hình SSH Key trên CentOS 7
Hướng dẫn cài đặt Nginx trên CentOS 7
Hướng dẫn cài đặt Nginx trên CentOS 7

Object Storage

Chuẩn S3, không giới hạn băng thông

Object Storage

Thuê Server Riêng

Chi phí thấp, cấu hình cao

Thuê Server Riêng
Thông tin tác giả
Bình luận

Tính năng đang được phát triển

Đang tải bình luận