Postfix MTA
### AWS SES / Postfix 연동 가이드
http://docs.aws.amazon.com/ko_kr/ses/latest/DeveloperGuide/postfix.html
### Postfix install
- Amazon Linux
[root@ip-10-90-10-49 ~]# yum install postfix
Installed:
postfix.x86_64 2:2.6.6-2.15.amzn1
Dependency Installed:
mysql55-libs.x86_64 0:5.5.57-1.18.amzn1
postgresql92-libs.x86_64 0:9.2.22-1.61.amzn1
- Redhat Linux
[root@ip-10-90-10-54 ~]# yum install postfix
Package 2:postfix-2.10.1-6.el7.x86_64 already installed and latest version
[root@ip-10-90-10-54 ~]# rpm -qa | grep postfix
postfix-2.10.1-6.el7.x86_64
- Ubuntu Linux
root@ip-10-90-10-130:~# apt install postfix
root@ip-10-90-10-130:~# apt list postfix
Listing... Done
postfix/xenial,now 3.1.0-3 amd64 [installed]
- Suse Linux
ip-10-90-10-249:~ # zypper install postfix
Refreshing service 'SMT-http_smt-ec2_susecloud_net'.
Refreshing service 'cloud_update'.
Loading repository data...
Reading installed packages...
Resolving package dependencies...
Problem: sendmail-8.14.9-2.80.x86_64 conflicts with postfix provided by postfix-2.11.8-27.11.x86_64
Solution 1: deinstallation of sendmail-8.14.9-2.80.x86_64
Solution 2: do not install postfix-2.11.8-27.11.x86_64
ip-10-90-10-249:~ # zypper info postfix
Repository : SLES12-SP2-Pool
Name : postfix
Version : 2.11.8-27.11
### Postfix Configure
http://www.postfix.org/BASIC_CONFIGURATION_README.html#syntax
postfix MTA 는 크게 2가지의 설정파일을 같는다.
[main.cf]
- SOFT BOUNCE
#soft_bounce = no
ㄴ 기본적으로 주석 처리가 되어 있다. soft_bounce 가 활성화되면 Local bounce 를 비활성화 하고 5xx 응답을 4xx 응답으로 변경하여서 smtp 서버가 mail 를 영구적으로 reject 하는것을 방지 합니다.
- LOCAL PATHNAME INFORMATION
queue_directory = /var/spool/postfix
ㄴ Postfix queue 의 위치를 설정합니다. chroot 를 실행하는 postfix daemon 의 root 디렉토리이기도 합니다.
command_directory = /usr/sbin
ㄴ postXXX 의 명령에 대한 위치를 지정합니다. postXXX 의 실행파일이 있는 위치 입니다.
daemon_directory = /usr/libexec/postfix
ㄴ postfix daemon 이 위치할 디렉토리 설정 입니다. 해당 디렉토리는 root 가 소유해야 합니다.
data_directory = /var/lib/postfix
ㄴ postfix 의 쓰기 가능한 데이터 파일 (caches, random numbers)의 위치를 지정합니다. 해당 디렉토리는 mail_owner 가 소유해야 합니다.
- QUEUE AND PROCESS OWNERSHIP
mail_owner = postfix
ㄴ postfix daemon process 의 소유자 및 queue 에 대한 소유자를 지정합니다. 사용자 및 GID 를 다른계정과 공유하면 안되며, 시스탬의 다른 파일이나 프로세스를 소유하지 않는 사용자 계정으로 지정하시기 바랍니다. 특히 nobody 나 daemon 과같이 널리 알려진 계정은 권장하지 않습니다.
#default_privs = nobody
ㄴ local delivery agent 가 external file 이나 command 에 사용되는 기본 권한을 지정 합니다. "내부 사용자 혹은 postfix owner 로 지정하지 마십시요"
- INTERNET HOST AND DOMAIN NAMES
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
ㄴ 메일 시스템의 호스트 이름을 지정합니다. 기본값은 gethostname() 의 결과값으로 사용이 됩니다. $myhostname 은 다른 설정 parameter 의 기본값으로 사용 됩니다.
#mydomain = domain.tld
ㄴ local insternet domain 이름을 지정합니다. 기본값은 $myhostname 에서 첫번째 구성요소를 뺀 값을 사용합니다. $mydomain 은 다른 설정 parameter 의 기본값으로 사용 됩니다.
- SENDING MAIL
#myorigin = $myhostname
#myorigin = $mydomain
ㄴ 메일이 local 에서 보내진것들에 대한 도메인을 지정합니다.
- RECEIVING MAIL
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = localhost
ㄴ 메일을 수신하는 interfaces address 를 지정합니다.
inet_protocols = all
ㄴ IPv4 와 IPv6 의 사용여부
#proxy_interfaces =
#proxy_interfaces = 1.2.3.4
ㄴproxy 나 nat 등을 통해 메일을 수신하는경우 ip address 를 지정합니다. 구성된 시스템이 백업 MX host 인경우 proxy / nat 를 지정해야 합니다.
mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain
ㄴ 이 시스템이 최종 사용자로 생각하는 도메인 목록을 지정합니다. local_transport parameter 로 세팅됩니다. 기본적으로 /etc/passwd 및 /etc/aliases 의 수신자와 동일합니다.
ㄴ 기본값은 $myhostname + localhost.$mydomain 입니다.
- REJECTING MAIL FOR UNKNOWN LOCAL USERS
#local_recipient_maps = unix:passwd.byname $alias_maps
#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
#local_recipient_maps =
ㄴ $mydestination, $inet_interfaces, $proxy_interfaces 와 관련된 local 사용자 및 주소를 조회하는 테이블을 지정합니다.
ㄴ 변수가 지정되면 알수없는 local 사용자에 대한 메일을 거부합니다.
ㄴ 기본적으로 local delivery agent 를 사용한다고 설정됩니다.
ㄴ /etc/passwd 및 /etc/aliases 혹은 $virtual_alias_maps 이외의 파일에 정의되어 있는경우입니다. master.cf 의 local delivery agent 를 재정의합니다. main.cf 의 local_transport 설정을 재정의 합니다.
unknown_local_recipient_reject_code = 550
ㄴ $mydestination 이나 $local_recipient_maps 의 ${proxy,inet}_interfaces 가 아닌것에 대해 SMTP 응답코드를 지정합니다.
ㄴ 기본설정은 550 으로 되어 있지만 450 으로 응답을 주는것이 안전합니다.
- TRUST AND RELAY CONTROL
#mynetworks_style = class
#mynetworks_style = subnet
#mynetworks_style = host
ㄴ 신뢰할수 있는 client 에 대해서 설정을 합니다. 신뢰할수 있는 client 는 Postfix 를 통해서 relay 역활을 수행할수 있습니다.
ㄴ 대역을 직접 입력할수도 있고, Postfix 가 임의로 지정할수도 있습니다. Postfix 지정이 기본설정입니다.
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
ㄴ 수동으로 mynetworks 를 입력할수도 있습니다. 수동을 입력할경우 mynetwork_style 형식은 무시됩니다.
ㄴ 특정 ip 값이 아닌 파일 형식도 넣어줄수 있습니다.
#relay_domains = $mydestination
ㄴ Postfix 는 기본적으로 메일을 relay 합니다. relay_domain 은 메일을 relay 할 대상을 제한할수 있습니다.
- INTERNET OR INTRANET
#relayhost = $mydomain
#relayhost = [gateway.my.domain]
#relayhost = [mailserver.isp.tld]
#relayhost = uucphost
#relayhost = [an.ip.add.ress]
ㄴ transp[ort table 항목에 일치하지 않은 메일을 보낼 기본 호스트를 지정합니다.
- REJECTING UNKNOWN RELAY USERS
#relay_recipient_maps = hash:/etc/postfix/relay_recipients
ㄴ $relay_domains 일치하는 도메인의 값을 저장하는 테이블을 지정합니다. 이 기능이 enable 되면 SMTP 서버는 알 수 없는 relay 사용자에 대한 메일을 거부 합니다.
- INPUT RATE CONTROL
#in_flow_delay = 1s
ㄴ 메일 입력에 대한 흐름으르 제어 합니다. 메시지 도달속도가 배달 속도를 넘어설때 새 메시지를 수락하기전 위의 설정값 동안 일시 중단 됩니다.
- ALIAS DATABASE
#alias_maps = dbm:/etc/aliases
alias_maps = hash:/etc/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases
ㄴ alias database list 를 지정합니다. alias database 를 변경하게되면 "postalias /etc/aliases" 를 하거나 "newaliases" 로 db 파일을 작성하면 됩니다.
ㄴ 변경사항이 적용되려면 1~2분정도가 소요되며 즉시 변경된 사항을 적용하려면 "postfix reload" 를 통해서 하면 됩니다.
#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases
ㄴ "newaliases" 혹은 "sendmail -bi"로 빌드된 alias database 를 지정합니다. alias_maps 은 postfix 에 의해 제어되지 않는 table 을 지정할수 있기에 alias_database parameter 가 별도로 있습니다.
- ADDRESS EXTENSIONS (e.g., user+foo)
#recipient_delimiter = +
ㄴ 유저와 확장 주소에 대한 구분자를 추가해줍니다.
- DELIVERY TO MAILBOX
#home_mailbox = Mailbox
#home_mailbox = Maildir/
ㄴ 메일박스 위치 지정 설정
#mail_spool_directory = /var/mail
#mail_spool_directory = /var/spool/mail
ㄴ mail spool 디렉토리 지정
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
ㄴ postfix 메일이 아닌 외부 메일명령어를 사용할때에 사용되는 설정이다. 해당 설정은 $의 변수가 적용되지 않는다.
#mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
ㄴ transport 및 .forward 를 처리하고나서 사용할 master.cf 의 전송방식을 지정합니다. 해당 설정은 mailbox_commnad, fallback_transport, luser_relay 보다 우선적용 됩니다.
ㄴ unix 암호 파일이 없는 계정에 대해서 이 기능을 사용하는경우 main.cf 에 local_recipient_maps 을 설정해야 합니다. 그렇지 않으면 SMTP 가 "User unknown in local recipient table" 거부합니다.
# local_destination_recipient_limit = 300
# local_destination_concurrency_limit = 5
ㄴ cyrus-imapd 에 대한LMPT 의 튜닝은 위의 값으로 설정하면 된다. "mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp" 설정이 되어 있으면 cyrus 보다 우선순위기 높기에 cyrus 를 사용하지 않는다.
#mailbox_transport = cyrus
ㄴ cyrus 오래된 버전을 사용하는경우 위의 설정이 필요하다.
#fallback_transport = lmtp:unix:/var/lib/imap/socket/lmtp
#fallback_transport =
ㄴ unix passwd 에서 찾을수 없는 사용자에 대한 master.cf 전송방식을 설정합니다. 해당 설정은 luser_relay 보다 우선적용 됩니다.
#luser_relay = $user@other.host
#luser_relay = $local@other.host
#luser_relay = admin+$local
ㄴ 알수없는 수신자에 대한 주소를 지정합니다.
ㄴ unknown@$mydestination, unknown@[$inet_interfaces], unknown@[$proxy_interfaces] 이 해당됩니다.
- JUNK MAIL CONTROLS
#header_checks = regexp:/etc/postfix/header_checks
ㄴ SMTPD_ACCESS_README 에 자세한 내용이 설명되어 있습니다. man header_checks 를 참조하시기 바랍니다.
ㄴ header 에 대한 설정을 저정하는 table 을 지정합니다.
- FAST ETRN SERVICE
#fast_flush_domains = $relay_domains
ㄴ 지연된 메일에 대한 신속한 삭제 작업대상 도메인 설정을 합니다.
ㄴ ETRN_README document 를 참조바랍니다. ETRN domain.tld 혹은 sendmail -qRdomain.tld 명령을 통해 지연 메일을 삭제할수 있습니다.
- SHOW SOFTWARE VERSION OR NOT
#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
ㄴ 220 코드뒤에 나오는 인사말에 대한 설정 내용입니다.
ㄴ 텍스트 시작부분에는 $myhostname 을 지정해야 합니다. RFC 요구 사항입니다. 하지만 Postfix 에서는 형식을 지키지 않는다 해서 메일발송이 안되진 않습니다.
- PARALLEL DELIVERY TO THE SAME DESTINATION
#local_destination_concurrency_limit = 2
#default_destination_concurrency_limit = 20
ㄴ 메일 병렬 전송에 대한 설정 입니다. local 의 경우 2 가 기본값이며, 대부분의 전송값에 대한 기본값은 20 입니다.
- DEBUGGING CONTROL
debug_peer_level = 2
ㄴ 로깅 수준을 설정합니다.
#debug_peer_list = 127.0.0.1
#debug_peer_list = some.domain
ㄴ 로깅을 할 대상을 설정 합니다.
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
ㄴ Postfix daemon 프로그램이 -D 옵션과 함께 실행될때에 실행되는 외부 옵션을 설정합니다.
ㄴ "command ... & sleep 5" 를 사용해서 프로세스가 올라오기전 디버거가 함께 동작할수 있도록 합니다.
- INSTALL-TIME CONFIGURATION INFORMATION
sendmail_path = /usr/sbin/sendmail.postfix
ㄴ Postfix sendmail command 의 경로 설정 입니다.
newaliases_path = /usr/bin/newaliases.postfix
ㄴ Postfix newaliases command 의 경로 설정 입니다.
mailq_path = /usr/bin/mailq.postfix
ㄴ Postfix mailq command 의 경로 설정 입니다.
setgid_group = postdrop
ㄴ mail submission 과 queue 의 management commands 관리 그룹 설정 입니다. 타 계정과 공유되지 않는 GID 가 있어야 하며, Postfix 계정이 아니어야 합니다.
html_directory = no
ㄴ Postfix html 문서위치 설정입니다.
manpage_directory = /usr/share/man
ㄴ Postfix Man page 위치 입니다.
sample_directory = /usr/share/doc/postfix-2.6.6/samples
ㄴ Postfix Sample 설정 파일 위치 입니다. 해당 설정은 Postfix 2.1부터 사용되지 않습니다.
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
ㄴ Postfix Readem 파일의 위치 설정 입니다.
### Postfix 주요 Readme 파일
- ADDRESS REWRITING
ADDRESS_REWRITING_README document
- ADDRESS REDIRECTION (VIRTUAL DOMAIN)
VIRTUAL_README document
- "USER HAS MOVED" BOUNCE MESSAGES, TRANSPORT MAP
ADDRESS_REWRITING_README document