JS

2013년 5월 31일 금요일

Postfix Configuration

postconf -n은 /etc/postfix/main.cf에서 직접 바꾼 설정만 보여준다. 여기에 나오지 않는 것은 기본값을 쓰고 있다는 것이다. 그리고 일부 설정은 리눅스 배포판에서 바꿔서 배포하고 있을 것이다. 아래 코드는 현재 설정된 서버에서 postconf -n 명령의 출력을 적은 것이다. 다만 개인 정보를 담고 있는 부분은 적절히 고쳤다.

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = all
inet_protocols = ipv4
## mailbox, MDA
home_mailbox = Maildir/
#mailbox_command = procmail -a "$EXTENSION"
## mailbox and message size limit
mailbox_size_limit = 0
message_size_limit = 102400000
## domain settings
mydestination = host.domainname, localhost.domainname, localhost
myhostname = host.domainname
#mynetworks_style = host
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
## Dovecot SASL
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
## TLS
smtpd_tls_cert_file = /etc/ssl/my.pem
smtpd_tls_key_file = /etc/ssl/private/my.key
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes

필자가 기억하기로 mailbox_command가 기본값(empty)이어도, home_mailbox를 제대로 해두면 동작했던 것 같다. 원한다면 procmail을 쓸 수도 있는데 필자는 procmail에 대해 거의 아는 것이 없다.

여기서 Dovecot SASL은 설정하지 않아도 local에서 mutt 등의 MUA를 이용하면 메일을 보내거나 받는 것이 가능하다. 이 기능을 쓰려면 당연히 dovecot을 설치하고 적절히 설정해야 하는데, 이에 대해서는 별도의 게시물로 작성할 예정이다.

참고로 domainname이 없는 서버에서도 postfix를 사용하는 것이 가능하긴 하다. 그런데 IP 주소를 이용하여 메일을 보내려고 할 때 받는 사람 주소에 "user@127.0.0.1"처럼 적으면 메일이 가지 않을 것이다. 필자는 장기간의 검색을 통해 어렵게 이유를 알아내었는데, 결론은 IP 주소를 적을 때 [127.0.0.1]라고 적어야 한다는 것이다.

그리고 /etc/postfix/master.cf에서는 submission protocol 부분을 uncomment하였다. 이렇게 하면 587번 포트를 사용할 수 있다.

submission inet n       -       -       -       -       smtpd

문제가 있을 경우에는 /var/log/mail 등의 로그 파일을 참고하면 큰 도움이 되며, smtpd_tls_loglevel 등의 옵션을 사용하여 로그 수준을 변경하는 것도 도움이 된다. 그런데 필자가 삽질 다 해보고 최종 결론을 적은 것이라 위에 적힌대로만 하면 아마도 잘 동작할 것 같다.

  1. http://www.postfix.org/SASL_README.html
  2. http://www.postfix.org/TLS_README.html
  3. http://wiki2.dovecot.org/HowTo/PostfixAndDovecotSASL

Mail Agent Overview

필자도 자세한 것은 모르지만, 메일관련 프로그램은 5가지 정도로 분류된다. 아래 정리된 설명은 조금 불완전할 수도 있다. 설명이 짧은 항목은 위키에서 보고 적은 것이므로 대충 맞겠지만, 설명이 긴 항목일 수록 개인적인 의견이 많이 섞여 있고 틀린 내용이 있을지도 모른다.
  • Mail User Agent (MUA)
    사용자 클라이언트이다. MS 아웃룩, 모질라 썬더버드, mutt 등이 그 예이다.
  • Mail Transfer Agent (MTA)
    넓은 의미로는 MUA를 제외하고는 전부 MTA이지만, 세분화해서 말하면 MTA는 메일을 실제로 다른 서버 등과 주고 받는 프로그램이다. 예를 들면 sendmail, postfix, exim, qmail 등이 있다. SMTP를 사용하고 port 번호는 25번이다.
  • Mail Delivery Agent (MDA)
    받은 메일을 메일함(~/Maildir 등)에 전달하는 프로그램으로, procmail 등의 프로그램이 있다. 하지만 MTA가 간단한 MDA 역할을 하기도 한다. 즉, procmail을 서버에 설치하지 않아도 기본적인 기능은 동작한다.
  • Mail Submission Agent (MSA)
    MTA와 MSA의 구분을 필자도 정확히 모르겠다. MSA와 MTA를 언제부터 구분하기 시작했는지 잘 모르겠지만, 비교적 최근에 구분하기 시작한 것 같다. MUA에서 메일을 직접 받는 것은 MSA라고 하고, MSA에서 메일을 받는 것이 MTA이다. MSA는 SMTP와 비슷한 프로토콜을 사용하는데 포트 번호는 587번이다. MSA가 만들어진 것 자체는 어느정도 지난 것 같지만, 그동안 MUA에서 587번 포트를 안 쓰고 25번 포트를 써왔던 것으로 기억한다. 그런데 스팸 메일을 차단하는 것 등의 목적으로 25번 포트를 제한하게 되면서 587번 포트가 본격적으로 사용되기 시작한 것 같다.
  • Mail Retrieval Agent (MRA)
    원격 메일함에서 메일을 가져온다. 예를 들면 fetchmail, getmail 등이 있다. 필자는 사용해보지 않았다. 참고로 MRA는 RFC 5598에 없는 내용이고, Wikipedia에서는 메일 전달 과정에서 받는 쪽 MUA 직전의 단계를 MRA라고 하고 있다.
Dovecot 등의 서버는 위 분류에서 어디에 들어갈지 모르겠다. Dovecot은 IMAP, POP 서버의 역할을 하는데, MRA로 분류되는 fetchmail은 IMAP 등을 통해서 메일을 가져오는 것이므로 dovecot과 성격이 다른 것 같다. 그런데 Wikipedia의 설명대로라면 Dovecot을 MRA인 것 같기도 하다.

또, dovecot은 Simple Authentication and Security Layer (SASL) 기능도 제공한다. 그리고 postfix나 exim에서 SASL을 통해 SMTP 인증(authentication)을 하게 된다. 적어도 내가 알기로는 postfix에서 SMTP 인증을 쓰기 위해 dovecot과 같은 별도의 프로그램이 필요한데, 왜 postfix에서 자체적으로 SASL 기능을 포함하지 않았는지 생각을 해보았다. 따지고 보면 postfix는 IMAP이나 POP도 지원하지 않고, 단순하게 들어오는 메일을 받거나, 나가야할 메일을 보내는 역할정도만 한다. Dovecot 없이 postfix만 설치해도 local에서 메일을 보내는 것은 잘 된다. 그런데 외부에서 SMTP로 들어오는 메일을 전부 처리하면 내 서버는 스팸 메일의 경유지가 될 것이므로, local에서 전송되는 메일 또는 local이 최종 목적지인 메일만 처리하는 편이 좋을 것이다. 즉, postfix 등의 MTA는 local 외부에서 사용되는 MUA를 제대로 지원하지 않고 있는 것이다. 그래서 dovecot 같은 것을 설치해야 IMAP 또는 POP을 통해 MUA가 메일을 가져갈 수 있고, SMTP를 통해 MUA가 메일을 보낼 수 있는 것이다. 여기서 SMTP의 경우 MUA는 MTA에 직접 접속하지만 dovecot이 없으면 SMTP 인증 기능은 사용할 수 없는 것으로 생각하면 될 것 같다.

결론적으로, IMAP이나 POP은 받는쪽 MTA와 받는 쪽 MUA를 매개하고, SASL은 보내는 쪽 MUA와 보내는 쪽 MTA의 연결에서 인증 기능을 담당하고 있다. 그러므로 dovecot 등의 프로그램은 MTA는 아니지만 MTA의 보조적인 기능을 담당하고 있는 것이라고 생각하면 될 것 같다.

마지막으로 dovecot은 Local Delivery Agent (LDA) 기능도 하는데 써보지는 않았다.

자세한 내용을 원하면 다음 문서를 읽어보면 된다. RFC 문서들은 링크한 것 이외에도 많이 있는데, 사실 난 거의 읽어보지 않았다. 기본 개념만 알기 원하는 것이라면 Wikipedia나 mutt, dovecot 사이트의 설명을 읽어보는 편이 도움이 될 것이다.