Postfix 기초

민정·2025년 8월 17일

postfix 기초 설정

Basic Configuration

  • myhostname
    • postfix 시스템이 실행되는 PC의 FDQN을 지정
    • 해당 PC 이름이 FDQN이 아닌 경우 해당 파라미터에 FDQN을 직접 지정해야 함
  • myorigin
    • MAIL FROM 명령의 reverse-path 파라미터의 도메인 이름에 영향을 줌
    • myhostname 사용 시 메일이 특정 호스트에서 발송된 것처럼 보임
    • mydomain 사용 시 메일이 특정 도메인에서 온 것처럼 보임
    • 따라서 아주 작은 메일 서버가 아니라면 mydomain을 사용하는 것이 적절
  • mydestination
    • 서버가 로컬에서 메일의 최종 목적지라고 판단하는 도메인 목록
    • 자신(머신 자체)의 호스트 이름, 도메인 이름을 쓰면 자신이 최종 배달 서버가 됨
    • 로컬 외 다른 서버의 도메인 이름을 쓰는 것이 아님, 해당 파라미터에는 로컬, 자신이 소유한 도메인 값만 써야 함
  • mynetworks
    • 해당 서버를 릴레이 서버로 사용할 수 있는 클라이언트 정의
  • relay_domains
    • mynetworks 외의 클라이언트로부터 요청을 받은 경우, 어떤 수신 도메인을 가진 메일을 릴레이할 것인지 결정
  • relayhost
    • 메일을 직접 인터넷을 통해 보낼지, 릴레이 호스트를 설정해 간접적으로 보낼 지 설정
  • notify_classes
    • postmaster에게 어떤 문제(delay, resource, policy 등)를 보고할 지 결정
  • inet_interfaces
    • postfix 시스템이 수신 대기해야 하는 모든 NIC 주소를 지정
  • 프록시, 로깅, 보안(chroot) 등 고려 가능

aliases 설정

  • name: value1, value2, ... 형식으로 작성
    • 빈 줄, 공백만 있는 줄, #으로 시작하는 줄은 무시
    • name
      • 호스트명이며 대소문자 구분 없이 처리하기 위해 소문자 처리됨
      • 공백, 특수문자가 있는 경우 ""로 묶어 작성
    • value
      • 이메일 주소, 파일, 명령어 등으로 설정 가능
      • 단, value를 파일, 명령어로 설정하려면 allow_mail_to_files 등 매개 변수의 설정 값을 변경해야 함
  • 해당 파일의 위치는 postconf alias_maps으로 확인 가능
  • aliases는 설정 후 newaliases 명령을 실행해야 적용됨
  • aliases 파일에서 반드시 postmaster, root 별칭을 설정해야 함
    • Postfix 시스템은 문제가 발생한 경우 해당 문제에 대한 알림을 모두 postmaster에게 전송
    • postmastervalue는 실제로 메시지를 받을 수 있는 메일 주소로 설정해야 함
      • 단, gmail 등의 외부 이메일 서비스로 메일 주소를 설정하면 스팸으로 오해되어 메일이 차단될 수 있음
      • 따라서 자체 메일 서버에 로컬 계정을 생성하고 관리하는 쪽이 적절
  • aliases 사용
    • RCPT TO 명령에서 forward-path의 주소가 postfix의 로컬 도메인인 경우, 해당 이메일 주소의 local-part와 일치하는 name 값이 aliases에 있는지 확인
    • 만약 일치하는 값이 있다면 value에 설정된 값대로 처리

mailbox, 사용자 계정

  • mailbox란?
    • 이메일 메시지가 저장되는 물리적이거나 논리적인 공간
    • 물리적인 디렉터리 , 파일일 수도 있으며 논리적인 개념으로만 존재할 수도 있음, 이는 mailbox의 형식에 따라 다름
    • Maildir 형식(디렉터리-메시지 파일), mbox(단일 파일) 형식을 널리 사용
    • postfix의 main.cf 파일에서 어떤 형식의 mailbox를 사용할 지 결정할 수 있음
  • 리눅스 사용자 계정, RCPT TO, 메일박스의 관계
    • RCPT TO 명령에서 메일 수신자의 주소를 forward-path 파라미터에 작성
    • forward-pathlocal-part를 기반으로 리눅스 사용자 계정을 찾음
    • 사용자 계정이 확인되면 해당 사용자의 mailbox에 메일 데이터를 저장함
  • 현대 메일 시스템에서는 리눅스 사용자 계정을 설정하는 대신 데이터베이스에 가상 사용자를 저장하고, 대부분 Maildir 형식을 사용해 메시지 저장

로컬 메일 전송하기

ehlo localhost
mail from: a
rcpt to: a
data
text mail
.
  • 위와 같이 smtp 명령을 사용해 메일을 전송하니, /var/mail/var/spool/maila라는 파일이 생겼다.
    • postfix가 기본적으로 mbox 방식을 사용해서 메일을 저장하는 것을 확인할 수 있다.
From a@example.com  Fri Aug 15 01:32:21 2025
Return-Path: <a@example.com>
X-Original-To: a
Delivered-To: a@example.com
Received: from localhost (localhost [127.0.0.1])
        by mail (Postfix) with ESMTP id 10E4587AF4
        for <a>; Fri, 15 Aug 2025 01:31:59 +0000 (UTC)
Message-Id: <20250815013211.10E4587AF4@mail>
Date: Fri, 15 Aug 2025 01:31:59 +0000 (UTC)
From: a@example.com

test mail
  • Return-PathMAIL 명령에서, Delivered-ToRCPT 명령에서 지정한 매개변수
    • MAIL, RCPT 명령에서 도메인을 생략했기 때문에 myorigin의 도메인이 자동으로 추가됨
  • MAIL 명령의 매개변수는 완전하고 즉각적인 검증이 수행되지 않거나 지연될 수 있음
    • 해당 주소는 오류 메시지를 전송하기 위한 주소
    • RCPT에 비해 검증이 지연될 수 있으며 일단 250 OK 응답을 받을 가능성이 높음
    • 그래서 MAIL 명령에 현재 리눅스에서 존재하지 않는 사용자명을 입력해도 메일이 발송될 수 있음
  • RCPT 명령의 매개변수는 MAIL에 비해 좀 더 엄격하게 검증됨
  • FromReturn-path는 별칭, 메일링 리스트 등의 특수한 상황에서 서로 다른 값을 가짐
  • Received에서 메일의 전송 경로가 표시됨
    • localhost에서 출발해 mail이라는 Postfix 서버에서 메일이 수신됨

Postfix Standard Configuration Examples: Postfix on a local network

  • 하나의 메인 서버와 여러 대의 SMTP 서버가 서로 이메일을 주고받을 수 있는 로컬 네트워크 구조 형성
  • 모든 서버
    • user@example.com으로 이메일 전송 가능
    • 자기 자신의 이름으로 오는 메일을 받을 수 있음
  • 메인 서버
    • user@example.com로 오는 모든 메일을 최종적으로 받음
    • mailhost.example.com이라는 FDQN으로 설정되어 있음

SMTP 서버

1 /etc/postfix/main.cf:
2 myorigin = $mydomain
3 mynetworks = 127.0.0.0/8 10.0.0.0/24
4 relay_domains =
5 # Optional: forward all non-local mail to mailhost
6 #relayhost = $mydomain
  • 기능
    • 메일을 user@example.com로 보냄
    • 자기 자신에게 오는 메일 user@hostname.example.com을 최종적으로 받음
  • 2행
    • myhostname 대신 mydomain을 사용해 이 컴퓨터에서 보내는 모든 메일의 발신 주소가 user@hostname.example.com가 아닌 user@.example.com로 보이도록 함
    • 단, 해당 설정으로 인해 root, postmaster 등의 시스템 계정의 메일도 메인 서버로 전송됨
  • 3행
    • 신뢰할 수 있는(릴레이 서버로 설정할 수 있는) 서버는 자기 자신 127.0.0.0/8과 자신의 로컬 네트워크 10.0.0.0/24
  • 4행
    • 신뢰할 수 있는 서버 mynetworks 외의 서버는 릴레이 서버로 사용하지 않음
  • 6행
    • 모든 외부 메일을 인터넷으로 직접 전송하는 것이 아닌 메인 서버를 거쳐 전송해야 한다면 해당 라인의 주석을 해제

메인 서버

1 DNS:
2 example.com IN MX 10 mailhost.example.com.
3
4 /etc/postfix/main.cf:
5 myorigin = $mydomain
6 mydestination = $myhostname localhost.$mydomain localhost $mydomain
7 mynetworks = 127.0.0.0/8 10.0.0.0/24
8 relay_domains =
9 # Optional: forward all non-local mail to firewall
10 #relayhost = [firewall.example.com]
  • 기능
    • 메일을 user@example.com로 보냄
    • 자기 자신에게 오는 메일 user@hostname.example.com을 최종적으로 받음
    • user@example.com으로 오는 메일을 최종적으로 받음
  • DNS
    • MX 레코드를 설정해 example.com으로 오는 메일이 mailhost.example.com.로 모두 오도록 함
  • 6행
    • 위의 SMTP 서버와 달리 mydestination을 설정
    • example.com, 자기 자신의 호스트 이름($myhostname localhost.$mydomain localhost)으로 오는 메일의 최종 목적지 임을 설정함

mailbox 접근

  • 사용자는 mailbox에 다음 방법으로 접근 가능
    • 파일 시스템을 사용해 mailbox 디렉터리에 접근
    • POP, IMAP 프로토콜을 사용해 접근
    • aliases 설정을 통해 특정 컴퓨터에 mailbox를 설정
profile
시스템 + 리눅스 + 클라우드

0개의 댓글