Hướng dẫn thiết lập SPF DKIM DMARC cho VPS SMTP

Gửi email từ VPS mà không có SPF, DKIM, DMARC thì khác nào gửi thư không có dấu, không có chữ ký. Phía nhận (Gmail, Outlook, hoặc mail server nội bộ) sẽ nghi ngờ ngay từ đầu, đẩy thư vào spam hoặc từ chối thẳng. Bài này mình sẽ hướng dẫn bạn thiết lập đủ ba bản ghi DNS này trên VPS SMTP, kèm lệnh kiểm tra để chắc chắn record đã có hiệu lực trước khi gửi thư thật.
Bài viết áp dụng cho các VPS Linux chạy mail server phổ biến như Postfix, Exim, hoặc PowerMTA. Môi trường mình dùng để ví dụ là Ubuntu 24.04 LTS với Postfix, nhưng phần tạo bản ghi DNS thì dùng chung cho mọi hệ thống.
Yêu cầu trước khi bắt đầu
- Một VPS đã cài sẵn mail server (Postfix, Exim, hoặc PowerMTA) và gửi được mail cơ bản qua port 25.
- Quyền truy cập vào trang quản lý DNS của tên miền bạn dùng để gửi mail. Thường là trên trang của nhà đăng ký tên miền hoặc nhà cung cấp DNS.
- Biết tên miền chính và hostname của VPS. Ví dụ: tên miền là
example.com, hostname làmail.example.com. - Truy cập root hoặc user có quyền
sudotrên VPS để xem key DKIM nếu cần.
Vì sao SPF, DKIM, DMARC lại quan trọng với VPS SMTP
Ba bản ghi này tạo thành bộ ba xác thực email. SPF khai báo server nào được phép gửi mail cho tên miền của bạn. DKIM ký số từng email để chứng minh thư không bị sửa đổi trên đường truyền. DMARC hướng dẫn server nhận xử lý thư khi kiểm tra SPF hoặc DKIM thất bại.
Nếu thiếu một trong ba, tỷ lệ email rơi vào spam tăng rõ rệt. Nhiều hệ thống lớn như Gmail còn có chính sách yêu cầu cả DMARC mới cho phép gửi số lượng lớn. Với VPS dùng để gửi email marketing hoặc transactional, việc này không thể bỏ qua.
Một điểm nữa là các bản ghi này giúp bảo vệ thương hiệu. Kẻ xấu có thể giả mạo tên miền của bạn để lừa đảo khách hàng. DMARC với policy quarantine hoặc reject sẽ chặn phần lớn email giả mạo đó.
Bước 1 - Tạo bản ghi SPF
SPF (Sender Policy Framework) liệt kê các địa chỉ IP hoặc hostname được phép gửi email thay mặt cho tên miền. Bản ghi này là một dòng TXT trong DNS.
Với một VPS SMTP có IPv4 tĩnh, bản ghi SPF cơ bản trông như sau:
v=spf1 ip4:103.57.120.10 include:_spf.google.com ~all
Trong đó:
ip4:103.57.120.10- thay bằng địa chỉ IPv4 thật của VPS bạn. Nếu có nhiều IP, khai báo thêm nhiều dòngip4:.include:_spf.google.com- chỉ cần khi bạn gửi mail qua Google Workspace. Không dùng thì bỏ đi.~all- soft fail, nghĩa là mail từ nơi khác vẫn được chấp nhận nhưng bị đánh dấu. Nếu chắc chắn chỉ gửi từ VPS, dùng-allđể strict hơn.
Bạn tạo một bản ghi TXT với tên là tên miền gốc (ví dụ example.com) và giá trị là chuỗi SPF ở trên. Với PowerMTA hoặc hệ thống gửi nhiều IP, cần khai báo hết các IP đó trong SPF.
Kiểm tra SPF:
dig TXT example.com +short
Kết quả sẽ hiện dòng SPF bạn vừa tạo. Thường mất 5-15 phút để DNS propagation hoàn tất.
Bước 2 - Tạo cặp key DKIM và bản ghi DKIM
DKIM (DomainKeys Identified Mail) dùng cặp khóa public/private. Khóa private nằm trên VPS để ký email đi. Khóa public đặt trong DNS để server nhận kiểm tra.
Với Postfix, bạn dùng tiện ích opendkim. Cài đặt:
sudo apt update
sudo apt install opendkim opendkim-tools
Tạo thư mục cho key và sinh cặp khóa với selector mail:
sudo mkdir -p /etc/opendkim/keys/example.com
sudo opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s mail -v
Lệnh trên tạo ra hai file: mail.private và mail.txt. File mail.txt chứa bản ghi DKIM cần thêm vào DNS. Xem nội dung:
sudo cat /etc/opendkim/keys/example.com/mail.txt
Output dạng:
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..." )
Bạn copy toàn bộ phần trong ngoặc, bỏ dấu ngoặc kép và tạo bản ghi TXT trong DNS với tên mail._domainkey. Giá trị là chuỗi bắt đầu bằng v=DKIM1; h=sha256; k=rsa; p=....
Với PowerMTA, cấu hình DKIM nằm trong file /etc/powerpmta/config. Bạn có thể dùng công cụ dkimutil đi kèm để sinh key tương tự. Phần public key vẫn đưa lên DNS như trên.
Nếu dùng Exim, có thể dùng exim-gencert hoặc tự sinh bằng openssl, rồi cấu hình trong file exim.conf với tùy chọn dkim_domain và dkim_selector.
Kiểm tra DKIM:
dig TXT mail._domainkey.example.com +short
Nếu hiện chuỗi bắt đầu bằng "v=DKIM1; h=sha256; k=rsa; p= thì đã đúng. Sau đó bạn cần kích hoạt opendkim trong Postfix bằng cách sửa file /etc/postfix/main.cf:
sudo postconf -e "smtpd_milters = inet:localhost:8891"
sudo postconf -e "non_smtpd_milters = inet:localhost:8891"
sudo postconf -e "milter_default_action = accept"
Và sửa file /etc/opendkim.conf để trỏ đúng thư mục key:
KeyTable file:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
InternalHosts refile:/etc/opendkim/trusted.hosts
Tạo file key.table:
sudo nano /etc/opendkim/key.table
Nội dung:
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private
Tạo file signing.table:
sudo nano /etc/opendkim/signing.table
Nội dung:
*@example.com mail._domainkey.example.com
Tạo file trusted.hosts:
sudo nano /etc/opendkim/trusted.hosts
Nội dung:
127.0.0.1
localhost
103.57.120.10
Thay IP bằng IP thật của VPS. Khởi động lại cả hai dịch vụ:
sudo systemctl restart opendkim
sudo systemctl restart postfix
Bước 3 - Tạo bản ghi DMARC
DMARC (Domain-based Message Authentication, Reporting & Conformance) cho server nhận biết cách xử lý thư khi SPF hoặc DKIM không khớp. Bản ghi DMARC nằm ở subdomain _dmarc.
Tạo bản ghi TXT với tên _dmarc và giá trị:
v=DMARC1; p=quarantine; rua=mailto:[email protected]; pct=100; adkim=s; aspf=s
Giải thích từng tag:
v=DMARC1- phiên bản chuẩn, bắt buộc.p=quarantine- policy khi thất bại.quarantineđưa vào spam,rejecttừ chối,nonechỉ theo dõi.rua=mailto:[email protected]- địa chỉ nhận báo cáo tổng hợp DMARC. Thay bằng email bạn theo dõi được.pct=100- áp dụng cho rất cao email. Có thể giảm xuống để thử nghiệm dần.adkim=svàaspf=s- chế độ strict cho cả DKIM và SPF. Nếu mail của bạn thay đổi đường dẫn hoặc gửi qua nhiều server, dùngr(relaxed) sẽ an toàn hơn.
Mình khuyên bắt đầu với p=none trong 1-2 tuần đầu, xem báo cáo rồi mới chuyển sang quarantine. Chuyển thẳng sang reject khi chưa kiểm tra kỹ có thể làm mất mail hợp lệ.
Kiểm tra DMARC:
dig TXT _dmarc.example.com +short
Kết quả phải hiện dòng DMARC vừa tạo.
Kiểm tra tổng thể và gửi thử
Sau khi có đủ ba bản ghi, bạn kiểm tra lại toàn bộ bằng lệnh:
dig TXT example.com +short
dig TXT mail._domainkey.example.com +short
dig TXT _dmarc.example.com +short
Tiếp theo, gửi một email thử từ tài khoản trên VPS đến một địa chỉ Gmail hoặc Outlook mà bạn kiểm soát. Sau đó xem header của email nhận được. Tìm các dòng:
Authentication-Results: spf=pass
Authentication-Results: dkim=pass
Authentication-Results: dmarc=pass
Nếu cả ba đều pass, bạn đã hoàn tất. Nếu một trong ba fail hoặc neutral, kiểm tra lại từng bản ghi theo hướng dẫn ở trên.
Có thể dùng công cụ trực tuyến như mail-tester.com để chấm điểm từ 10 và xem chi tiết lỗi còn thiếu. Gửi thử đến địa chỉ do công cụ cấp, rồi mở báo cáo. Đây là cách nhanh nhất để biết mình còn thiếu gì.
Xử lý lỗi thường gặp
Lỗi 1: SPF fail do thiếu IP. Nếu bạn gửi mail qua nhiều VPS hoặc có thêm server phụ, phải khai báo hết IP trong SPF. Kiểm tra log mail server:
sudo tail -f /var/log/mail.log
Xem địa chỉ IP thực sự dùng để gửi, rồi bổ sung vào SPF.
Lỗi 2: DKIM không ký được mail. Kiểm tra opendkim có chạy không:
sudo systemctl status opendkim
Nếu lỗi permission, sửa quyền cho thư mục key:
sudo chown -R opendkim:opendkim /etc/opendkim/keys
Lỗi 3: DMARC policy quá chặt làm mất mail. Kiểm tra báo cáo DMARC tại địa chỉ rua bạn khai báo. Nếu thấy nhiều mail hợp lệ bị fail, chuyển aspf=s và adkim=s sang r, hoặc đổi p=quarantine về p=none tạm thời.
Lưu ý thêm cho VPS gửi email số lượng lớn
Nếu bạn dùng VPS để gửi email marketing hoặc transactional số lượng lớn, SPF, DKIM, DMARC là điều kiện cần nhưng chưa đủ. Bạn cần thêm:
- Bản ghi
rDNS(PTR) trỏ ngược từ IP về hostname. Đây là yêu cầu bắt buộc của hầu hết server nhận lớn. - Địa chỉ gửi (envelope from) dùng tên miền riêng của bạn, không dùng IP thuê ngoài.
- Theo dõi tỷ lệ bounce, tránh gửi đến địa chỉ không tồn tại. Tỷ lệ bounce cao làm reputation tụt nhanh.
VPS của bạn cần có VPS SMTP IPv4 sạch để tránh bị blacklist từ trước do IP dùng chung. Một IP riêng, chưa từng gửi spam sẽ dễ xây dựng reputation hơn nhiều so với IP đã bị nhiều người dùng chung làm hỏng.
Khi đã cấu hình đủ bộ ba SPF, DKIM, DMARC, bạn có thể kiểm tra thêm khả năng gửi qua VPS gửi email marketing với lượng thư tăng dần để làm nóng IP. Bắt đầu từ vài trăm thư mỗi ngày, tăng dần trong 2-3 tuần.
Nếu cần thuê một máy chủ có IPv4 riêng tại Việt Nam để gửi email, bạn có thể tham khảo VPS Linux full root của thueVPS, gói nhỏ nhất cũng đã có IPv4 tĩnh và băng thông trong nước 100 Mbps trên port 1 Gbps, đủ để chạy Postfix hoặc PowerMTA ổn định.
Câu hỏi thường gặp
Thiếu DMARC có gửi được email không?
Vẫn gửi được, nhưng tỷ lệ vào inbox thấp hơn rõ rệt. Nhiều hệ thống lớn như Gmail bắt đầu yêu cầu DMARC cho người gửi số lượng lớn. Nếu gửi ít, thiếu DMARC vẫn chạy nhưng không nên.
SPF nên dùng ~all hay -all?
Nếu bạn chắc chắn chỉ gửi mail từ các IP đã khai báo, dùng -all để chặt chẽ. Nếu có thể phát sinh thêm nguồn gửi trong tương lai, dùng ~all an toàn hơn, tránh mất mail hợp lệ.
Bao lâu thì bản ghi DNS có hiệu lực?
Thường 5-15 phút nhưng có thể lên tới 24 giờ tùy nhà cung cấp DNS. Kiểm tra bằng lệnh dig hoặc công cụ trực tuyến, khi thấy record hiện ra là dùng được.
DMARC policy nào nên bắt đầu?
Bắt đầu với p=none để theo dõi báo cáo 1-2 tuần. Khi thấy tỷ lệ pass cao trên 95%, chuyển lên p=quarantine, sau đó mới cân nhắc p=reject.
Có cần rDNS ngoài SPF DKIM DMARC không?
Có. rDNS (PTR record) là yêu cầu gần như bắt buộc cho mọi mail server. Thiếu rDNS, nhiều server nhận sẽ từ chối thẳng dù SPF, DKIM, DMARC đều pass.
Bài viết liên quan
- Hướng dẫn cài dịch vụ email trên VPS thuê tại thueVPS
- Gửi email transactional trên VPS với Postfix relay
- Cách cấu hình rDNS cho VPS gửi mail chuẩn 2026
- Cách cấu hình DNS record A, CNAME, MX, TXT cho tên miền


