Postfix trên CentOS Stream 9: Bí kíp setup Mail Server mượt mà, thoát kiếp ‘vào hòm Spam’

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Vấn đề thực tế khi triển khai Mail Server trên Linux

Đã bao giờ anh em “toát mồ hôi hột” vì script gửi thông báo từ ứng dụng chạy vù vù ở máy local, nhưng khi đẩy lên server CentOS Stream 9 thì mail biệt tăm biệt tích? Cay đắng hơn, mail gửi đi được nhưng lại nằm chễm chệ trong hòm thư SPAM của khách hàng kèm lời cảnh báo đỏ lừ: “Email này chưa được mã hóa”.

Hồi đầu năm, mình nhận task setup hệ thống giám sát (monitoring) cho một đối tác trên nền CentOS Stream 9. Mọi thứ từ Zabbix đến Prometheus đều ngon lành cho đến khi cấu hình cảnh báo. Cứ tưởng cài Postfix rồi “quất” lệnh systemctl start là xong, ai dè thực tế phũ hơn nhiều. Các ông lớn như Gmail hay Outlook hiện cực kỳ khắt khe. Nếu server thiếu mã hóa TLS hay bản ghi DNS lệch chuẩn, 99% mail sẽ bị từ chối ngay từ “vòng gửi xe”.

Tại sao Mail Server của bạn bị các ‘ông lớn’ từ chối?

Sau vài đêm thức trắng soi log tại /var/log/maillog, mình đúc kết được 4 lý do khiến Mail Server trên CentOS Stream 9 thường xuyên bị chặn:

  • Giao thức Plain text lỗi thời: Gửi mail không mã hóa TLS giống như gửi một tấm bưu thiếp công khai. Google sẽ gắn cờ rủi ro ngay lập tức.
  • SMTP Auth lỏng lẻo: Server không yêu cầu xác thực rất dễ biến thành “Open Relay”. Hacker sẽ lợi dụng IP của bạn để spam mail rác toàn cầu, khiến IP vào blacklist chỉ sau vài giờ.
  • Rào cản từ Firewalld và SELinux: CentOS Stream 9 bảo mật rất chặt. Đôi khi dịch vụ đã chạy nhưng port 25, 465 hoặc 587 vẫn bị chặn cứng, hoặc SELinux không cho phép Postfix đọc file certificate.
  • DNS ‘trống huếch’: Thiếu các bản ghi then chốt như A, MX, SPF là lý do hàng đầu khiến mail bị đánh giá là giả mạo.

Nên chọn phương án triển khai nào?

Đứng trước bài toán này, anh em DevOps thường cân nhắc 3 hướng đi chính:

  1. Dùng Relay trung gian (SendGrid, Mailgun): Tốc độ nhanh, tỷ lệ vào Inbox cao nhưng tốn phí. Nếu gửi mail hệ thống số lượng lớn (khoảng 50.000 mail/tháng), chi phí sẽ là một con số đáng kể.
  2. Dùng Mail Suite (iRedMail, Zimbra): Đầy đủ tính năng nhưng cực kỳ nặng máy. Với các VPS RAM 1-2GB, cài những bộ này chẳng khác nào một cực hình cho hệ thống.
  3. Postfix thuần túy: Đây là “chân ái” cho dân kỹ thuật. Nó nhẹ, tùy biến linh hoạt và giúp bạn làm chủ hoàn toàn luồng đi của email.

Triển khai Postfix với TLS trên CentOS Stream 9

Dưới đây là quy trình thực tế mình đã áp dụng để build hệ thống mail đạt điểm 10/10 trên Mail-Tester.

1. Chuẩn bị hệ thống

Đầu tiên, hãy đặt hostname chuẩn FQDN. Ở đây mình ví dụ domain là mail.itfromzero.vn.

hostnamectl set-hostname mail.itfromzero.vn
echo "127.0.0.1 mail.itfromzero.vn" >> /etc/hosts

2. Cài đặt Postfix và SASL

Sử dụng dnf để cài đặt. Mình cài thêm cyrus-sasl để xử lý xác thực người dùng mượt mà hơn.

dnf update -y
dnf install postfix cyrus-sasl cyrus-sasl-plain mailx -y

3. Tối ưu cấu hình main.cf

Thay vì dùng file mặc định dài dằng dặc, hãy backup lại và chỉ tập trung vào các tham số cốt lõi. Đây là cấu hình tối giản nhưng cực hiệu quả:

cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
vi /etc/postfix/main.cf

Anh em cập nhật các dòng sau để xác định danh tính server:

myhostname = mail.itfromzero.vn
mydomain = itfromzero.vn
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/

4. Kích hoạt bảo mật TLS

Mã hóa là bắt buộc nếu không muốn mail bị vào spam. Nếu có chứng chỉ từ Let’s Encrypt thì tuyệt nhất. Lưu ý nhỏ: Hãy đảm bảo user postfix có quyền đọc thư mục chứa key.

# Cấu hình TLS tăng bảo mật
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtp_tls_loglevel = 1

5. Mở ‘cửa’ cho Firewall và cấu hình SELinux

Bước này cực kỳ quan trọng. Nếu quên mở port, mail sẽ kẹt ở hàng đợi vĩnh viễn.

firewall-cmd --permanent --add-service=smtp
firewall-cmd --permanent --add-port={587,465}/tcp
firewall-cmd --reload

Riêng với SELinux, nếu bạn lưu chứng chỉ ở thư mục riêng, cần gán đúng label cho nó:

setsebool -P postfix_local_write_mail_spool on
chcon -t cert_t /path/to/your/cert.pem

6. Khởi động và kiểm tra kết quả

Bật dịch vụ và kiểm tra xem port 25 đã “lắng nghe” chưa bằng lệnh netstat.

systemctl enable --now postfix
netstat -plnt | grep :25

Thử gửi một mail test xem kết quả ra sao:

echo "Noi dung test TLS tu CentOS 9" | mail -s "Postfix Test" [email protected]

Kinh nghiệm ‘xương máu’ khi vận hành

Lần migrate hệ thống từ CentOS 8 sang CentOS Stream 9 cho khách hàng, mình học được bài học đắt giá về Reverse DNS (PTR Record). Dù cấu hình Postfix chuẩn đến đâu, nếu IP server không trỏ ngược về đúng domain mail.itfromzero.vn, Gmail vẫn sẽ thẳng tay từ chối mail của bạn.

Một mẹo nhỏ là luôn để cửa sổ terminal chạy lệnh tail -f /var/log/maillog trong lúc debug. Mọi lỗi về xác thực hay kết nối đều hiện rõ mồn một tại đây. Đừng đoán mò, hãy để log dẫn đường.

Hy vọng những chia sẻ này giúp anh em tự tin hơn khi dựng Mail Server trên các bản Linux đời mới. Có lỗi gì khó nhằn, cứ để lại comment bên dưới nhé!

Share: