📚 네트워크 · 패킷 분석 › 02. 포트 · 프로토콜 분석 — 67편
이전 글: 66. Telnet과 평문 프로토콜의 위험 · 다음 글: 68. POP3
SMTP(Simple Mail Transfer Protocol)는 메일을 보내고 전달하는 프로토콜입니다(RFC 5321). 메일 포트 전체(25·587·465·110·995·143·993)의 역할 구분, 봉투와 헤더의 차이, Postfix 로그 추적은 82. 메일 프로토콜 SMTP·POP3·IMAP에서 다뤘습니다.
이 글은 SMTP라는 프로토콜의 대화 규칙만 봅니다. 누가 누구에게 말하는지, 서버가 무엇을 할 수 있다고 알리는지, 응답 숫자가 무엇을 뜻하는지입니다.
| 구성 요소 | 역할 | SMTP 관련 포트 |
|---|---|---|
| MUA (Mail User Agent) | 사용자의 메일 프로그램 | 587/465로 제출 |
| MSA (Mail Submission Agent) | 사용자 제출을 받아 인증 | 587(RFC 6409), 465(RFC 8314) |
| MTA (Mail Transfer Agent) | 서버 간 전달(릴레이) | 25 |
| MDA (Mail Delivery Agent) | 수신 메일함에 저장 | SMTP 이후 단계 |
SMTP는 텍스트 명령 → 3자리 응답 코드를 한 줄씩 주고받는 구조입니다. 서버가 먼저 220 인사말을 보내고, 클라이언트가 EHLO로 대화를 시작합니다.
클라이언트(MTA/MUA) 서버 192.168.10.30:25
│ ── TCP 연결 ──────────────────────────────────→ │
│ ←─ 220 준비됨 (서버 배너) ───────────────────── │
│ ── EHLO client.example.com ───────────────────→ │
│ ←─ 250-확장 기능 목록 (STARTTLS, AUTH, SIZE…) ─ │
│ │
│ ── STARTTLS ──────────────────────────────────→ │ ← 선택
│ ←─ 220 Ready to start TLS ──────────────────── │
│ ⇄ TLS Handshake → 이후 암호화 │
│ ── EHLO (다시) ─────────────────────────────────→ │ ← TLS 후 재협상
│ ── AUTH / MAIL FROM / RCPT TO / DATA ─────────→ │
│ ←─ 250 queued ──────────────────────────────── │
│ ── QUIT → 221 ────────────────────────────────→ │
응답 코드는 첫 자리로 결과를, 둘째 자리로 분류를 나타냅니다.
| 첫 자리 | 의미 | 예 |
|---|---|---|
| 2xx | 성공 | 220 준비, 250 완료, 221 종료 |
| 3xx | 추가 입력 필요 | 354 본문 입력 시작, 334 AUTH 다음 단계 |
| 4xx | 일시적 실패 (재시도 대상) | 421 서비스 불가, 450 메일함 일시 사용 불가, 451 처리 오류 |
| 5xx | 영구적 실패 | 530 인증 필요, 535 인증 실패, 550 거부, 554 트랜잭션 실패 |
응답 뒤의 5.7.1 같은 숫자는 확장 상태 코드(RFC 3463)입니다. 클래스.주제.상세 구조이며, 주제 7은 보안·정책 관련(예: 릴레이 거부, 인증 문제)이라 관제에서 특히 눈여겨볼 값입니다.
EHLO 확장 기능은 서버가 지원하는 기능을 알리는 목록입니다.
| 확장 | 의미 | 관제 포인트 |
|---|---|---|
STARTTLS | TLS 전환 가능 | 서버 간 구간에서 이 줄이 사라지면 강제 평문화 가능성 |
AUTH PLAIN LOGIN | 지원 인증 방식 | 평문 구간에서 AUTH가 보이면 자격 증명 노출 |
SIZE 10240000 | 최대 메시지 크기 | — |
PIPELINING | 명령 연속 전송 허용 | — |
8BITMIME, SMTPUTF8 | 8비트·UTF-8 메시지 | — |
VRFY, EXPN(명령) | 주소 확인·목록 확장 | 계정 존재 여부 확인에 악용 가능 |
실습 예시 — 본인 소유 VM의 로컬 전용 Postfix(설치는 82. 메일 프로토콜 SMTP·POP3·IMAP 참고)에서 EHLO 응답과 정책 설정을 확인합니다.
# EHLO 응답 확인 (-C: 줄 끝 CRLF)
nc -C 127.0.0.1 25
# 접속 후 입력: EHLO lab.local → QUIT
# STARTTLS 전환 후 응답 확인 (TLS가 설정된 경우)
openssl s_client -starttls smtp -connect 127.0.0.1:25 -quiet
# VRFY 명령 허용 여부와 릴레이 제한 정책 (Rocky/Ubuntu 공통)
postconf disable_vrfy_command smtpd_relay_restrictions
EHLO 응답 형식 예시(값은 환경마다 다름):
220 mail.lab.local ESMTP Postfix
EHLO lab.local
250-mail.lab.local
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 SMTPUTF8
마지막 줄만 250 (공백)이고 나머지는 250-(하이픈)입니다. 하이픈은 "응답이 아직 이어진다"는 뜻입니다. 여기서 VRFY가 보이면 disable_vrfy_command = yes로 끌 수 있습니다.
거부 응답 형식 예시(값은 환경마다 다름):
RCPT TO:<user@example.org>
554 5.7.1 <user@example.org>: Relay access denied
📷 [실습 화면 삽입 위치] nc로 EHLO를 보냈을 때 250- 확장 목록이 출력된 화면
554 5.7.1 Relay access denied는 정책이 제대로 막고 있다는 증거입니다.VRFY, EXPN, 그리고 RCPT TO 응답 차이(250 vs 550)로 계정 존재 여부를 추정할 수 있습니다. 한 출발지가 다양한 수신자로 RCPT만 반복하고 DATA 없이 끝나면 확인 시도를 의심합니다.STARTTLS 줄을 지우면 서버 간 전달이 평문으로 진행될 수 있습니다. MTA-STS, DANE 같은 정책으로 보완합니다.AUTH PLAIN의 값은 Base64 인코딩일 뿐 암호화가 아닙니다. TLS 전환 전에 AUTH가 보이면 자격 증명 노출입니다.| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| MTA 로그 | 응답 코드·확장 상태 코드, 거부 사유, AUTH 결과 |
| 메일 게이트웨이 | 차단 사유, TLS 사용 여부, 발신 IP 평판 |
| IDS/NSM | 평문 구간의 배너·EHLO·명령, STARTTLS 사용 여부 |
| 방화벽 | 25/587/465 연결의 출발지·목적지·빈도 |
관제자가 확인할 질문
5.7.x(정책·보안) 거부가 특정 출발지에서 반복되는가?오탐 주의: 4xx는 그레이리스팅(처음 보는 발신 서버를 일부러 일시 거부)이나 수신 서버 과부하에서도 정상적으로 발생합니다. 정상 MTA는 일정 시간 뒤 재시도하므로, 재시도 여부로 구분합니다.
x.7.x는 보안·정책 관련입니다.