이번 포스트는 Postfix의 설치 입니다.
Postfix는 1998년에 최초로 개발되었고, 현재까지도 지속적으로 업데이트를 받고 있습니다. Linux 및 Unix 플랫폼 기반의 소프트웨어 이므로, Windows는 지원하지 않습니다.(Ubuntu 리눅스 만세???) 리눅스에서는 본디 Sendmail이라는 SMTP 프로그램을 많이 써왔는데, postfix로 모두 대체되는 추세이고, postfix는 dovecot, Amavisd같은 다른 역할을 하는 프로그램들과 잘 연동이 됩니다.
패키지 설치는 여타의 다른 프로그램과 별반다르지는 않습니다.
진행 과정을 실제 설치화면을 곁들여 이해를 돋궈 드리고자 합니다.
패키지 설치 명령어를 치면, 다수의 제안하는 패키지가 함께 설치 됩니다. 반복드리는 말씀이지만, Ubuntu의 패키지 관리시스템은 이렇게 자동으로 필요한 패키지를 자동으로 불러들여 같이 설치해주니 리눅스 초심자에게 아주 편리합니다.
화면이 그래픽모드로 UI로 바뀌며, 2가지 설정을 요구합니다. 우리는 NAS에 메일서버를 두고자 하므로 “인터넷 사이트”를 선택합니다. NAS가 MTA, MDA 역할을 해줄 것 입니다.(MTA? MDA 뭔소리냐? 메일서버 1강 바로가기 GoGo )
메일주소가 될 도메인명을 써줍니다.(도메인은 별도로 구입하셔야 합니다.) 여기서 FQDN의 개념을 잠깐 설명하면, 도메인은 여러개의 호스트를 가질 수 있습니다.
www.naver.com
mail.naver.com
cafe.naver.com
등등…. naver.com이라는 도메인은 많은 수의 호스트를 가질 수 있습니다.(서브 도메인이라고도 합니다) FQDN이란 www.naver.com로 할건지, mail.naver.com로 할건지 메일주소를 명확히 하라는 것 입니다.
보통의 메일주소는 @gmail.com , @daum.net , @naver.com 등으로 끝납니다. 그래서 우리도 그냥 도메인 주소로 적어 줍니다. 원한다면 @mail.XXX.XXX 형식도 가능은 합니다만, 대부분의 사람들은 이렇게 쓰진 않죠.
도메인주소까지 입력하였다면, 나머지 설치가 자동으로 진행됩니다. 혹시, 도메인명을 잘못 입력하셨다면 설정파일에서 다시 수정할 수 있으니 염려하지 않으셔도 됩니다.
Postfix와 관련한 국내외 블로그 포스팅은 셀 수 없이 많습니다. 하지만, 리눅스 배포판의 차이도 있고, Postfix의 버젼도 차이가 있을 수 있으며, 무엇보다 메일서버를 어떤 조건으로 설정할 것인지 그런 환경적 변수들이 사람마다 모두 다르므로 그냥 아무 생각없이 Copy-Paste는 잘 작동하지 않을 가능성이 높습니다.
제 설정 환경을 다시 한번 확인해 보고 진행합니다.
- Ubuntu 18.04
- Postfix 3.3.0
- 메일서버 환경 : 단일 NAS내 Postfix, MySQL, Dovecot(IMAP/POP service) 모두 설치, 사용자 메일도 NAS 파일시스템내 보관
Postfix의 설치버젼은 위에서 이미지 캡쳐한 것처럼 패키지매니저로 설치시점에 알수 있지만, 설치하고 나서도 아래 명령을 통해서도 알 수 있습니다.
먼저 공부를 시작하기 전에, 아래의 커맨드를 터미널을 통해 실행해 봅니다.
Postfix가 내장한 거의 1천줄에 가까운 환경설정 라인들이 화면에 출력되실 겁니다. 물론 대부분의 설정라인들은 건드릴 필요가 없으며, 사용자가 직접 만져줘야 하는건 몇라인 안됩니다(물론 이것 조차도 지난 포스팅의 프로그램들과 비교하면 양이 많습니다)
Postfix 설치가 끝나셨다면, 이제 설정파일을 열어 내용을 간단히 파악해 봅니다. 설정파일의 위치는 /etc/postfix/main.cf 입니다. 100줄이 안됩니다. 즉, main.cf는 메일서버의 독립적 환경설정을 지정해 주는 곳이므로 여기에 나온 설정만 잘해주면 나머지 설정은 별도로 조정할 필요가 없습니다.
모든 옵션을 일일히 설명하는 것은 제 능력으로는 불가능합니다. 각 옵션에 대해 자세히 알고 싶으시다면 Postfix 홈페이지에 Documentation을 읽어보시기 바랍니다. http://www.postfix.org/
그 보다 제가 Postfix를 다루면서 하도 고생을 많이해서 차라리 기존과 변경부분을 식별해서 보여드리는게 나을 것 같아 아래 표를 만들어 봤습니다.
Configuration Parameter | 기존(Original) | 변경(Changed) |
smtpd_banner | $myhostname ESMTP $mail_name (Ubuntu) | $myhostname ESMTP $mail_name (Ubuntu) |
biff | no | no |
append_dot_mydomain | no | no |
readme_directory | no | no |
compatibility_level | 2 | 2 |
smtpd_tls_cert_file | /etc/ssl/certs/ssl-cert-snakeoil.pem | /etc/letsencrypt/live/mail.good-daddy.com/fullchain.pem |
smtpd_tls_key_file | /etc/ssl/private/ssl-cert-snakeoil.key | /etc/letsencrypt/live/mail.good-daddy.com/privkey.pem |
smtpd_use_tls | yes | yes |
smtpd_tls_session_cache_database | btree:${data_directory}/smtpd_scache | |
smtp_tls_session_cache_database | btree:${data_directory}/smtp_scache | |
smtp_tls_security_level | may | |
smtpd_tls_auth_only | yes | |
smtpd_sasl_type | dovecot | |
smtpd_sasl_path | private/auth | |
smtpd_sasl_auth_enable | yes | |
broken_sasl_auth_clients | yes | |
smtpd_sasl_security_options | noanonymous | |
smtpd_sasl_local_domain | ||
smtpd_sasl_authenticated_header | yes | |
smtpd_sender_restrictions | permit_sasl_authenticated, permit_mynetworks, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit | |
smtpd_sasl_auth_enable | yes | |
broken_sasl_auth_clients | yes | |
smtpd_sasl_security_options | noanonymous | |
smtpd_recipient_restrictions | permit_sasl_authenticated, reject_unauth_destination, warn_if_reject, check_policy_service inet:localhost:12340 | |
smtpd_relay_restrictions | permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination | permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination |
myhostname | gooddaddy-IPXCR-VN1 | gooddaddy-IPXCR-VN1 |
alias_maps | hash:/etc/aliases | hash:/etc/aliases |
alias_database | hash:/etc/aliases | hash:/etc/aliases |
myorigin | /etc/mailname | /etc/mailname |
mydestination | $myhostname, good-daddy.com, gooddaddy-IPXCR-VN1, localhost.localdomain, localhost | |
relayhost | ||
mynetworks | 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 | 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 |
mailbox_size_limit | 0 | 0 |
recipient_delimiter | + | + |
inet_interfaces | all | all |
inet_protocols | all | all |
virtual_alias_maps | proxy:mysql:/etc/postfix/mysql/virtual_alias_maps.cf | |
virtual_mailbox_domains | proxy:mysql:/etc/postfix/mysql/virtual_domains_maps.cf | |
virtual_mailbox_maps | proxy:mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf | |
virtual_mailbox_base | /home/vmail | |
home_mailbox | Maildir/ | |
virtual_mailbox_limit | 5120000000 | |
virtual_minimum_uid | 5000 | |
virtual_transport | virtual | |
virtual_uid_maps | static:5000 | |
virtual_gid_maps | static:5000 | |
local_transport | virtual | |
local_recipient_maps | $virtual_mailbox_maps | |
content_filter | smtp-amavis:[127.0.0.1]:10024 |
회색 영역은 초기 값과 변경 값이 차이가 없는 파라메터들이고, 노란색 영역이 초기 값대비 서버 환경에 따라 변경한 부분 입니다.
이해를 돋구고자 만들어 본 테이블 입니다.
Postfix의 환경설정 변수들의 의미는 다음 포스트 부터 차근차근 이해해가면 됩니다.
이해는 모르겠고, 닥치고 설치를 해야 하실 성격 급하신 분들은 아래의 main.cf 파일을 그대로 Copy해서 쓰시면 되겠습니다.
main.cf의 설정이 끝나면, master.cf도 바꿔줘야 합니다.
master.cf의 설정은 직관적으로 이해가 되지 않으므로, 그대로 복사해서 쓰시면 될 것 같습니다.
하지만, 기본적으로 타인의 설정을 그대로 떠다가 쓰시는 건 별로 추천드리지 않습니다. 몇가지 이유가 있는데요.
- 포스트 작성자의 내용이 항상 100% 옳다고 보장할 수 없습니다.
- 포스트 작성자의 설정이 포스트 구독자의 환경과 다를 수 있습니다.
- 포스트 작성 시점과 그 이후에 큰 환경적 변동이 발생 되었을 수 있습니다.
이번 포스트는 Postfix 설치로 끝맺으며, 다음 포스트 부터는 이메일 사용자 메일박스를 만들겠습니다. 더불어 Postfix의 환경변수에 대해 설명도 덧붙히겠습니다.
글을 보고 메일서버 구축을 시도 중입니다. 본문의 설정과 거의 동일하게 진행했는데 Postfix 자체가 프로세스는 켜져 있어도(active인데 exited라고 뜹니다.)
메일 송수신이 안되는 것 같더라고요… 혹시 포트 사용에 관해 별도로 컨트롤할 수 있는 부분이 있는건가요..?
아니면 원인이 무엇일까 싶습니다. 혹시 서버 환경에 따라 설정이 상이한 부분을 제가 놓친 건가 싶기도 하고요…
혹시나 싶어서 같이 보여드립니다.
https://prws.kr/main.txt
https://prws.kr/master.txt
각각 main.cf, master.cf 파일 내용입니다.
안녕하세요.
sudo service postfix status 명령을 통해 Active : active (exited)라는 결과물은 해당 프로그램이 잘 실행되고 있다는 메세지 입니다.
메일송수신이 되고 안되고는 최종 결과물인 상태이므로 여러가지 이유가 있을 수 있습니다. 설정은 제가 설정한 내용을 거의 그대로 copy하신것 같아 보입니다.
sudo netstat -nptl 명령을 통해서 master 데몬이 PORT 25와 PORT 587을 개방하고 있는지 한번 확인해 보십시오.
만일 개방되어 있지 않다면 main.cf 또는 master.cf 파일상의 설정이 잘못된 경우이고,
개방이 되어 있다면 postfix가 문제가 아니고 dovecot 및 외부 클라이언트와 같은 MUA쪽의 문제일 수 있습니다.