sendmail (2/4) – sendmail with DKIM + SPF + DMARC (for sending)

By | 2020년 4월 5일
Table of Contents

sendmail (2/4) – sendmail with DKIM + SPF + DMARC (for sending)

EC2 인스턴스는 기본적으로 아웃바운드 25번 포트가 막혀있다.

여기 를 참조해서 먼저 AWS 이메일발송 제한을 해제해야 합니다.

DKIM(DomainKeys Identified Mail)

DKIM 서비스를 사용하면 나가는 메일 헤더에 DKIM-Signature를 추가해서 발송하게 됩니다.

수신측 메일 서버에서 DKIM서명이 포함된 메일을 받으면 DNS서버에서 서명을 해독할 공개키를 확인하여 받은 메일이 해당 도메인에서 발송된 것을 확인할 수 있습니다.

설치하기

dkim 패키지를 설치합니다.

sudo apt-get install opendkim opendkim-tools

아래와 같이 설정합니다.

sudo vi /etc/opendkim.conf

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/relaxed

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable

Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256

UserID                  opendkim:opendkim

Socket                  inet:12301@localhost

SOCKET 을 아래 내용으로 변경합니다.

sudo vi /etc/default/opendkim

......
SOCKET="inet:12301@localhost" # listen on loopback on port 12301

sendmail 설정을 수정합니다.

sudo vi /etc/mail/sendmail.mc

......
INPUT_MAIL_FILTER(`opendkim', `S=inet:12301@localhost')dnl
sudo make -C /etc/mail

인증키를 등록합니다.

sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo vi /etc/opendkim/TrustedHosts

127.0.0.1
localhost
192.168.0.1/24

*.skyer9.pe.kr
sudo vi /etc/opendkim/KeyTable

mail._domainkey.skyer9.pe.kr skyer9.pe.kr:mail:/etc/opendkim/keys/skyer9.pe.kr/mail.private
# mail._domainkey.example.net example.net:mail:/etc/opendkim/keys/example.net/mail.private
# mail._domainkey.example.org example.org:mail:/etc/opendkim/keys/example.org/mail.private
sudo vi /etc/opendkim/SigningTable

*@skyer9.pe.kr mail._domainkey.skyer9.pe.kr
# *@example.net mail._domainkey.example.net
# *@example.org mail._domainkey.example.org

인증키를 생성합니다.

cd /etc/opendkim/keys
sudo mkdir skyer9.pe.kr
cd skyer9.pe.kr
sudo opendkim-genkey -s mail -d skyer9.pe.kr
sudo chown opendkim:opendkim mail.private

DNS 에 아래 내용을 등록합니다.

sudo vi mail.txt

여러줄로 분할되어 있으면 한줄로 합칩니다. 단 주의할 것은 " 를 제거하지 말아야 합니다.

"v=DKIM1; k=rsa;...." "p=MIGfMA0GCSqG....." "4GNADCBiQKBgQC....."

위 내용을 DNS 에 추가해 줍니다.

Name: mail._domainkey.skyer9.pe.kr.

Text: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"

opendkim 를 시작합니다.

sudo service opendkim start

hosts 파일에 도메인을 가장 먼저 등록합니다. 이렇게 함으로 해서 현재의 서버 도메인이 skyer9.pe.kr 로 인식하게 됩니다.

sudo vi /etc/hosts

127.0.0.1 skyer9.pe.kr
127.0.0.1 localhost localhost.localdomain skyer9.pe.kr

sendmail 을 재시작합니다.

sudo service sendmail restart

자체 서버에 메일을 발송해도 인증키가 헤더에 포함되므로, 정상적으로 인증키가 발급되어 있는지 확인할 수 있습니다.

sudo apt  install mutt
mkdir ~/.mutt
vi ~/.mutt/muttrc

set from="ubuntu@skyer9.pe.kr"
set realname="ubuntu"
set editor="vim"
echo "메일 내용" | mutt -s "제목" root@skyer9.pe.kr
sudo tail -100 /var/spool/mail/root

SPF(Sender Policy Framework)

네임서버에 등록된 아이피 기반으로 이메일을 필터링합니다.

SPF 등록하기

네임서버에 아래 내용을 등록합니다.

도메인         유형    값
skyer9.pe.kr  TXT     "v=spf1 mx ip4:<메일서버 아이피> ~all"

SPF 상태확인하기

https://mxtoolbox.com/spf.aspx 에 접속해서 정상적으로 등록되었는지 확인할 수 있습니다.

DMARC(Domain-based Message Authentication, Reporting & Conformance)

먼저 SPFDKIM 을 설정합니다.

DNS 에 아래 내용을 추가합니다.
이메일을 수신하는 서버에 제안하는 정책입니다.
테스트 모드는 정책이 실패해도 그대로 이메일은 수신하라는 제안이고, 거부는 이메일을 거부해도 된다는 의미입니다.

DNS Record Type : TXT
Name : _dmarc
# 테스트 모드
Value : v=DMARC1; p=none; pct=100; rua=mailto:dmarc-reports@skyer9.pe.kr
# 거부
Value : v=DMARC1; p=reject; pct=100; rua=mailto:dmarc-reports@skyer9.pe.kr

데이타베이스를 설정할지 물어보면 No 라고 답합니다.

sudo apt install opendmarc

아래 두개의 도메인을 추가합니다.
"10" 도 설정에 추가해 주어야 합니다.

mail.skyer9.pe.kr A <메일서버아이피>
skyer9.pe.kr MX 10 mail.skyer9.pe.kr

최종적으로 DNS 설정은 아래와 같아야 합니다.

이메일 발송 테스트

정상적으로 이메일 형식을 갖추지 않으면 지메일에서 스팸함으로 분류합니다.

Authentication-Results: skyer9.pe.kr; dkim=permerror (bad message/signature format)

아래의 내용으로 발송하면 정상적으로 전송이 됩니다.
EC2 인스턴스는 기본적으로 아웃바운드 25번 포트가 막혀있다.
여기 를 참조해서 먼저 AWS 이메일발송 제한을 해제해야 합니다.

telnet localhost 25
HELO skyer9.pe.kr
MAIL FROM: <root@skyer9.pe.kr>
RCPT TO: <skyer9@gmail.com>
DATA
From: root@skyer9.pe.kr
To: skyer9@gmail.com
Subject: DKIM SPF DMARC Authentication Test
Date: Mon, 18 Aug 2025 12:00:00 +0000
Message-ID: <test-$(date +%s)@skyer9.pe.kr>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8

This is a test email to verify DKIM, SPF, and DMARC authentication settings.

Email Authentication Test Details:
- DKIM: Testing digital signature validation
- SPF: Testing sender policy framework
- DMARC: Testing domain-based message authentication

Please check the email headers to confirm all authentication methods pass successfully.

Test timestamp: $(date)
.
QUIT

답글 남기기