본문 바로가기
리눅스

Postfix (software)

by 다움위키 2016. 11. 2.
기간을 특정할 수 없지만, 언젠가부터 메일 서버가 스팸을 발송하는데 이용된 것으로 보입니다. Apache SpamAssassinAmavis를 이용해서 스팸을 걸러내는 작업을 하시기 바랍니다. 추가적으로 Greylisting을 적용할 수 있습니다. 만약, 그래도 지속적인 스팸 접근이 있으면, Ufw를 참조하셔서, 레벨 C 정도를 블록 처리할 수도 있습니다. 이렇게 해도, 외부에서 지속적인 접근 시도가 있으면, #Adjust the Firewall에서처럼, 로컬에서만 발송되도록 방화벽 규칙을 수정하십시오.

 
Postfix전자 우편을 라우팅하고 전달하는 자유오픈-소스 메일 전송 에이전트(mail transfer agent) (MTA)입니다.
그것은 자유 소프트웨어 라이선스, IBM 공용 라이선스 1.0 아래에서 출시됩니다. 대안적으로, 버전 3.2.5부터는, 사용자의 선택에 따라 이클립스 공용 라이선스 2.0 아래에서 사용할 수 있습니다.
원래 1997년 뉴욕의 IBM Thomas J. Watson Research Center에서 Wietse Venema에 의해 개발되었고, 1998년 12월에 처음 출시되었으며, Postfix는 2018년까지 계속해서 창작자 및 기타 공헌자에 의해 활발하게 개발되고 있습니다. 이 소프트웨어는 이전 이름 VMailerIBM Secure Mailer로 역시 알려져 있습니다.
2017년 12월에서, E-Soft, Inc.에 의해 수행된 연구는 공개적으로 도달할 수 있는 인터넷 메일 서버 중 34%를 Postfix가 실행되고 있으며 Exim에 이어 두 번째로 많이 사용되는 메일 서버입니다.
보통 개인이 운영하는 서버에서, 메일 서버를 구축하는 것은 필요성을 느끼지 못할 수 있습니다. 어쨌든, 여러 서비스를 운영 중이면, 서버에 문제가 생겼을 때, 관리자는 가능한 빠르게 이것을 알고 싶을 것입니다. 외부에서 실시간으로 서버를 감시하는 일은 비용이 들거나, 추가적인 지식이 필요할 수 있습니다. 비교적 간단한 방법은 특정 프로그램, 예를 들어 Monit 등이 서버를 감시하고 해당 프로그램에서 문제를 관리자에게 전자우편으로 알리도록 하는 것입니다. 이런 연유로 메일 서버는 전체 서버의 감시에 없어서는 안 될 지점에 있습니다.

Installation

  • sudo DEBIAN_PRIORITY=low apt-get install postfix
설치를 마무리하려면 몇가지 질문에 답해야 합니다.
  • General type of mail configuration?: Internet Site
  • System mail name: example.com (not mail.example.com)
  • Root and postmaster mail recipient: username
  • Other destinations to accept mail for: $myhostname, example.com, mail.example.com, localhost.example.com, localhost
  • Force synchronous updates on mail queue?: No
  • Local networks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
  • Mailbox size limit: 0
  • Local address extension character: +
  • Internet protocols to use: all

이후에 설정에 문제가 있어 다시 하고 싶으면:

  • sudo dpkg-reconfigure postfix

Configuration

home_mailbox

사용자의 홈 디렉토리아래에 Mairdir/를 만들어서 우편 전송에 사용하도록 설정할 수 있습니다.

  • sudo postconf -e 'home_mailbox= Maildir/'

virtual_alias_map

리눅스 시스템 계정에 대해 임의의 이메일 계정을 매핑하는 테이블을 만들 파일을 지정합니다.

  • sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'

Main account mapping

시스템 사용자를 메일 계정과 매핑하는 파일 /etc/postfix/virtual을 직접 편집해 줍니다. username에 시스템에 존재하는 사용자계정을 씁니다.

contact@example.com username
admin@example.com username

모든 시스템 사용자들에 대한 매핑이 끝나면, 이를 메일 서버에 알려줍니다.

  • sudo postmap /etc/postfix/virtual

서버에 대한 데이터가 바뀌었으므로 서버를 재시작합니다.

  • sudo systemctl restart postfix

Adjust the Firewall

방화벽에서 postfix 데이터를 통과시키도록 설정을 변경해야 합니다.

  • sudo ufw allow 25/tcp
  • sudo ufw allow 587/tcp

이런 식으로 열어 놓으면, 외부에서 릴레이 시도를 합니다. 만약, 로컬에서 외부로 전송을 할 때에는 다음과 같이 방화벽 규칙을 만드십시오.

  • sudo ufw allow from 127.0.0.1 to any port 25
  • sudo ufw allow from 127.0.0.1 to any port 587

Setting up the Environment to Match the Mail Location

메일 클라이언트를 설정하기 전에 클라이언트가 사용할 메일 환경 변수를 설정해야 합니다.

  • echo 'export MAIL=~/Maildir' | sudo tee -a /etc/bash.bashrc | sudo tee -a /etc/profile.d/mail.sh

현재 세션에서 환경변수를 아래와 같이 읽어드립니다.

  • source /etc/profile.d/mail.sh

Install and Configure the Mail Client

전송될 메일과 상호 작용을 위해서, s-nail 패키지를 설치할 것입니다. 이 패키지는 매우 다양한 기능을 가진 BSD xmail client의 변종 중에 하나입니다.

  • sudo apt-get install s-nail

설정 /etc/s-nail.rc을 변경해 줍니다.

# Startup into interactive mode even if the (given) mailbox is empty
set emptystart
set folder=Maildir
set record=+sent

Initialize the Maildir and Test the Client

이제 클라이언트에서 메일 전송이 잘 이루어지는지 확인을 할 차례입니다.

Initializing the Directory Structure

이제 클라이언트에서 메일 전송이 잘 이루어지는지 확인을 할 차례입니다.

Initializing the Directory Structure

메일 전송에 필요한 디렉토리 구조를 만드는 가장 쉬운 방법은 사용자 계정에 메일을 보내는 것입니다. 이 과정에서는 mail 프로그램을 사용할 것입니다. 왜냐하면 send 파일은 Maildir이 만들어져 있어야 정상적으로 동작하기 때문입니다. 이를 위해서 -Snorecord을 이용해야 합니다.

  • echo 'init' | mail -s 'init' -Snorecord username

Can't canonicalize "/home/username/Maildir"
이 출력은 처음 실행했을 때에만 보이는 것으로 정상적으로 처리가 된 경우입니다. 새롭게 만들어진 메일 관련 디렉토리을 ls -R ~/Maildir로 볼 수 있습니다.

/home/username/Maildir:
cur  new  tmp

/home/username/Maildir/cur:

/home/username/Maildir/new:
1477661141.V807I2aa113aM330979.mail.example.com

/home/username/Maildir/tmp:

new 디렉토리 아래에 처음 전송한 메일이 생겼습니다.

Managing Mail with the Client

클라이언트(사용자)에서 메일을 확인해 봅니다. ↵ Enter를 치시면 현재 커서가 있는 메일의 내용을 볼 수 있습니다.

s-nail version v14.8.6.  Type ? for help.
"/home/user_id/Maildir": 1 message 1 new
>N  1 username Thu Jan  1 09:00   68/2141  init
?
[-- Message  1 -- 14 lines, 413 bytes --]:
From username@example.com Thu Jan  1 09:00:00 1970
Date: Fri, 28 Oct 2016 22:39:27 +0900
To: username@example.com
Subject: init
Message-Id: <20161028133927.88FA2682521@mail.example.com>
From: username@example.com (username)

init

메일 목록을 보고 싶으면, h를 누릅니다. 특정 메일을 읽고 싶으면 메일 번호를 입력하고 ↵ Enter를 누릅니다. 메일을 삭제하고 싶으면, d와 함께 메일 번호를 적어줍니다. 메일을 끝낼 때에는 q를 눌러줍니다.

Sending Mail with the Client

이제 메일을 보내보도록 하겠습니다. 파일 test_message를 만듭니다.

Hello,

This is a test.  Please confirm receipt!

메일 제목은 -s 플래그로 바꿀 수 있으며, -r 플래그는 From:필드의 값을 바꾸어서 보여줍니다.

  • cat ~/test_message | mail -s 'Test email subject line' -r from_field_account user@email.com

External mail transfer setup

통신사를 통해서 인터넷을 가입하면, 외부에서 접근 가능한 ip 주소를 갖게 됩니다. 이 ip주소를 duckdns.org에서 이름으로 변경해서 사용하고 있다면, postfix에서 이 이름으로 외부에서 발송된 메일을 받아볼 수 있습니다. 그러나 이 메일 서버를 통해서 외부 메일주소로는 메일이 발송되지 않습니다. 그래서 외부의 smtp 메일 중에서 gmail을 이용해서 발송해 보려 합니다.

main.cf 수정

여기서는 gmail을 이용해서 설정해 보겠습니다.

  • replayhost : relay를 하게 될 SMTP 서버를 추가합니다.
  • smtp_sasl_auth_enable : SMTP의 SASL 인증 여부를 설정합니다.
  • smtp_sasl_password_maps : SMTP 비밀번호를 설정합니다.
  • smtp_sasl_security_options : 익명사용자(noanonymous)가 접근할 수 없도록 설정합니다.
  • smtp_use_tls : SMTP 보안 프로토콜을 TLS로 사용하는지 여부를 설정합니다.
  • smtp_tls_CAfile : SMTP TLS에 사용할 Certificates 파일을 지정합니다.

Postfix 설정 /etc/postfix/main.cf을 수정합니다.

mydestination = $myhostname, localhost.localdomain, localhost
relayhost = [smtp.gmail.com]:587                     # 여기부터 수정
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
smtp_sasl_security_options = noanonymous
#smtp_use_tls = yes                                  # 작동하지 않습니다. 아래 2줄을 사용하십시요.
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt  #여기까지 수정
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

Gmail 설정

2022년 5월 말에, 더 이상 보안 수준이 낮은 앱을 사용할 수 없습니다. 대신에, 2단계 인증을 사용하고 앱 비밀번호를 통해 연결할 수 있습니다.

계정 암호 파일 생성

자신이 갖고 있는 gmail 아이디를 통해서 메일을 전달하도록 /etc/postfix/sasl/sasl_passwd 파일에 사용자와 암호를 알려줍니다. [smtp.gmail.com]:587 username@gmail.com:Application_Password
다른 사람이 읽지 못하도록 모드를 바꾸고 postfix map을 생성합니다.

  • sudo chmod 400 /etc/postfix/sasl/sasl_passwd
  • sudo postmap /etc/postfix/sasl/sasl_passwd

테스트

홍 디렉토리 아래에 test_message 파일을 만들고 gmail 계정으로 메일을 보냅니다.

  • cat ~/test_message | mail -s 'Test email subject line' -r from_postfix username@gmail.com

Gmail에서 정상적으로 도착을 했는지 확인을 합니다. 만약 정상적으로 도착을 하지 않았다면, /var/log/mail.log 와 /var/log/mail.err 파일을 확인하셔서 적절히 대응을 합니다.

로컬 메일을 gmail로 보내기

어쨌든, 지메일을 이용하기 위해서는, 간단한 설정이 필요합니다. Postfix (software)#Gmail_설정를 참조하십시오.
로컬 메일을 실시간으로 감시하기 힘든 경우가 있습니다. 그래서 로컬에서 생성된 메일을 전부 gmail로 보내기 위해서 /etc/aliases 파일을 수정합니다.

root:  gmail_id@gmail.com
user:  gmail_id@gmail.com

이제 변경된 사용자를 읽어드리게 합니다.

  • sudo newaliases

메일 서버를 재시작합니다.

  • sudo systemctl restart postfix

로컬 서버의 root 사용자에게 메시지를 보내봅니다.

  • cat ~/test_message | mail -s 'Test email subject line' -r from_field_account root

로컬 서버의 user_id에게 메시지를 보내봅니다.

  • cat ~/test_message | mail -s 'Test email subject line' -r from_field_account local_user_id

gmail을 시작해서 해당되는 메시지가 왔는지 확인을 합니다.

외부메일비교

Gmail을 smtp로 이용할 경우에 보안이 약화되는 문제가 있습니다. 그래서 다른 서버들의 반응을 확인해 보도록 하겠습니다.

  • Gmail: 인증이 되지 않은 메일서버에서 발송된 메일은 Spam으로 분류됩니다. 필터를 사용해서 Inbox로 이동가능합니다. 단점은 약간의 시차(2분정도)가 생긴다는 점입니다.
  • Daum.net: 인증이 되지 않은 메일서버에서 발송한 메일도 Inbox로 바로 처리됩니다.
  • Naver.com: 인증이 되지 않은 메일서버에서 발송된 메일은 무시되어버려 흔적을 찾을 수 없습니다.
Gmail에서 스팸으로 분류된 메시지를 필터를 통해서 받은 편지함으로 가져오는 필터 만드는 과정입니다. 필터 및 차단된 주소로 접근합니다.
  1. 새 필터 만들기
  2. 보낸 사람 또는 받는 사람: id입력
  3. 포함하는 단어: in:spam
  4. 이 검색기준으로 필터만들기
  5. 항상 중요 메일로 표시
  6. 필터 만들기

External Resources