AWS EC2에서는 기본적으로 SMTP 포트인 25 사용이 제한 되어 있습니다.
따라서 SMTP를 사용하기 위해서는 추가적인 조치들이 필요합니다.
EC2에서 직접 메일을 발송하지 않아도, SMTP 프토로콜을 이용 하는 경우도 이에 해당 될 수 있습니다.
이 경우 가장 간단한 방법은, 대체 포트(587)를 사용하는 것인데,
이는 메일서버에서 제공 해주어야 가능합니다.
본 솔루션에서는 EC2에서 25번 Port를 사용하기 위한 절차에 대해 설명 하고자 합니다.
SMTP
SMTP란?
SMTP(Simple Mail Transfer Protocol)는 e-mail을 컴퓨터에서 다른 컴퓨터로 전송할 때 사용하는 메일 서버의 기본 프로토콜 입니다. 메일 서버로 메일을 보낼 때, 메일 서버 끼리 메일을 주고 받을 때 사용하며 이메일을 송수신 하는 서버를 SMTP 서버라고 합니다.
Mail System의 동작 구조
인터넷 메일 시스템은 크게 mail user agent, 메일 서버, SMTP 3가지 요소로 구성되어 있습니다.
-
mail user agent (MUA)
사용자가 메일을 읽고, 작성하고 전송하는 프로그램으로 메일을 만들어 보냅니다.
MUA는 TCP 587 Port 를 이용하여 전송합니다.
-
mail server (MSA → MTA)
user agent는 메시지를 메일서버로 보내게되고, 여기서 메시지는 메일서버의 output 메시지큐에 들어가게 됩니다.
즉, MUA에서 작성되고 전송된 이메일을 처리하는 작업을 합니다.
메일이 전송되면 해당 메일은 수신자의 메일 서버 안의 메일 박스(mail box) 안에 저장되고 유지됩니다.
MSA는 587 Port를 사용하고 MTA는 25번 Port를 사용합니다.
MSA와 MTA 모두 SMTP를 이용합니다. 차이점은 MSA는 인증을 제공하고, MTA는 인증을 제공하지 않는다는 점입니다.
많은 SMTP 서버 프로그램들이 MSA와 MTA 기능을 모두 가지고 있습니다..
MAIL 전송 방식
A → B 로 메일을 전송하는 Flow에 대해 설명드리도록 하겠습니다.
A가 user agent를 통해 B에게 메일 내용을 작성하고 전송버튼을 누릅니다.
-
A의 user agent는 메시지를 A의 메일서버에 보내게 되고, 메시지는 메일서버의 output message queue에 위치합니다.
A의 메일서버에서 동작하는 SMTP 클라이언트는 output message queue에 쌓여있는 메시지를 B의 메일서버로 전송하기 위해 먼저 TCP연결을 맺습니다.
TCP가 맺어진 후, SMTP 핸드쉐이킹을 하고 SMTP 프로토콜에 따라 B의 메일서버로 전송합니다.
- B의 메일서버는 메시지를 수신한 후, 그 메시지를 B의 메일박스(mailbox)에 놓습니다.
- B는 이후에 user agent를 실행하여 메일을 읽을 수 있습니다.
EC2에서 SMTP 25번 Port 사용하기
AWS에서 25번 Port를 제한하는 이유는?
서버를 운영하시다보면, ec2, 혹은 SES를 사용하여 메일 발송을 해야하는 경우가 있습니다.
기본적으로 aws에서는 EC2에서 SMTP 를 사용할 수 없도록 25번 Port 를 제한하여 메세지를 발송할 수 없도록 합니다.
그 이유로는, 무분별한 스팸 메일 발송을 막기 위함입니다.
만약, 메일 보내기를 25번 포트가 아닌 다른 포트 465, 587 포트를 사용하게 되면, 해당 연결은 제한되지 않아서 Email 보내는데 문제는 없습니다 (AWS SES 역시 마찬가지 입니다).
하지만, 25번 포트를 사용하여 전송하고자 하신다면 "EC2 이메일 전송 제한 제거 요청" 을 제출하고 승인 받는 과정이 필요합니다.
배경
현재, 저희 회사는 EC2에 Wordpress를 설치하여 기술 블로그를 운영하고 있습니다.
활동이 보다 활발해지면서, 메일로의 알람, 내부 직원들께 새로운 게시물 업데이트 시 알람등 다양한 목적으로 E mail을 전송해야하는 필요성을 느꼈습니다.
하지만, 아래 사진 처럼, 메일 전송 시 connection time out 에러가 발생하며 메일을 발송할 수 없었습니다.
aws 문서에서 확인하실 수 있듯이, Amazon EC2 기본적으로 포트 25를 제한하기 때문에 이와 같은 오류가 발생하는 것으로 확인했습니다.
따라서, 기본적으로 제한되어 있는 EC2의 25번 포트에 대한 제한을 제거하기 위해 요청하였습니다.
순서
- 도메인 생성
- EC2의 EIP에 대한 A 레코드 등록
- EIP에 대한 rDNS 레코드 등록
사전 절차
- Route 53을 사용하는 경우, 새로운 A 레코드를 생성해야 합니다. 해당 레코드는 SMTP 서비스를 호스팅 할 EC2 인스턴스의 IP 주소를 가리켜야 합니다.
-
Route53 → 도메인 선택 → 레코드 생성
-
레코드를 생성합니다.
- 레코드 유형 : A 레코드를 선택합니다.
- 값 : 메일 서버로 사용하고자 하는 ec2의 EIP 값을 넣어줍니다.
- 레코드 이름 : 해당 EIP에 매핑되는 레코드 이름을 생성해줍니다,
-
- Route53 을 사용하지 않고 다른 도메인 서비스를 사용하시는 경우, DNS 공급자에게 A 레코드를 생성하도록 요청합니다.
Request to remove email sending limitations 작성 후 제출
사전 작업을 마치셨다면 이제 양식을 제출하여 rDNS 레코드 등록을 요청하고 25번 Port 제한 제거를 요청하시면 됩니다.
아래의 링크에 접속하시면, 다음과 같은 양식을 확인하실 수 있습니다.
https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request
각각 설명드리기에 앞서, 간단하게 저희가 설정한 구성에 대해 소개드리도록 하겠습니다.
팀 email 주소인 "cts_bgk@bespinglobal.com" 을 사용하며, wordpress ec2의 EIP와 mail.janna.cloud 의 메일 서버 dns 를 매핑하였습니다.
양식을 하나 하나 살펴보자면,
-
Email address
: 사용할 이메일 주소를 입력합니다.
-
Use Case description
: 중요한 부분으로, 최대한 자세히 입력하셔야 합니다.
사용하시는 region, 사용하고자 하는 용도 등을 상세히 설명합니다.
-
Elastic IP address
: EC2의 EIP 주소를 입력합니다
-
Reserve DNS Record
: rDNS 레코드를 등록하는 부분으로, 위에서 A레코드에 등록한 EIP 에 매핑한 DNS 주소를 입력합니다.
확인
요청 양식을 제출하면 요청 ID가 포함된 이메일을 받게 됩니다. 요청을 처리하는 데 최대 48시간이 걸릴 수 있습니다. 요청이 승인되면 포트 25 제한이 제거되었음을 알리는 이메일을 받게 됩니다. 요청을 제출한 후 48시간 이내에 업데이트를 받지 못한 경우 수신한 초기 이메일에 회신하십시오.
Submit을 선택하여 제출하시면, 24시간 이내에 aws로부터 제출이 완료되었다는 메일이 옵니다.
이후, 1~2시간 (48시간 까지 걸릴 수 있습니다) 내로 요청이 정상적으로 처리되었다는 안내 메일이 발송됩니다.
위와 같은 작업이 완료되면, EC2에서 이제 메일을 전송할 수 있습니다