logo

한국어

출처: https://hooni.net/87009


[Postfix]

리눅스 계열이나 버전에 따라 기본으로 사용하는 MTA(Mail Transfer Agent)가 다를 수 있다.

CentOS(레드햇 계열)에서는 Sendmail이 기본 MTA로 설정되어 있고 우분투에서는 Postfix를 기본 MTA로 설정되어 있다. 개인적으로 Sendmail 보다는 Postfix는 빠르고 관리와 보안이 수월하다. 그리고 Sendmail과 호환이 된다.


설치에 앞서 메일서버에서 사용하는 기본적인 포트 번호를 알아두고 설치 후 방화벽에 적용하자.

smtp(25), smtps(465), pop3(110), pop3s(995), submission(587, pop3 대체 포트)




1. yum 을 이용해 postfix 설치

[root@hooni ~] yum -y update
[root@hooni ~] yum -y install postfix




2. hosts 파일 설정

[root@hooni ~]# vi /etc/hosts


127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1       localhost localhost.localdomain localhost6 localhost6.localdomain6
121.78.119.99 mail.hooni.net




3. SSL 인증서 생성

일반적으로 SSL 인증서는 공인된 인증기관(CA)에서 유료로 발급하지만 Let’s Encrypt라는 비영리 무료 개방형 이증 기관(CA)에서 무료로 발급 받을 수 있다.


Let's Encrypt 인증서 발급하는 방법은 이번 주제와 무관하므로 관련 링크를 첨부함

[참고] 무료로 HTTPS 적용하기 (Let's Encrypt)


여기서는 openssl 명령어를 이용해 로컬에서 직접 생성해서 이용하는 방법으로 설명하겠다.


SSL 관련 파일을 저장할 디렉토리 생성

[root@hooni ~]# mkdir /etc/postfix/ssl
[root@hooni ~]# cd /etc/postfix/ssl


openssl 이 설치되어 있지 않는 경우 yum을 이용해 설치

[root@hooni ssl]# yum -y install openssl


openssl 명령을 통해 개인키와 인증서 생성

[root@hooni ssl]# openssl req -x509 -nodes -newkey rsa:2048 -keyout server.key -out server.crt -nodes -days 365


다음 예와 같이 개인키에 대한 정보를 입력하고 생성

Generating a 2048 bit RSA private key
..........................+++
...........................+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:CA
Locality Name (eg, city) [Default City]:Irvine
Organization Name (eg, company) [Default Company Ltd]:Hooni.net
Organizational Unit Name (eg, section) []:S/W Develop
Common Name (eg, your name or your server's hostname) []:mail.hooni.net
Email Address []:me@hooni




4. Postfix 설정파일 수정 (/etc/postfix/main.cf)

[root@hooni ~]# vi /etc/postfix/main.cf


myhostname = mail.hooni.net
mydomain = hooni.net
myorigin = $mydomain
home_mailbox = mail/
mynetworks = 127.0.0.0/8
inet_interfaces = all
inet_protocols = all
inet_interfaces = localhost
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_key_file = /etc/postfix/ssl/server.key
smtpd_tls_cert_file = /etc/postfix/ssl/server.crt
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom




5. Postfix 설정파일 수정 (/etc/postfix/master.cf)

[root@hooni ~]# nano  /etc/postfix/master.cf


# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd


 다음과 같이 해당 영역의 주석을 제거한다.

submission     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       n       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING




6. Dovecot 설치

[root@hooni ~]# yum -y install dovecot




7. Dovecot 설정파일 수정 (/etc/dovecot/conf.d/10-master.cf)

[root@hooni ~]# vi /etc/dovecot/conf.d/10-master.conf


다음과 같이 해당 영역의 주석을 제거한다.

# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}




8. Dovecot 설정파일 수정 (/etc/dovecot/conf.d/10-auth.cf)

   nano /etc/dovecot/conf.d/10-auth.conf


다음과 같이 'login' 키워드를 추가한다.

# Space separated list of wanted authentication mechanisms:
#   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
#   gss-spnego
# NOTE: See also disable_plaintext_auth setting.
auth_mechanisms = plain




9. Dovecot 설정파일 수정 (/etc/dovecot/conf.d/10-mail.cf)


다음과 같이 해당 영역의 주석을 제거하고 maildir을 설정.

mail_location = maildir:~/mail




10. Dovecot 설정파일 수정 (/etc/dovecot/conf.d/20-pop3.cf)

[root@hooni ~]# vi /etc/dovecot/conf.d/20-pop3.conf


다음과 같이 해당 내용의 주석을 제거한다.

# Note that Outlook 2003 seems to have problems with %v.%u format which was
# Dovecot's default, so if you're building a new server it would be a good
# idea to change this. %08Xu%08Xv should be pretty fail-safe.
#
pop3_uidl_format = %08Xu%08Xv




11. Postfix와 Devecot 실행 및 서비스 등록

설정파일이  반영되도록 Postfix와 Devecot를 재시작 하고 시스템이 재부팅되면 자동으로 실행되도록 서비스에 등록한다.

[root@hooni ~]# systemctl restart postfix
[root@hooni ~]# systemctl enable postfix
[root@hooni ~]# systemctl restart dovecot
[root@hooni ~]# systemctl enable dovecot




12. 방화벽에 서비스 관련 포트를 적용

[root@hooni ~]# firewall-cmd --permanent --add-service=smtp
[root@hooni ~]# firewall-cmd --permanent --add-port=587/tcp
[root@hooni ~]# firewall-cmd --permanent --add-port=465/tcp
[root@hooni ~]# firewall-cmd --permanent --add-port=110/tcp
[root@hooni ~]# firewall-cmd --permanent --add-service=pop3s
[root@hooni ~]# firewall-cmd --permanent --add-port=143/tcp
[root@hooni ~]# firewall-cmd --permanent --add-service=imaps
[root@hooni ~]# firewall-cmd --permanent --add-service=http
[root@hooni ~]# firewall-cmd --reload




13. 서비스 확인하기

텔넷 명령어(telnet)를 통해 각 서비스의 해당 포트로 접속해서 잘 작하는지 확인할 수 있다.


telnet 클라이언트가 없다면 설치한다.

[root@hooni ~]# yum -y install telnet


telnet 명령으로 smtp 서비스에 접속한다.

[root@hooni ~]# telnet mail.hooni.net smtp


접속 후 ehlo mail.hooni.net 명령 실행 후 다음과 같이 출력되면 잘 동작하는 것이다.

Trying 121.78.119.99...
Connected to localhost.
Escape character is '^]'.
220 mail.hooni.net ESMTP Postfix
ehlo mail.hooni.net
250-mail.hooni.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN


다음과 같은 명령을 사용하여 콘솔에서 메일을 발송할 수 있다.

mail from:hooni@test.com
mail from:hooni@test.com
250 2.1.0 Ok
rcpt to:picomax@test.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
This is a kind of test email.
It would be finished when you put a period at the end of the document.
.
250 2.0.0 Ok: queued as 655A4C1C08




telnet 명령으로 pop3 서비스에 접속한다.

[root@hooni ~]# telnet mail.hooni.net pop3


다음과 같은 내용이 출력되면 정상적으로 동작하는 것이다.

Trying 121.78.119.99...
Connected to mail.hooni.net.
Escape character is '^]'.
+OK Dovecot ready.


등록된 사용자 계정으로 로그인을 시도해보자.

user picomax
+OK
pass Password
+OK Logged in.
retr
-ERR There's no message 1.
quit
+OK Logging out.
Connection closed by foreign host.