Ubuntu Postfix 설치 가이드 — SMTP 발송·릴레이·TLS·오류 해결

Postfix는 이메일을 받아 다음 메일 서버로 전달하는 SMTP 서버입니다. 이 문서는 Ubuntu의 로컬 애플리케이션에서 메일을 보내는 기본 구성과 외부 SMTP 릴레이 연결을 설명합니다. 인터넷 수신 서버와 사용자 로그인용 SMTP 서버를 완성하려면 별도 구성이 필요합니다.

메일 서버 운영 환경의 예시인 데이터센터 서버 랙
서버 운영 환경 예시 사진. Taylor Vick / Unsplash. 실제 사이트의 서버 사진은 아닙니다.

목차

  1. 역할과 구성 선택
  2. Ubuntu 설치
  3. 로컬 발송용 기본 설정
  4. 외부 SMTP 릴레이 연결
  5. 인터넷 수신과 587 인증의 차이
  6. DNS와 발송 신뢰도
  7. 발송 시험·로그·오류 해결

1. Postfix의 역할과 구성 선택

목적구성추가 준비
웹 서버 알림 발송로컬 앱 → Postfix → 외부 SMTP 제공자릴레이 계정·발신 도메인 인증
직접 외부 도메인으로 발송로컬 앱 → Postfix → 수신 도메인의 MX아웃바운드 25번, PTR, IP 평판, DNS 인증
자체 도메인 수신외부 메일 서버 → Postfix → 메일함MX·수신자·메일함·스팸 검사
PC·스마트폰에서 메일 발송메일 앱 → 인증된 587/465 서비스SASL 인증과 TLS 설정

Postfix 설치만으로 IMAP 메일 읽기가 제공되지는 않습니다. 메일함 조회에는 Dovecot 같은 별도 서비스가 필요합니다. 아래 example.com과 mail.example.com은 설명용 도메인이므로 소유한 도메인으로 바꿉니다.

2. Ubuntu에 설치

설치 중 기본 유형을 선택하는 화면이 표시될 수 있습니다. 직접 SMTP 발송을 위한 출발점은 Internet Site이고, 외부 서버를 경유하는 구성은 Satellite system 등 목적에 맞는 유형을 선택할 수 있습니다. 여기서는 설치 후 설정을 명시적으로 확인합니다. System mail name에는 보통 발신 주소의 도메인인 example.com을 입력합니다.

기존 설치 화면 참고

다음은 기존 문서의 설치 화면입니다. 과거 Ubuntu 화면이므로 현재 설치 프로그램의 문구와 순서는 다를 수 있으며, 화면 속 도메인 값을 그대로 사용하지 않습니다.

기존 Postfix 설치 문서의 설정 화면 1
기존 설치 화면 1 — 실제 환경의 도메인과 용도에 맞게 설정합니다.
기존 Postfix 설치 문서의 설정 화면 2
기존 설치 화면 2 — 실제 환경의 도메인과 용도에 맞게 설정합니다.
기존 Postfix 설치 문서의 설정 화면 3
기존 설치 화면 3 — 실제 환경의 도메인과 용도에 맞게 설정합니다.

설치 질문을 다시 보고 싶으면 다음 명령을 사용할 수 있습니다. 기존 운영 설정이 변경될 수 있으므로 먼저 백업합니다.

3. 로컬 애플리케이션 발송용 기본 설정

변경 전에 main.cf와 master.cf를 별도 이름으로 백업합니다. 아래 .before-guide 파일이 이미 있다면 다른 이름으로 저장하세요.

아래는 관련 항목만 정리한 예시입니다. main.cf 전체를 이 내용으로 덮어쓰지 말고 기존 항목을 수정합니다. 중복 항목을 추가하지 않습니다.

항목의미
myhostnameSMTP 서버의 전체 호스트명. world 같은 짧은 이름보다 mail.example.com 형태 사용
myorigin도메인이 없는 로컬 발신 주소에 붙일 도메인
mydestination이 서버가 최종 수신지로 처리할 도메인. 발송 허용 목록이 아님
mynetworks별도 인증 없이 릴레이를 신뢰할 접속 원본
inet_interfacesSMTP 접속을 받을 인터페이스
relayhost다음 단계 발송을 맡길 SMTP 서버. 비어 있으면 일반적으로 목적지 MX로 직접 전달

example.com 메일함을 다른 제공자에서 운영한다면 이를 mydestination에 추가하지 않습니다. 잘못 추가하면 같은 도메인으로 보내는 메일을 외부 제공자 대신 로컬에서 처리하려고 할 수 있습니다. mynetworks에 0.0.0.0/0이나 불필요한 대역을 넣으면 오픈 릴레이 위험이 생깁니다.

이 구성은 로컬에서만 SMTP를 받습니다. 다른 웹 서버나 PC가 연결해야 한다면 별도의 신뢰 IP 제한 또는 인증 제출 서비스를 설계해야 합니다.

설정 검사 오류를 해결한 뒤 재시작합니다. inet_interfaces 변경은 restart가 필요하며 그 밖의 많은 설정은 postfix reload로 적용할 수 있습니다. IPv6를 사용할 경우 주소·라우팅·DNS도 함께 확인하고, 사용하지 않는 IPv6 송신 경로를 방치하지 않습니다.

4. 외부 SMTP 릴레이를 통한 발송

호스팅에서 25번 송신이 제한되거나 발송 서비스를 이용할 경우 제공자가 지정한 587 STARTTLS 서버를 사용할 수 있습니다. 아래 smtp.provider.example은 실제 서버 주소로 바꿔야 합니다.

verify는 암호화와 원격 서버 인증서 검증을 요구합니다. 접속 호스트명이 제공자의 인증서 이름과 맞아야 합니다. 465 암시적 TLS 서비스는 별도 wrapper mode 구성이 필요하므로 위 예제의 포트만 465로 바꾸지 않습니다.

인증 정보 파일은 셸 명령에 비밀번호를 직접 붙이지 말고 편집기로 작성합니다.

위 install 명령은 신규 파일 생성용입니다. 기존 sasl_passwd 파일이 있으면 내용을 지우므로 실행하지 말고 기존 파일을 편집합니다. 파일 내용은 다음 형식입니다.

서버명·대괄호·포트는 relayhost와 일치해야 합니다. 실제 자격 증명을 문서·스크린샷·공유 로그에 넣지 않습니다. hash 맵 지원 여부를 확인한 뒤 데이터베이스 파일을 생성합니다.

postconf -m 출력에 hash가 없는 환경은 지원하는 맵 유형과 파일 생성 방식을 확인해야 합니다. 비밀번호를 바꾸면 postmap도 다시 실행합니다. 외부 제공자가 허용한 발신 주소·도메인으로만 발송하세요.

5. 수신용 25번과 사용자 제출용 587번

포트용도특징
25서버 간 SMTP 전달공개 수신에는 MX, 수신자 관리와 릴레이 제한이 필요
587사용자의 메일 제출일반적으로 STARTTLS와 SASL 인증을 요구
465암시적 TLS 메일 제출접속 시작부터 TLS 사용
993IMAPS 메일함 조회Postfix와 별도 IMAP 서비스 담당

smtp_로 시작하는 설정은 Postfix가 다른 서버로 보낼 때의 클라이언트 동작이고, smtpd_ 설정은 다른 클라이언트가 이 서버로 접속할 때의 동작입니다. smtp_sasl_auth_enable을 켜도 이 서버에 로그인하는 587 서비스가 자동 생성되지 않습니다.

587 서비스는 master.cf에서 활성화하고, 유효한 서버 인증서와 SASL 인증 백엔드(Dovecot 등)를 연결해야 합니다. 암호화 전 인증 금지, 인증 사용자만 릴레이 허용, 실제 인증 소켓 경로와 권한을 함께 검증합니다. 설치 예제의 snakeoil 인증서는 공인 운영 인증서를 대신하지 않습니다.

인터넷 수신을 열 때는 inet_interfaces, 방화벽 25번, MX와 로컬/가상 수신자 구성을 함께 변경합니다. 서버 간 SMTP의 TLS는 상호운용성을 고려해야 하며, 사용자의 587 제출 정책을 25번에 무조건 적용하지 않습니다.

6. DNS와 발송 신뢰도

항목확인 내용
A / AAAA메일 호스트의 실제 IPv4 / IPv6 주소
MX해당 도메인의 수신 담당 서버. 발송만 하는 모든 서버에 자체 MX가 필요한 것은 아님
PTR송신 IP의 역방향 이름. IP 제공자에 설정 요청
SPF해당 발신 도메인을 대신해 보낼 수 있는 서버·제공자 선언
DKIM발송 시 서명하고 DNS 공개 키로 검증. 별도 서명 서비스 또는 제공자 설정 필요
DMARC표시된 From 도메인과 SPF/DKIM 정렬을 바탕으로 정책·보고 설정

DNS 인증 통과가 받은편지함 도착을 보장하지는 않습니다. IP 평판, 내용, 수신 동의, 반송률과 발송량도 영향을 줍니다. SPF를 여러 TXT 레코드로 중복 생성하거나 실제 사용하지 않는 발송 서버를 추가하지 않습니다.

7. 발송 시험과 로그 확인

다음은 서버 관리자가 직접 소유한 테스트 수신 주소로 실행하는 예시입니다. 발신 주소도 허용된 주소로 바꿉니다.

mail.log는 rsyslog 구성에 따라 없을 수 있습니다. 같은 queue ID로 접수부터 다음 서버 응답까지 추적합니다. status=sent는 다음 서버가 수락했다는 의미이며 최종 받은편지함 도착을 뜻하지 않습니다. deferred는 일시 실패로 재시도 대기, bounced는 반송 처리입니다.

오류·증상점검 방향
Relay access denied어느 서버가 거부했는지 확인. 로컬 신뢰 IP·인증 상태 또는 외부 제공자의 릴레이 정책 확인
SASL authentication failed자격 증명, 앱 비밀번호 요구, 맵 키의 포트, postmap 재생성 확인
Connection timed out송신 포트 차단, 방화벽, DNS, IPv6 경로 확인
Certificate verification failed접속 이름·인증서 이름·유효기간·CA 체인·서버 시간 확인
User unknown in local recipient tablemydestination 오설정 또는 실제 로컬 수신자 누락 확인
메일이 스팸함으로 이동수신 헤더의 인증 결과, IP 평판, 발신 내용·도메인 정렬 확인

원인을 해결한 후 필요한 경우 postqueue -f로 대기 큐 재시도를 요청할 수 있습니다. 같은 오류가 계속되는 상태에서 반복 실행하지 않습니다. 대기 메일을 모두 삭제하는 명령은 진단 단계에서 사용하지 않습니다.

운영 전 확인 사항

  • 실제 호스트명·발신 도메인·전달 경로가 일치하는가?
  • 로컬 발송, 외부 릴레이, 공개 수신 중 목적에 맞게 설정했는가?
  • 불필요한 IP를 신뢰하거나 외부 비인증 릴레이를 허용하지 않는가?
  • 인증서 갱신·비밀번호 변경·로그 보관 절차가 있는가?
  • 테스트 수신함과 반송 메시지까지 확인했는가?

공식 참고 문서

문서 수정: 2026년 10월 25일. 명령은 설명용이며 페이지 편집으로 서버 설정이나 메일 발송이 실행되지는 않습니다.