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








+ Recent posts