이 글이 만드는 것
완전한 단일 도메인 메일 서버입니다: 전송은 Postfix, IMAP과 로컬 배달은 Dovecot, 필터링과 DKIM 서명은 rspamd, 그리고 대형 수신사가 메일을 수신함에 넣을지 아무도 열지 않는 폴더에 넣을지를 결정하는 DNS 레코드 세 개로 구성됩니다. 보내고, 받고, 인증하며, 오픈 릴레이가 아닙니다.
자체 메일 서버 운영은 유행에 뒤떨어진 조언이며 대체로 그럴 만한 이유가 있습니다. 어려운 부분은 소프트웨어가 아니라 전달성입니다. DNS를 잘못 설정하면 가장 세심하게 구성된 Postfix라도 메시지를 그저 허공에 던질 뿐입니다.
시작하기 전에
- R-8 이상. 필터링은 CPU 바운드이며 rspamd는 스팸 공세 중에 제공된 모든 코어를 기꺼이 사용합니다.
- DNS를 제어할 수 있는 도메인, 그리고 전파를 기다리는 인내심.
- 인스턴스 주소에 리버스 DNS를 메일 호스트 이름으로 설정. 패널에서 편집할 수 있으며 필수입니다: 수신자는 확인할 수 없는 발신자를 거부합니다.
- 지원팀에 인스턴스의 아웃바운드 포트 25가 열려 있는지 묻는 티켓 하나. 구축 후가 아니라 구축 전에 물어보십시오.
- 모든 곳에서
mail.example.com. 자신의 것으로 대체하십시오.
1. 호스트 이름과 DNS
hostnamectl set-hostname mail.example.com
apt update && apt full-upgrade -y지금 이 레코드들을 게시하십시오. 인증서 단계에서 A 레코드가 필요하고 서명 단계에서 키를 둘 곳이 필요하기 때문입니다. 표의 값은 각 레코드가 무엇을 하는지에 대한 설명이며 붙여넣을 내용이 아닙니다.
| 레코드 | 이름 | 내용 |
|---|---|---|
| A / AAAA | mail | 패널에 표시된 인스턴스 주소 |
| MX | @ | 10 mail.example.com. |
| TXT | @ | v=spf1 mx -all |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:[email protected]; adkim=s; aspf=s |
| PTR | 인스턴스 주소 | mail.example.com — 패널에서 설정 |
SPF 레코드의 의미: 내 MX 호스트가 내 메일을 보내고, 그 외의 모든 것은 위조입니다. 소프트 폴이 아닌 하드 폴입니다. ~all는 수신자가 스스로 결정을 내리도록 만들기 때문이며, 수신자의 결정은 관대한 쪽이 아닐 것입니다. DMARC는 p=none에서 시작하여 대신 당신을 대신해 어떤 것도 거부되기 전에 일주일 동안 보고서를 수집할 수 있도록 합니다.
2. 인증서
apt install -y certbot
certbot certonly --standalone -d mail.example.com아직 포트 80에서 수신하는 것이 없으므로 standalone 모드가 가장 간단한 경로입니다. 갱신 훅은 데몬이 존재하여 리로드할 수 있게 된 후 마지막에 추가됩니다.
3. Postfix
DEBIAN_FRONTEND=noninteractive apt install -y postfix postfix-pcre dovecot-imapd dovecot-lmtpd rspamd redis-server이제 전송 구성을 설정합니다. 아래의 모든 줄은 의도적입니다; postconf이 해당 위치에 직접 작성하므로 잘못될 편집기가 없습니다:
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"가장 중요한 줄은 smtpd_relay_restrictions입니다. 끝에 reject_unauth_destination가 있어 전체 인터넷이 당신의 머신을 사용하여 메일을 보내는 것을 막습니다. 오픈 릴레이는 몇 시간 안에 블랙리스트에 오르며 허용 사용 정책 위반이기도 합니다.
자체 클라이언트가 보낼 수 있도록 submission 포트를 활성화하고 인증을 요구하며 익명 액세스를 허용하지 않습니다:
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
단일 시스템 사용자 아래의 Maildir에 사서함을 두면 이 구축이 작게 유지됩니다. 사용자와 저장소를 생성합니다:
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/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
}
}사서함을 생성합니다. 명령은 두 번 입력을 요청하며 해시를 기록하고 비밀번호 자체는 기록하지 않습니다:
echo -n "[email protected]:" >> /etc/dovecot/users
doveadm pw -s ARGON2ID >> /etc/dovecot/users
chmod 640 /etc/dovecot/users
chgrp dovecot /etc/dovecot/users5. rspamd와 DKIM
서명 키를 생성한 다음 공개 키를 게시합니다:
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이 명령은 표준 출력에 DNS 레코드를 인쇄합니다. 출력된 그대로 mail._domainkey.example.com에 TXT 레코드로 게시하고, 인용된 세그먼트는 DNS 제공자가 요구하는 방식으로 연결합니다. 그런 다음 /etc/rspamd/local.d/dkim_signing.conf에서 rspamd에 키 위치를 알려줍니다:
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;
use_domain = "header";
sign_authenticated = true;
sign_local = true;밀터를 바인딩하고 웹 인터페이스의 비밀번호를 설정합니다:
echo "bind_socket = \"127.0.0.1:11332\";" > /etc/rspamd/local.d/worker-proxy.inc
rspamadm pw결과 해시를 /etc/rspamd/local.d/worker-controller.inc의 password = "..."에 붙여넣습니다. 포트 11334를 세상에 열지 말고 SSH 터널을 통해 인터페이스에 접근하십시오.
6. 모든 것 시작
systemctl enable --now redis-server rspamd dovecot postfix
postfix check
systemctl --no-pager --failed새 인증서가 두 데몬에 모두 도달하도록 갱신 훅을 추가합니다:
echo "systemctl reload postfix dovecot" > /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh검증
세 가지 테스트가 있습니다. 첫 번째는 로컬, 두 번째는 중요한 것, 세 번째는 블랙리스트에서 벗어나게 해주는 것입니다.
echo | openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com 2>/dev/null | grep -E "subject=|Verify return"그런 다음 새 서버에서 대형 웹메일 제공자의 당신 사서함으로 메시지를 보내고, 수신된 메시지를 열어 원시 헤더를 읽으십시오. 다음 줄을 찾고 있습니다:
Authentication-Results: mx.receiver.example;
dkim=pass [email protected];
spf=pass smtp.mailfrom=example.com;
dmarc=pass (p=NONE) header.from=example.com세 가지가 모두 통과하면 완료입니다. dkim=none는 rspamd가 서명하지 않는다는 뜻이므로 rspamadm configdump dkim_signing을 확인하십시오. spf=fail는 거의 항상 SPF 레코드가 v4 MX 주소만 포함하는데 메시지가 IPv6로 나갔다는 뜻입니다.
마지막으로 릴레이가 아님을 증명하십시오. 다른 머신에서 연결하여 당신이 소유하지 않은 두 도메인 간에 메일을 보내려고 시도합니다:
apt install -y swaks
swaks --to [email protected] --from [email protected] --server mail.example.com올바른 결과는 수신자 단계에서 거부되는 것입니다: 554 5.7.1 Relay access denied. 다른 것은 당일 남용될 머신을 구성한 것이므로 중단하고 3단계를 다시 읽으십시오.
이후
DMARC를 p=none에 일주일 동안 두고 집계 보고서를 읽으십시오. 자신의 서버만 자신의 메일을 서명하는 것으로 표시되면 p=quarantine로 이동하고, 2주 후 p=reject로 이동하십시오. 그동안 /var/vmail에 대해 오프노드 백업을 추가하십시오. 메일은 사용자가 두 번째 사본을 가지지 않는 유일한 것이며, 백업 애드온은 인스턴스와 다른 사이트에 기록하기 때문입니다.