[Linux] AWS 자체 SMTP 서버 구축
보통 AWS를 사용하면 관리형 서비스인 SES를 사용하곤 했는데
이번엔 개발업체에서 이메일 반송률 또는 수신 거부율로 인한 차단이 우려된다 하면서 SMTP 서버 구축을 요청했다.
처음 SMTP 서버를 구축하면서 정말 이래서 관리형 서비스를 쓰는거구나 하고 많이 느꼈고 반면 직접 구축해 보면서 SMTP 메일 전송 플로우를 몸소 경험할 수 있었다.
먼저 작업하기 앞서, SMTP를 사용한 이메일 발송 원리를 먼저 이해해 보자!
이메일 발송은 기본적으로 발신자 메일 클라이언트 → 발신자 메일 서버 → 수신자 메일 서버 → 수신자 메일 클라이언트 순서로 이루어 진다.
- 발신자 메일 클라이언트가 메일 작성 → SMTP 프로토콜을 통해 MIME 포맷으로 SMTP 서버에 메일 전송 → 발신자 메일 서버에서 MTA(ex. sendmail)는 이를 queue에 저장
- 발신자 메일 서버는 수신자의 DNS에서 수신자의 MX 레코드 쿼리 → MX 레코드 값 기반으로 DNS 쿼리하여 수신자 메일 서버의 IP 조회
- 인터넷을 통하여 SMTP 프로토콜로 수신자 메일 서버에게 전달
- 수신자 메일 서버는 발신자의 DNS에서 발신자의 SPF 레코드 쿼리 → 발신자 메일 서버의 IP 주소가 해당 도메인에서 메일을 발송할 수 있는 권한이 있는지 확인
- 수신자 메일 서버는 MTA를 통해 메일을 수신하고, MDA를 사용하여 메일함에 저장 → 수신자 메일 클라이언트에게 메일을 전달
SMTP 서버 구축
일단 구축 조건은 다음과 같다
-
발신 서버는 수신이 필요없음
⇒ MX 레코드 필요없음
-
발신자와 발신 서버가 동일 서버
⇒ SG 인바운드 조건 필요없음
-
AWS EC2 프라이빗 서버
⇒ NAT GW IP 사용
sendmail을 설치해서 사용하고 25번 포트로 SMTP 프로토콜을 사용할 것이다
근데 AWS에서는 스팸을 방지하기 위해 기본적으로 25번 포트를 제한하고 있다
먼저 AWS에 25번 포트 제한 해제 요청을 보내야 한다.
이 포스팅에서 sendmail 설치는 생략한다.
AWS 제한 해제 메일
https://aws.amazon.com/forms/ec2-email-limit-rdns-request
위 링크에서 요청 메일을 보낼 수 있다
Reverse DNS는 요청하지 않았고 Request information에만 기입해서 요청했다
이 때 사용하고자 하는 서버의 리전, 사용 용도, 스팸방지법(?)을 적어주면 된다.
전날 오전에 요청하고 당일 저녁에 승인 메일이 왔다
요청한 리전만 승인이 되어, 인스턴스나 NAT IP까지 해제되었다.
서버에서 확인해 보면 Connected가 뜬다!
참고 자료 ) EC2 인스턴스에서 포트 25 제한 해제
참고 자료 ) [AWS] 메일 발송을 위해 EC2의 SMTP 25번 포트 제한 제거 요청 방법.
서버 구축 후 도메인
서버를 구축한 뒤에는 원하는 도메인으로 보내기 위해 몇 가지 세팅을 해줘야 한다.
첫 번째, 서버 내에서 hostname 관련해 작업해 줄게 몇 가지 있다. hostname을 변경하면 발신자명은 hostname을 따라간다.
-
hostname 파일 수정
`/etc/hostname`, `/etc/hosts`, `/etc/mail/local-host-names` 파일에서 hostname 변경 hostnamectl set-hostname [사용할 도메인] systemctl restart systemd-hostnamed
-
/etc/mail/access
에 도메인 추가Connect:[사용할 도메인] RELAY
-
설정 적용
makemap hash /etc/mail/access < /etc/mail/access systemctl restart sendmail
두 번째, DNS에 사용할 서브도메인을 NAT IP로 추가해 준다.
세 번째, SPF 레코드에 NAT IP를 추가해 준다.
헤맸던 부분 - 원하는 도메인으로 발송하기
hostname 설정에 도메인으로 변경해 주었을 때, 같은 2차 도메인으로는 메일 전송되나, gmail 또는 naver 같은 경우에는 안되었다.
메일 발신 서버에서 메일 발송은 성공했으나 수신메일서버에서 해당 도메인에 대한 신뢰성이 없어서 거부된 케이스였다.
그래서 DNS 서브도메인에 NAT IP를 매핑해 주었고 해당 서브도메인 TXT spf 레코드에 NAT IP를 추가해 주었다. 그랬더니 바로 검증되고 메일이 전송되었다.
하지만 메일 수신은 오지만 naver는 수신함, gmail은 스팸으로 분류되었다.
아마 DKIM 레코드까지 설정해 주어야 gmail도 수신되지 않을까 한다. 여기까지 실습은 못하였다.
추가적으로 SPF와 DKIM 레코드의 차이를 알아보았다.
SPF는 IP와 도메인으로 구성되어 발신자 IP가 허용된 주소인지 확인하고 발신자의 신뢰성을 검증한다
DKIM은 메일 헤더와 본문을 해시하여 비공개키로 디지털서명을 생성하고 메일 헤더에 추가한다. 발신 메일 서버 DNS의 DKIM 레코드에 공개키를 포함한다. 수신 메일 서버가 해당 서명이 유효한지 확인하고 이메일의 무결성과 출처를 검증할 수 있게 된다.
여러 모로 SES로는 세팅 및 관리하기 편해서 이해하기 힘들었던 과정을 직접 구축함으로써 몸소 느낄 수 있었다!
Leave a comment