mailgun 사용
25번 포트 차단 이슈
악용의 위험으로 인해 대상이 VPC 네트워크 외부에 있을 때 대상 TCP 포트 25로의 연결은 차단됩니다.
25번 포트 아웃바운드 차단?
- 대부분의 VPS는 25번 포트의 아웃바운드 트래픽을 차단함
- 요청은 아웃바운드(패킷 전송), 응답은 인바운드(패킷 수신)가 됨
- 요청 시 소스 포트는 랜덤 값 포트, 목적지 포트 특정 값(특정한 서비스) 포트
- 즉, 25번 포트의 아웃바운드 트래픽을 차단 = 목적지 포트가 25번인 패킷을 모두 차단
- 내 VM(랜덤 포트)→ 외부 서버(25번 포트) 방향으로 가는 패킷은 네트워크 레벨에서 항상 드랍
- 그렇다면 25번 포트가 아닌 다른 포트를 목적지 포트로 해서 메일을 전송한다면?
- 외부 서버의 방화벽에 의해 패킷 차단
- 수신 대기 중인 포트가 아니기 때문에 패킷 무시
해결 방법
- 25번 포트가 뚫려있는 VPS를 사용
- Postfix(아웃바운드) → SMTP API(릴레이 용도) → 외부 MTA
- SMTP API를 릴레이 용도로만 사용
- 물론 SMTP API는 굳이 릴레이 서버가 아닌 MSA, MTA 역할을 모두 맡을 수는 있지만, 프로젝트의 의의를 위해 릴레이 서버로만 제한적으로 사용
- 일단은 VPS를 찾는 대신 위 방법을 사용할 예정
SMTP API 사용
- 만약 SMTP API를 사용한다면 해당 API가 Postfix를 모두 대체해줄텐데, 굳이 Postfix를 써야 하는 이유가 있는지?
- 시스템 결합도 감소
- MUA는 오직 Postfix와만 통신하고, Postfix가 외부 SMTP API와 통신
- 애플리케이션과 외부 API 간의 결합도가 매우 낮아짐
- 확장성 및 유연한 라우팅
- 특정 SMTP API에 종속되지 않는 아키텍처이므로 확장성이 높음
- Postfix의 강력한 라우팅 기능을 활용해 상황에 따라 다른 메일 전송 경로를 설정할 수 있음
- 안정적인 큐 관리 및 로깅
- Postfix는 메일 전송에 실패하더라도 메일을 큐에 보관하고 재전송을 시도
- 이 덕분에 외부 API나 네트워크에 일시적인 문제가 생겨도 메일이 유실되지 않고 시스템의 안정성을 보장
- 모든 전송 내역이 Postfix 로그에 기록되어 중앙 집중적인 디버깅과 감사 기록을 제공
SMTP API
- 무엇을 사용?
- GCP 내에서 메일 API를 사용하지는 않을 예정 → 무료 플랜도 없고 너무 비쌈
- google workspace 무료 체험판 사용
- sendgrid, mailgun 등의 상용 SMTP API 사용
- 최종적으로 mailgun / sendgrid 중 하나 사용
- sendgrid가 무료 요금제를 폐지하겠다고 했던게 생각이 나 mailgun을 사용하기로 최종 결정
mailgun 사용하기
mailgun 설정
https://weblynx.pro/how-to-set-up-smtp-relay-postfix-mailgun-ubuntu-server/
main.cf 설정
https://documentation.mailgun.com/docs/mailgun/user-manual/smtp-protocol/smtp-relay
- mailgun 회원가입 후 공식문서에 제시된대로 그대로 main.cf를 작성하면 됨
- 이는 내 postfix → mailgun 메일서버로 SASL을 설정하는 것
# /etc/postfix/main.cf:
relayhost = [smtp.mailgun.org]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:postmaster@mydomain.com:password
smtp_sasl_security_options = noanonymous
# TLS support
smtp_tls_note_starttls_offer = yes
password_maps에서 static으로 그대로 비밀번호와 도메인 값을 명시하는 것은 보안상 부적절해보여 lookup db를 hash로 변경 후 설정
# /etc/postfix/main.cf:
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# /etc/postfix/sasl_passwd:
[smtp.mailgun.org]:587 your_mailgun_smtp_user@your_subdomain_for_mailgun:your_mailgun_smtp_password
- mailgun의 smtp credentials에서 생성한 값으로 작성
- 해당 파일은 600으로 권한 설정
mailgun으로 메일 보내기
- 위 설정을 모두 완료하고 메일을 전송하면, postfix에서 mailgun을 릴레이 서버로 사용해 메일이 발신됨
- mailgun에서 제시하는 MX 레코드를 사용하면 메일 수신도 mailgun 서버를 통해 도착함
- mailgun 서버에서 추가적인 라우팅 설정을 진행해야 메일을 원하는 곳에서 정상 수신 가능
mailgun의 장점
- 메일 로그, 지표 등을 확인하기 매우 편하다.
- 메일 서버 보안성, 관리 편의성이 매우 높아진다.
- 도메인 평판 관리가 쉬워지며, 메일이 거부당하거나 스팸으로 분류될 확률이 매우 낮아진다.
- 자동으로 SPF/DKIM 설정을 적용해주기 때문에 보안 레코드 설정이 매우 쉽다.
- 단, 해당 프로젝트의 목적성과 많이 멀어진다.
- 이 프로젝트는 직접 postfix 설정을 통해 분산 이메일 시스템의 MTA 컨포넌트를 만드는게 목표였는데, 솔직히 mailgun을 쓰면 postfix를 통한 분산 시스템을 구성할 이유가 거의 없어지기 때문이다.