System/Linux

[Linux] e-mail(Mail Server)

Yoonsoo Park 2024. 10. 9. 00:57

우리가 사용하는 이메일의 체계는 겉보기엔 단순해보이지만, 세부적으로 보면 여러 메일 서버 구성 주체들과 프로토콜들의 상호 작용으로 운영되는 상당히 복잡한 체계를 가지고 있다. 이번 포스팅에서는 이메일 체계의 구성 및 통신 과정에 대해 설명해보려한다. 

 

1. 이메일 통신 과정

 이메일은 다음과 같은 과정을 거쳐 수신자에게 도착하게 된다. 아래의 설명을 참고하여 대략적인 과정을 파악하도록 하자. 메일 서버 구성 요소와 관련 프로토콜들에 대해서는 추후 더 자세히 다룰 예정이다. 

 

1) 다른 도메인끼리의 메일 전송 과정

<다른 도메인끼리의 메일 전송 과정>

 

 

발신 이메일: pororo@naver.com

수신 이메일: crong@daum.net

 

1. pororo는 MUA를 이용하여 메일을 작성하고, naver.com 도메인의 MTA(보내는 메일 서버)메일을 전송한다.

  • 사용되는 프로토콜: SMTP
  • 이메일 계정을 생성할 때 보내는 메일 서버(Outbound Mail Server)와 받는 메일 서버(Inbound Mail Server)를 도메인 네임 형식으로 설정하게 된다. 
    • ex) 보내는 메일 서버: smtp.naver.com / 받는 메일 서버: pop3.naver.com
  • 해당 이메일 MUA에서 MTU로 메일을 전송할 때, Cache 서버에 보내는 메일 서버의 도메인 네임에 대한 A 레코드를 질의한 뒤, 응답이 오면 해당 IP 주소로 메일을 전송한다. 

2. MTA로 전송된 메일은 메일 큐(queue)에 보내졌다가 차례가 되면 daum.net 도메인의 MTA로 전송된다.

  • 사용되는 프로토콜: SMTP
  • 메일 서버는 Cache 네임 서버에 daum.net 도메인의 MX(Mail eXchange) 레코드를 질의하여 daum.net 도메인의 MTA의 IP 주소를 알아내어 전송한다.

3. daum.net 도메인의 MTAMDA 메일을 전달하면, MDA수신자의 메일함에 저장한다.

  • 사용되는 프로토콜: SMTP

4. crong이 메일을 확인하려고 할 때, MUAPOP3 또는 IMAP 프로토콜을 이용해 메일을 가져와 읽을 수 있게 한다

  • 사용되는 프로토콜: POP3 or IMAP
  • crong의 MUA는 Cache 네임 서버에 받는 메일 서버의 A 레코드를 질의한 후, 응답 받은 IP 주소를 이용해 MDA로부터 메일을 가져온다. 

 

2) 같은 도메인 내에서 메일 전송 과정

<같은 도메인 내에서의 메일 전송 과정>

 

발신 이메일: pororo@naver.com

수신 이메일: eddie@naver.com

 

1. pororo는 MUA를 이용하여 메일을 작성하고, naver.com 도메인의  MTA(보내는 메일 서버)메일을 전송한다.

  • 사용되는 프로토콜: SMTP

2. MTA가 수신자의 도메인을 확인

  • 같은 도메인이라는 것을 인식하고, 외부 네임 서버에 MX 레코드 질의를 하지 않는다

3. MTA MDA에게 메일을 전달하고, MDA는 수신자의 메일함에 메일을 저장한다. 

  • 사용되는 프로토콜: SMTP

4. eddierk 메일을 확인하려고 할 때, MUAPOP3 또는 IMAP 프로토콜을 이용해 메일을 가져와 읽을 수 있게 한다

  • 사용되는 프로토콜: POP3 or IMAP

 

**MX (Mail eXchanger) Record

특정 도메인 내의 MTA(보내는 메일 서버)의 주소를 알아내기 위해 사용하는 레코드이다.

 

 

2. 메일 전송 주체와 역할: MUA, MTA, MDA

이메일 통신 과정을 어느 정도 파악했다면, 이메일 통신을 수행하는 주체인 MUA(Mail User Agent), MTA(Mail Transfer Agent), MDA(Mail Delivery Agent)에 대해 더 자세히 알아보자. 

 

 

MUA(Mail User Agent)

  • = 메일 클라이언트(mail client)
  • 사용자가 메일을 작성, 발송할 수 있게 해주거나, 수신된 메일을 내 컴퓨터로 가져와주는 소프트웨어(도구)
  • 대표적인 제품 
    • Outlook: 마이크로소프트에서 제공되는 유료 MUA
    • Outlook Express: Outlook 무료 버전, 지금은 제공되지 않음
    • Mail App: 마이크로소프트에서 제공되는 무료 MUA
    • Opera Mail client, EM Client, Thunderbird, mailBird ..

MTA(Mail Transfer Agent)

  • = Outbound Mail Server, Sending Mail Server, MX Server, SMTP Server 등등.. 으로 명명하기도 한다
  • MUA로부터 메일을 수신하고, 같은 도메인의 계정일 경우 도메인의 MDA로, 다른 도메인 주소의 계정이면 해당 도메인의 MTA로 메일을 중계(relay)하는 역할을 하는 서버
  • 대표적인 제품
    • Sendmail: 원조 메일 서버
    • Postfix: RHEL 계열에 기본 탑재된 메일 서버
    • Qmail..

MDA(Mail Delivery Service)

  • 목적지 도메인의 MTA에 도착한 메일을 수신자의 메일함에 전달해주는 서버
  • 대표적인 제품
    • Dovecot: Linux/Unix 계열용 POP3와 IMAP을 사용하는 전자 메일 서버

 

 

3. 이메일 통신 관련 프로토콜: SMTP, POP3, IMAP

1) SMTP(Simple Mail Transfer Protocol)

  • 이메일을 송신할 때 사용되는 프로토콜 
  • 클라이언트(MUA)가 이메일을 메일 서버(MTA)로 보낼 때, 메일 서버 간 이메일을 송신할 때 사용된다
  • SMTP는 메일을 수신자의 메일함(MDA)까지만 보내는 역할을 한다
  • TCP 26번을 이용한 평문 통신
  • SMTP를 암호화한 SMTPs는 TCP 587번 포트를 사용

2) POP3(Post Office Protocol)

  • 메일 서버(MUA, 수신자의 메일함)에서 다운로드에서 로컬 컴퓨터에 저장하는 프로토콜
  • 일반적으로 메일함에서 다운로드하면 메일함에서 메일이 삭제된다
  • POP3: TCP 110
  • POP3s: TCP 995

3) IMAP(Internet Message Access Protocol)

  • 이메일을 서버에 동기화하여, 여러 장치에서 동시에 메일을 관리할 수 있게 해주는 프로토콜
  • POP3와 다르게 원본을 가져오는 방식이 아닌, 서버에 메일을 유지하면서, 여러 장치에서 메일을 확인하고 동기화할 수 있다. 즉, 메일 클라이언트에서 메일을 수정하면 수정 사항이 메일함쪽에도 반영이 된다. 
  • IMAP: TCP 143번
  • SSL/TLS를 통해 암호화된 IMAP: TCP 993

*SSL(Secure Sockets Layer)과 TLS(Transport Layer Security)는 인터넷 상에서 데이터를 암호화하여 안전하게 전송하는 프로토콜

 

 

3. 메일 서버를 직접 구축해보자!

*앞선 과정에서 봤던 것처럼 메일 서버는 기본적으로 DNS와 긴밀하게 연결되어 있기 때문에, DNS에 대한 이해와 DNS 서버 인프라 구축이 선행되어 있어야 한다. DNS를 잘 모르겠다면 [Linux] DNS part 1 (tistory.com) 먼저 공부하고 오도록 하자. 

 

이번 실습에서 MTA는 Postfix를, MDA는 dovecot, MUA는 Window에 기본으로 내장된 메일 앱을, 수신 프로토콜은 POP3를 사용해서 진행할 예정이나, 조금 변화를 주더라도 대략적인 설정 방법은 유사하다. 

 

1) 권한 있는 네임 서버 설정(daum.net)

Root, TLD 네임 서버까지 구성하기 힘들다면, 최소한 Cache 네임 서버와 권한 있는 네임 서버만큼은 구성해야 정상적으로 실습이 가능하다. 이번 포스팅에서는 이전의 DNS 포스팅에서 사용했던 네임 서버의 설정의 연장상에서 진행할 예정이니 꼭 참고하도록 하자!

 

 권한 있는 네임 서버의 기본적인 설정이 완료됐다면, 권한 있는 네임 서버의 존 파일(/var/named/daum.net.zone)에 다음과 같은 내용들을 추가해줘야 한다. 

 

@	IN	MX 10	smtp.daum.net.  // daum.net 도메인에서 MTA 역할을 담당하는 서버의 주소는 smtp.daum.net이다
smtp	IN	A	113.61.107.30  // 보내는 메일 서버의 A 레코드를 등록 
pop3	IN	A	113.61.107.30  // 받는 메일 서버의 A 레코드를 등록

<다음과 같이 설정한다>

 

** master/slave 구조로 권한 있는 네임 서버를 구성한 경우, 존 파일을 수정한 후 시리얼 넘버를 꼭 수정해줘야 한다. 

** MX 레코드 옆에 쓰인 10이라는 숫자는 가중치를 의미한다. 가중치는 메일 서버가 여러 대 있을 때, 가중치를 기준으로 우선 순위를 정하거나, 부하를 분석하려는 목적으로 사용된다(메일 서버가 1대인 경우 의미 없는 수치지만, 형식적으로 적어주긴 해야한다). 

 

 

2) 보내는 메일 서버(MTA) 구성

*RHEL 계열 Linux에는 기본적으로 Postfix가 설치되어 있으나, 안돼있는 경우 dnf나 rpm을 통해 설치하면 된다. 

 

1. Postfix 데몬 상태를 확인한다

rpm -qa|grep postfix 

systemctl status postfix (service postfix status) 

netstat -anpt | grep ':25'

 

postfix 데몬 상태를 보면 서비스하고 있는 대상의 IP 주소가 loopback 주소이다(스스로에게만 서비스 하는 중). 이러한 설정을 변경해줘야 한다. 

 

2. Postfix 데몬 설정 

Postfix 데몬 설정 파일(/etc/postfix/main.cf)에 들어가서 다음의 설정들을 바꿔준다. 

myhostname = smtp.daum.net 
//Postfix에게 자신의 호스트네임(or FQDN)을 명확히 선언

mydomain = daum.net 
//메일 서버가 속한 도메인 네임을 설정

myorigin = $mydomain(daum.net으로 적어도 무방)
//Postfix에서 메일을 발송할 때 메일발송지(from)를 myorigin의 내용으로 설정하여 발송한다. mydomain 변수의 설정값을 메일발송지(myorigin)으로 설정

inet_interfaces = all 
//서비스에 사용할 NIC을 지정, all : 모든 NIC을 사용하여 서비스함

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain 
//Postfix가 메일을 받았을때 받는메일주소의 도메인이 mydestination과 일치하면 로컬 계정의 메일함에 저장함

home_mailbox = Maildir/ 
//수신된 메일을 저장할 디렉토리 지정, 메일계정(리눅스계정)의 홈디렉토리(/home/~계정명~/MailDir/~메일~

</etc/postfix/main.cf>

 

3. Postfix 데몬을 재시작하고, 메일 계정을 생성한다.

systemctl restart postfix

useradd pororo 
useradd crong 
passwd pororo 
passwd crong

 

**한 도메인 내에서 메일을 주고 받는 것이 아닌 다른 도메인의 메일 주소로 메일을 보내는 경우, 추가적으로 메일 서버 간 중계(relay) 설정보내는 메일 서버에 추가해주어야 한다(양쪽 메일 서버 모두에 설정해줘야 한다). 다음의 설정 방법을 참고하자.

/etc/postfix/main.cf 

mynetworks = 0.0.0.0/0  
<--- 기존내용을 이것으로 변경, 누가 메일전송을 요청하더라도 모두 중계(Relay) 해준다.
모든 PC가 요청하는 메일을 중계하라는 뜻이다. 
스팸메일에 무방비로 당하는 안좋은 설정이기 때문에 실습용으로만 사용하자.

또는 or 

mynetworks =152.75.84.0/22 127.0.0.0/8  
<--- 스팸을 피하려면 메일을 보내려는 PC의 네트워크 대역을 등록하면 된다.
로컬 테스트를 위해서 127.0.0.0 대역도 추가해주자.

 

 

3) 받는 메일 서버 구축 

1. dovecot 설치 및 상태 확인

dnf 또는 rpm을 이용해 dovecot 서비스 패키지를 다운받아준다. rpm을 이용할 경우 의존성 문제를 직접 해결해야 하므로, 네트워크가 된다면 dnf를 이용하는 것을 추천한다. 

dnf install dovecot 

rpm -ivh dovecot-~~버전~~.rpm 
clucene-core~~버전~~.rpm // 의존성 문제로 다음의 패키지를 선행 설치해야 한다
portreserver-~~버전~~.rpm

systemctl start dovecot 
systemctl status dovecot  
ps -ef | grep dovecot  // dovecot 프로세스가 실행 중인지 확인하는 명령어
netstat -anpt | grep dovecot

 

2. dovecot 데몬 설정 파일 설정하기 

dovecot 데몬 설정 파일은 메인 설정 파일(/etc/dovecot/dovecot.conf)와 기능 별로 설정을 세분화해놓은 파일들( /etc/dovecot/conf.d/)로 이뤄져 있다. 메인 설정 파일을 확인해보면 다음과 같이 세분화된 파일들을 실행시 자동으로 포함한다는 설정이 되어있다. 

 

*설정 파일을 기능별로 분리해서 관리하는 방식은 유지 보수의 면에서 더 유리하다. 

*!include conf.d/*.conf 라는 구문을 해석해보면, conf.d 디렉토리 아래 모든 .conf 파일들의 내용들을 포함해서 실행하라는 의미이다. 여기서 !은 설정 파일에서 이 명령어가 일반적인 설정값이 아닌 특수한 처리를 요구하는 명령어라는 것을 명시하는 표시이고, *은 모든 것을 의미하는 와일드카드이다. 

 

또한 dovecot 데몬 설정을 확인하는 단계에서 열린 포트들을 보면 IMAP, POP3, IMAPs, POP3s의 포트가 모두 열려있는 것을 볼 수 있다. 이러한 수신 프로토콜에 대한 설정도 다음과 같이 메인 설정 파일에서 설정할 수 있다. 

<pop3 => pop3, imap 으로 바꿔주면 두 프로토콜 모두 사용 가능하다>

 

메인 설정 파일에서의 설정이 완료됐다면, 세부 설정 파일들에 각각 들어가서 다음과 같이 설정해주고 데몬 재시작까지 수행해주면, dovecot 데몬의 설정이 완료된다. 

vi /etc/dovecot/conf.d/10-mail.conf 
mail_location = maildir:~/Maildir     
// 메일함(메일이 저장된 위치) 지정 

vi /etc/dovecot/conf.d/10-auth.conf 
disable_plaintext_auth = yes -->  no  
// ID/PASS 암호화 하지마. (인증정보가 암호화되어 있지 않아도 인증을 처리하도록 설정) 

vi /etc/dovecot/conf.d/10-ssl.conf 
ssl = required --> no   
// 암호화 통신을 하지 않아도 접속을 허용하도록 설정

 

4) MUA(mail client) 사용 방법 (Window 10 기준)

 MUA는 Windows에 기본으로 내장되어있는 메일 앱을 사용해보자, 추가적으로 설치할 내용은 없고, 메일을 검색해서 실행해보자. 메일 앱을 실행한 후, '계정 추가'를 클릭한다. 이후 나오는 화면에서 '고급 설정'을 클릭해준다. 다음 사진과 같이 진행해보자.

 

 

<메일 클라이언트에 계정 생성하는 과정>

 

다음과 같이 계정 생성이 완료됐다면, 계정 간에 메일 전송을 시도해보자!

 

모든 설정이 완전하게 됐다면, 동기화 버튼을 눌렀을 때, 다음과 같이 다른 계정으로부터 메일이 성공적으로 수신될 것이다. 

 

* 메일 큐 확인 및 비우는 방법 

# 메일 큐 전체 비우기 
postfix flush 
   또는 
postfix -f 
 
# 현재 쌓인 메일 확인 
mailq 

# 메일큐 전체 삭제 
postsuper -d ALL 
 
# 메일큐에서 deferred(지연된) 된 메일만 삭제 
postsuper -d ALL deferred

 

 

 

 힘들지만 오늘도 해낸 나를 위한 한 마디,

"흔히 사람들은 기회를 기다리고 있지만, 기회는 기다리는 사람에게 잡히지 않는 법이다. 우리는 기회를 기다리는 사람이 되기 전에 기회를 얻을 수 있는 실력을 갖춰야 한다. 일에 더 열중하는 사람이 되어야 한다", 도산 안창호

 

"언제든 기회가 오면 잡을 수 있는 실력을 기르고, 주도적으로,진취적으로, 과감하게 기회를 찾아 나서자"

'System > Linux' 카테고리의 다른 글

[Linux] HTTP  (2) 2024.10.17
[Linux] Local Repository 만들기  (2) 2024.10.16
[Linux] FTP  (1) 2024.10.07
[Linux] DNS part 2  (2) 2024.10.03
[Linux] DNS part 1  (0) 2024.10.01