메일 서버: 어려운 이유와 고려 사항
발신 메일 포트가 닫혀 있는 이유와 여는 방법, 메일이 전달되도록 설정해야 할 PTR, SPF, DKIM, DMARC, 자체 메일 서버를 운영하지 말아야 할 때를 설명해요.
업데이트 2026년 8월 23일
메일 서버를 설정하는 것은 기술적으로 어렵지 않아요. 어려운 부분은 이메일이 스팸이 아닌 “받은편지함”에 도착하게 하고, 조용한 반송을 피하는 것이에요. 이 문서에서는 첫 이메일을 보내기 전에 해야 할 일을 다뤄요.
왜 이것이 별도의 작업인가
이메일 수신은 거의 즉시 작동해요. 서버를 설정하고 25번 포트를 열면 메시지가 도착해요. 문제는 발송이고, 여기에는 두 가지 부분이 있어요. 첫째, 발신 메일 포트는 저희 플랫폼에서 기본적으로 닫혀 있고 요청 시 열려요. 둘째, 수신 측(Gmail, Mail.ru, Yandex)이 여러 기준으로 발신자를 검사하고, 그중 하나라도 통과하지 못하면 메시지가 스팸이 되거나 거부돼요.
최소한 다음 항목이 검사돼요.
| 검사 항목 | 설정 위치 | 없을 때 발생하는 일 |
|---|---|---|
| 발신 25번 포트가 열려 있는지 | 지원 요청 | 이메일이 전혀 나가지 않아요 |
| 역방향 DNS(PTR) | 머신 패널의 “접근” 탭 | 연결 단계에서 거부돼요 |
| SPF | 도메인 DNS | 이메일이 스팸으로 가요 |
| DKIM | 도메인 DNS + 메일 서버 | 이메일이 스팸으로 가요 |
| DMARC | 도메인 DNS | 도메인이 쉽게 위조돼요 |
| IP 평판 | 발송 이력 | 조용히 필터링돼요 |
설정 순서
- 발신 포트를 요청하세요. 25, 465, 587번 포트는 요청으로 열기 전까지 발신 트래픽에 대해 닫혀 있어요. 여기서 시작하세요. 이것 없이는 아래에 설명된 나머지를 테스트할 수 없어요.
- PTR. 역방향 DNS 레코드는 서버가 SMTP에서 제시하는 이름과 일치해야 해요. 머신 패널의 “접근” 탭에서 설정하세요. 예를 들어
mail.example.com으로 설정하고, 머신의 주소를 가리키는 일치하는 정방향 A 레코드를 만드세요. - 메일 스택. 가장 쉬운 방법은 미리 만들어진 컨테이너 구성인 docker-mailserver 또는 Mailcow예요. Docker Compose로 설치하면 Postfix, Dovecot, 안티스팸, DKIM 키를 스스로 설정해요.
- DNS. 서버 이름에 대한 MX 레코드를 만든 다음 SPF와 DMARC를 만드세요.
example.com. MX 10 mail.example.com.
example.com. TXT "v=spf1 mx -all"
_dmarc.example.com. TXT "v=DMARC1; p=quarantine; rua=mailto:postmaster@example.com"
- DKIM. 메일 서버가 키를 생성해요. 공개 부분을 TXT 레코드
<selector>._domainkey.example.com으로 게시하세요. - 검증. 테스트 서비스(mail-tester, learndmarc)로 이메일을 보내고 만점을 목표로 하세요. 이 전에는 대량 메일을 보내지 마세요.
발신 메일 포트는 기본적으로 닫혀 있어요
이것이 메일 서버를 설치하기 전에 알아야 할 주요 사항이에요. 머신에서 25, 465, 587번 포트로 나가는 발신 트래픽은 호스트에서 차단돼요. 새 머신에서 외부로 이메일을 보내는 것은 작동하지 않고, 시스템 내부 설정 때문에 작동하기 시작하지도 않아요. 패킷이 네트워크 인터페이스를 떠나지 않아요.
이렇게 확인할 수 있어요. 연결이 성립되지 않아요.
nc -vz smtp.gmail.com 25
이것은 침해된 머신이 가장 먼저 스팸을 보내기 시작하고, 호스트의 모든 이웃이 주소와 그 평판에 대해 책임을 져야 하기 때문이에요. 이는 이메일 수신에는 영향을 주지 않아요. 25, 465, 587, 993번으로 들어오는 연결은 차단되지 않고, 메일 서버는 메시지를 즉시 받아들여요.
여는 방법
포트는 요청 시 수동으로 열리고, 즉시 열리지 않아요. 패널에는 이를 위한 버튼이 없어요.
- 머신 번호(”결제” 탭, “지원용” 블록)와 함께 지원팀에 문의하세요.
- 무엇을 보내는지 설명하세요. 도메인, 이메일의 성격, 대략적인 일일 발송량이에요.
- 응답을 기다리세요. 포트가 닫혀 있는 동안 메일 서버를 설치하고 구성할 수 있지만, 발송을 테스트할 수는 없어요.
구매한 데이터베이스로의 대량 발송은 어떤 설명으로도 열리지 않아요. 머신에서 할 수 있는 것과 할 수 없는 것을 참고하세요.
주고받는 과정을 거치지 않고 오늘 바로 발송해야 한다면 외부 릴레이를 사용하세요. 메일 서비스가 SMTP 로그인을 제공하고 2525번 포트로 연결을 받거나 API를 통해 받으며, 25번 포트는 필요하지 않아요.
머신 내부 방화벽
본인 측에서 메일 포트로 들어오는 연결을 허용하세요.
sudo ufw allow 25/tcp
sudo ufw allow 587/tcp
sudo ufw allow 465/tcp
sudo ufw allow 993/tcp
ufw 규칙은 시스템으로 들어오는 것만 제어해요. 발신 25, 465, 587번에 대한 차단은 외부에 있고, ufw allow out으로는 제거되지 않아요.
오픈 릴레이를 절대 남겨두지 마세요. 확인하세요. 다른 머신에서 인증 없이
swaks --to test@example.com --server <machine-address>를 실행하면 연결이 거부되어야 해요. 오픈 릴레이는 하루 만에 머신의 주소를 스팸 발송지로 만들고 그 평판을 영원히 파괴해요.
자체 메일 서버가 필요하지 않을 때
- 애플리케이션에서 알림만 보내면 돼요 — 외부 발송 서비스를 사용하세요. 더 저렴하고 전달률도 더 좋아요. HTTP API나 2525번 같은 대체 포트로 연결하세요. 표준 포트 465와 587은 25번과 마찬가지로 닫혀 있어요.
- 사람들을 위해 도메인에 이메일이 필요해요 — 메일 호스팅이 개입 없이 해결해 줘요.
- 업데이트와 큐를 모니터링할 준비가 안 됐어요 — 방치된 메일 서버는 보안 구멍이 돼요.
자체 서버는 독립성이 중요하고 유지보수를 감당할 준비가 됐을 때 정당화돼요. 사서함의 백업은 필수이고, 메일용 디스크 공간을 여유 있게 할당해야 해요. 디스크 공간을 참고하세요.