자신만의 도메인을 사용하여 이메일 서버를 구축 할 수 있습니다.

자신의 이메일 서버를 구축하면 다음 장점이 있습니다.

  1. 자신만의 도메인 사용
  2. 외부 영향이 없는 독립적 사용 가능
  3. 자유로운 메일 용량
  4. 보안

본 포스트는 PostgreSQL에 가상 유저정보를 저장하여, 가상 이메일 주소를 만들어 보겠습니다.

준비

도메인이 필요 합니다.

GoDaddy등에서 도메인을 발급 받으면 됩니다.

만약 클라우드 서버를 이용할 시, 25번 포트가 차단되어있는지 확인해야 합니다. Vultr, GCP는 25번 포트를 차단한다고 알려져 있으니 유의하세요.

여기서는 Digitaloceand을 사용하겠습니다.

방화벽 설정

다음 TCP 포트를 개방합니다.

  • 25
  • 465
  • 993
  • 995

DNS

dns를 설정합니다.

메일 도메인으로 mail.domain.com 을 사용하는 예시

형식 이름 콘텐츠
A mail server-ip
AAAA mail server-ipv6
MX domain.com mail.domain.com

cloudflare 사용 시 프록시를 꺼야 합니다.

TLS 인증서

Let's Encrypt를 활용하여 인증서를 발급 합니다.

Certbot으로 무료 HTTPS 인증서 발급받기
Let’s Encrypt - Free SSL/TLS CertificatesLet’s Encrypt is a free, automated, and open certificate authority brought to you by the nonprofit Internet Security Research Group (ISRG).Free SSL/TLS CertificatesLet’s Encrypt라는 비영리 기관을 통해 무료로 TLS인증서를 발급받을수 있습니다. 루트 도매인, 서브 도매인, 와일드카드 도매인 인증서까지 무료로 발급

Postfix 설치

postfixSMTP 통신을 위한 MTA 입니다.

다음 명령어로 postfix 를 설치 합니다.

apt install postfix

Internet Site 를 선택 합니다.

자신이 사용할 메일 도메인을 지정합니다. (@뒷 부분)

만약 자신의 메일이 [email protected]일 시 mail.vompressor.com 을 입력 합니다.

postfix 를 통하여 메일을 전송 하겠습니다.

apt install mailutils

mailutils 를 설치 합니다.

다음 명령어를 입력한 후 자신의 메일함에 메일이 수신 되는지 확인 합니다. 스팸메일로 분류될 수 있으니 스팸함도 확인하세요.

echo "Test email being sent." | mail -s "Test Email Subject" [email protected]

서버 환경에 따라 메일이 전송되지 않을 수도 있습니다.

postfix의 로그는 /var/log/mail.log 파일입니다.

postfix 설정

기본 설정

아래를 참고하여 설정 파일을 수정하세요.

myhostname = [email domain address]
[주석 처리] # alias_maps = hash:/etc/aliases
[주석 처리] # alias_database = hash:/etc/aliases
myorigin = /etc/mailname
[주석 처리] # mydestination = $myhostname, mail.vompressor.com, localhost.vompressor.com, , localhost
[추가] mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

설정 예시

myhostname = mail.vompressor.com
# alias_maps = hash:/etc/aliases
# alias_database = hash:/etc/aliases
myorigin = /etc/mailname
# mydestination = $myhostname, mail.vompressor.com, localhost.vompressor.com, , localhost
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

TLS 설정

다음 내용을 참고하여 TLS 설정을 작성 합니다.

smtpd_tls_cert_file=[Let's Encrypt fullchain.pem file]
smtpd_tls_key_file=[Let's Encrypt privkey.pem file]

smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_loglevel = 2
smtp_tls_loglevel = 2
smtpd_tls_received_header = yes
smtp_tls_CApath = /etc/ssl/certs
smtpd_tls_CApath = /etc/ssl/certs

다음 내용을 이어서 작성합니다.

아래 내용은 SMTP 에서 사용할 TLS 버전과 치퍼를 설정 합니다.

smtpd_tls_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtpd_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
tls_preempt_cipherlist = yes

위를 입력 후 기본 설정을 수정합니다.

스팸, 릴레이 차단

아래 내용을 추가합니다.

자신의 smtp 서버에 스팸 릴레이를 차단하는 내용을 작성합니다.

header_checks = pcre:/etc/postfix/pcre_headers
smtpd_client_restrictions =
  check_client_access hash:/etc/postfix/client_access
  check_sender_access hash:/etc/postfix/sender_email_access
  reject_unknown_reverse_client_hostname
  reject_rbl_client zen.spamhaus.org
  reject_rbl_client bl.spamcop.net
  reject_rbl_client dnsbl.sorbs.net
smtpd_helo_restrictions =
  reject_invalid_helo_hostname
  reject_unknown_helo_hostname
smtpd_sender_restrictions =
  reject_unknown_sender_domain
  reject_non_fqdn_sender
smtpd_recipient_restrictions =
  reject_unknown_recipient_domain
  reject_unauth_pipelining
  permit_mynetworks
  permit_sasl_authenticated
  defer_unauth_destination
smtpd_relay_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  defer_unauth_destination
smtpd_data_restrictions =
  reject_unauth_pipelining
  permit

#

현재 제 서버에서 사용하는 설정입니다.

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2


# Default parameters
myhostname = mail.vompressor.com
myorigin = /etc/mailname
mydestination = localhost
mynetworks = 127.0.0.0/8 [::1]/128
relay_domains =
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all


# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.vompressor.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.vompressor.com/privkey.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_loglevel = 2
smtp_tls_loglevel = 2
smtpd_tls_received_header = yes
smtp_tls_CApath = /etc/ssl/certs
smtpd_tls_CApath = /etc/ssl/certs

smtpd_tls_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high
smtpd_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtpd_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_mandatory_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
smtp_tls_exclude_ciphers = MD5, DES, ADH, RC4, PSD, SRP, 3DES, eNULL, aNULL
tls_preempt_cipherlist = yes


# Mail handling
header_checks = pcre:/etc/postfix/pcre_headers
smtpd_client_restrictions =
  check_client_access hash:/etc/postfix/client_access
  check_sender_access hash:/etc/postfix/sender_email_access
  reject_unknown_reverse_client_hostname
  reject_rbl_client zen.spamhaus.org
  reject_rbl_client bl.spamcop.net
  reject_rbl_client dnsbl.sorbs.net
smtpd_helo_restrictions =
  reject_invalid_helo_hostname
  reject_unknown_helo_hostname
smtpd_sender_restrictions =
  reject_unknown_sender_domain
  reject_non_fqdn_sender
smtpd_recipient_restrictions =
  reject_unknown_recipient_domain
  reject_unauth_pipelining
  permit_mynetworks
  permit_sasl_authenticated
  defer_unauth_destination
smtpd_relay_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  defer_unauth_destination
smtpd_data_restrictions =
  reject_unauth_pipelining
  permit

테스트

다음 커맨드를 입력하여, 자신의 postfix 서버가 작동하는지 확인하세요.

echo "Test email being sent." | mail -s "Test Email Subject" [email protected]