Mười hai bài xây dựng

Một máy chủ thư tự lưu trữ thực sự đến được hộp thư đến

Postfix, Dovecot và rspamd trên một phiên bản, với SPF, DKIM và DMARC được cấu hình chính xác và bước xác minh đọc tiêu đề của phía nhận.

Những gì bài viết này xây dựng

Một máy chủ thư hoàn chỉnh cho một tên miền: Postfix để vận chuyển, Dovecot cho IMAP và phân phối cục bộ, rspamd để lọc và ký DKIM, và ba bản ghi DNS quyết định liệu các nhà cung cấp lớn có đưa thư của bạn vào hộp thư đến hay vào một thư mục không ai mở. Nó gửi, nhận, xác thực và không phải là một relay mở.

Tự chạy thư là lời khuyên không hợp thời và phần lớn là có lý do. Khả năng gửi đến là phần khó, không phải phần mềm. Nếu bạn cấu hình DNS sai, một Postfix được cấu hình cẩn thận nhất trên thế giới sẽ gửi thư thẳng vào hư không.

Trước khi bắt đầu

  • Một R-8 hoặc lớn hơn. Lọc thư tốn CPU và rspamd sẽ vui vẻ sử dụng mọi lõi bạn cấp trong một đợt spam.
  • Một tên miền mà bạn kiểm soát DNS của nó, và kiên nhẫn chờ phân giải.
  • Đặt reverse DNS cho địa chỉ phiên bản tới hostname thư của bạn. Có thể chỉnh sửa từ bảng điều khiển và bắt buộc: người nhận từ chối người gửi không phân giải được.
  • Một ticket gửi tới hỗ trợ để hỏi xem cổng 25 đầu ra có mở trên phiên bản của bạn không. Hãy hỏi trước khi xây dựng, không phải sau đó.
  • mail.example.com trong suốt. Thay thế bằng dữ liệu của bạn.

1. Hostname và DNS

hostnamectl set-hostname mail.example.com
apt update && apt full-upgrade -y

Xuất bản các bản ghi này ngay bây giờ, vì bước chứng chỉ cần bản ghi A và bước ký cần một nơi để đặt khóa. Giá trị trong bảng mô tả chức năng của từng bản ghi, không phải nội dung để dán.

Bản ghiTênNội dung
A / AAAAmailĐịa chỉ phiên bản từ bảng điều khiển
MX@10 mail.example.com.
TXT@v=spf1 mx -all
TXT_dmarcv=DMARC1; p=none; rua=mailto:[email protected]; adkim=s; aspf=s
PTRđịa chỉ phiên bảnmail.example.com — đặt trong bảng điều khiển

Bản ghi SPF nói: máy chủ MX của tôi gửi thư của tôi, mọi thứ khác là giả mạo. Thất bại cứng thay vì thất bại mềm, vì ~all mời người nhận tự quyết định và quyết định của họ sẽ không phải là quyết định hào phóng. DMARC bắt đầu ở p=none để bạn thu thập báo cáo trong một tuần trước khi có bất kỳ điều gì bị từ chối thay mặt bạn.

2. Chứng chỉ

apt install -y certbot
certbot certonly --standalone -d mail.example.com

Chưa có gì lắng nghe trên cổng 80, vì vậy chế độ standalone là cách đơn giản nhất. Các hook gia hạn được thêm vào cuối, khi các daemon đã tồn tại để tải lại.

3. Postfix

DEBIAN_FRONTEND=noninteractive apt install -y postfix postfix-pcre dovecot-imapd dovecot-lmtpd rspamd redis-server

Bây giờ thiết lập cấu hình vận chuyển. Mỗi dòng dưới đây đều có chủ đích; postconf ghi chúng vào đúng chỗ để không có trình soạn thảo nào có thể sai:

postconf -e "myhostname = mail.example.com"
postconf -e "mydestination = localhost"
postconf -e "smtpd_banner = \$myhostname ESMTP"
postconf -e "inet_interfaces = all"
postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem"
postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem"
postconf -e "smtpd_tls_security_level = may"
postconf -e "smtp_tls_security_level = dane"
postconf -e "smtpd_tls_mandatory_protocols = >=TLSv1.2"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_recipient_domain reject_unauth_destination"
postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
postconf -e "virtual_mailbox_domains = example.com"
postconf -e "smtpd_milters = inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
postconf -e "milter_default_action = accept"

Dòng quan trọng nhất là smtpd_relay_restrictions. Nó kết thúc bằng reject_unauth_destination, đó là điều ngăn toàn bộ internet sử dụng máy của bạn để gửi thư của họ. Một relay mở sẽ khiến bạn bị đưa vào danh sách đen trong vòng vài giờ và cũng vi phạm chính sách sử dụng chấp nhận được.

Kích hoạt cổng submission để khách hàng của bạn có thể gửi thư, với yêu cầu xác thực và không cho phép truy cập ẩn danh:

postconf -M submission/inet="submission inet n - y - - smtpd"
postconf -P "submission/inet/syslog_name=postfix/submission"
postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
postconf -P "submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject"

4. Dovecot

Hộp thư ở định dạng Maildir dưới một người dùng hệ thống duy nhất giữ cho bản dựng này nhỏ gọn. Tạo người dùng và bộ lưu trữ:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 -d /var/vmail -m vmail
install -d -o vmail -g vmail -m 700 /var/vmail/example.com

Viết /etc/dovecot/conf.d/99-local.conf:

mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = vmail
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
auth_mechanisms = plain login
disable_plaintext_auth = yes

passdb {
  driver = passwd-file
  args = scheme=ARGON2ID username_format=%u /etc/dovecot/users
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

Tạo một hộp thư. Lệnh yêu cầu nhập hai lần và ghi một băm, không bao giờ là mật khẩu:

echo -n "[email protected]:" >> /etc/dovecot/users
doveadm pw -s ARGON2ID >> /etc/dovecot/users
chmod 640 /etc/dovecot/users
chgrp dovecot /etc/dovecot/users

5. rspamd và DKIM

Tạo khóa ký, sau đó xuất bản nửa công khai:

install -d -o _rspamd -g _rspamd -m 750 /var/lib/rspamd/dkim
rspamadm dkim_keygen -s mail -b 2048 -d example.com -k /var/lib/rspamd/dkim/example.com.mail.key
chown _rspamd:_rspamd /var/lib/rspamd/dkim/example.com.mail.key
chmod 400 /var/lib/rspamd/dkim/example.com.mail.key

Lệnh đó in ra một bản ghi DNS trên đầu ra chuẩn. Xuất bản nó dưới dạng bản ghi TXT tại mail._domainkey.example.com, chính xác như in ra, với các đoạn được trích dẫn nối lại theo cách nhà cung cấp DNS của bạn mong đợi. Sau đó cho rspamd biết nơi khóa nằm, trong /etc/rspamd/local.d/dkim_signing.conf:

path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;
use_domain = "header";
sign_authenticated = true;
sign_local = true;

Liên kết milter và đặt mật khẩu cho giao diện web:

echo "bind_socket = \"127.0.0.1:11332\";" > /etc/rspamd/local.d/worker-proxy.inc
rspamadm pw

Dán băm kết quả vào /etc/rspamd/local.d/worker-controller.inc như password = "...". Truy cập giao diện qua đường hầm SSH thay vì mở cổng 11334 cho thế giới.

6. Khởi động mọi thứ

systemctl enable --now redis-server rspamd dovecot postfix
postfix check
systemctl --no-pager --failed

Thêm một hook gia hạn để chứng chỉ mới đến được cả hai daemon:

echo "systemctl reload postfix dovecot" > /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh

Xác minh

Ba bài kiểm tra. Bài đầu tiên là cục bộ, bài thứ hai là bài quan trọng nhất, bài thứ ba là bài giữ bạn khỏi danh sách đen.

echo | openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com 2>/dev/null | grep -E "subject=|Verify return"

Sau đó gửi một tin nhắn từ máy chủ mới của bạn đến một hộp thư bạn sở hữu tại một nhà cung cấp webmail lớn, mở tin nhắn đã nhận và đọc các tiêu đề thô. Bạn đang tìm kiếm một dòng:

Authentication-Results: mx.receiver.example;
  dkim=pass [email protected];
  spf=pass smtp.mailfrom=example.com;
  dmarc=pass (p=NONE) header.from=example.com

Ba lần vượt qua và bạn đã hoàn thành. dkim=none có nghĩa là rspamd không ký, vì vậy hãy kiểm tra rspamadm configdump dkim_signing. spf=fail gần như luôn có nghĩa là tin nhắn rời đi qua IPv6 trong khi bản ghi SPF của bạn chỉ bao phủ địa chỉ MX v4.

Cuối cùng, chứng minh bạn không phải là relay. Từ bất kỳ máy nào khác, kết nối và thử gửi thư giữa hai tên miền bạn không sở hữu:

apt install -y swaks
swaks --to [email protected] --from [email protected] --server mail.example.com

Kết quả đúng là bị từ chối ở giai đoạn người nhận: 554 5.7.1 Relay access denied. Bất cứ điều gì khác có nghĩa là bạn đã cấu hình một máy sẽ bị lạm dụng trong ngày, và bạn nên dừng lại và đọc lại bước ba.

Sau đó

Để DMARC ở p=none trong một tuần và đọc các báo cáo tổng hợp. Khi chúng chỉ cho thấy máy chủ của riêng bạn ký thư của chính bạn, chuyển sang p=quarantine, sau đó p=reject hai tuần sau đó. Thêm sao lưu ngoài nút cho /var/vmail trong khi bạn làm việc đó, vì thư là thứ mà người dùng không bao giờ có bản sao thứ hai, và tiện ích bổ sung sao lưu của chúng tôi ghi vào một trang web khác với phiên bản.

Sẵn sàng khi bạn cần

Chọn thành phố. Chọn kích thước. Thanh toán bằng coin.

Không có biểu mẫu về bạn là ai, không chờ đợi con người phê duyệt, không gọi điện thoại để xác minh bất cứ điều gì. Hóa đơn được thanh toán và thông tin đăng nhập sẽ vào hộp thư của bạn.