본문 바로가기
정보보안/이론

[KITRI] 리눅스 메일서버

by 민-Zero 2020. 5. 24.

메일 서버

이메일 송수신에 사용되는 프로토콜은 세 가지가 있다.

SMTP(Simple Mail Transfer Protocol, TCP 25) : 클라이언트가 메일을 보내거나 메일 서버끼리 메일을 주고 받을때 사용하는 프로토콜

POP3(Post Office Protocol, TCP 110) : 메일 서버에 도착되어 있는 메일을 클라이언트로 가져올때 사용한다. 메일 서버에 저장된 메일을 다운로드하는 프로토콜. 서버에서 메일을 다운받아 가기 때문에 서버에 메일이 남아있지 않게된다.

IMAP(Internet Mail Access Protocol, TCP 143) : POP3와 용도가 같지만 메일 서버에 저장된 메일을 접근 하는 프로토콜로 POP3와 약간의 차이가 있다. 서버에서 메일을 접근해 읽기만 하므로 서버에 메일이 남아있다. 따라서 서버의 리소스를 아끼기 위해 POP3를 많이 사용한다.

 

메일 송수신 역할에 따른 용어

MUA(Mail User Agent) : 사용자를 대신해서 메일 발송/수신 받아주는 프로그램 (ex. Microsoft Outlook, Mozilla Thunderbird)

MTA(Mail Transfer Agent) : 메일 서버에서 메일 송/수신을 담당하는 프로그램 (sendmail, quail, Exhanget Server)

MDA(Mail Delivery Agent) : 수신된 메일을 메일함 저장 하는 프로그램

MRA(Mail Retrieval Agent) : 메일함 저장된 메일을 사용자에게 전송하는 프로그램(dovecot uw-imap)

 

메일을 보내는 과정

MUASMTP 프로토콜을 이용해서 메일 서버 1의 샌드메일 서비스에게 메일을 보내달라고 요청한다.

/etc/mail/access.db 에 접근하여 해당 메일의 송수신 여부를 확인

샌드 메일 서비스는 메일을 /var/spool/mailqueu에 임시로 메일을 저장한다.

샌드 메일 서비스는 시간이 되면 MDA에게 메일을 전송해달라고 요청한다.

MDASMTP 프로토콜을 이용해서 메일 서버 2의 샌드메일 서비스에게 메일을 전송한다.

메일 서버2의 샌드메일 서비스는 받은 메일을 MDA를 통해 사용자의 메일 박스에 넣어 놓는다.

반대편 MUA는 메일 서버 2dovecot 서비스에게 자신의 메일을 달라고 요청

devecot 서비스는 메일 박스에서 MUA가 요청한 메일을 POP3 또는 IMAP 프로토콜을 이용해 전송한다.

 

 

센드메일 서버의 구현(초기만)

메일서버로 구동시킬때 해당 서버거 어떤 서버인지 구분하기 위해 호스트네임을 mail.kmy.co.ki로 변경한다.

hostname mail.kmy.co.ki 명령어로 호스트 네임을 변경할 수 있지만 컴퓨터 재부팅시 다시 사라진다. 실제 호스트 네임은 파일에 지정 되어있기 때문이다.

 

centos 5 /etc/sysconfig/network

centos 8 /etc/hostname

 

host명을 변경했으면 /etc/hosts 파일에도 추가해 DNS가 찾을수 있도록 설정해야 한다.

 

메일서버가 동작하기 위해 DNS에서 메일서버의 정보를 찾을수 있도록 mx서버의 정보를 zone파일에 등록해야 하므로 /var/named/kmy.co.ki.zone 파일도 수정한다.

이때 MX는 기존 NS 설정과 다르게 우선순위라는 값이 하나 더 들어간다. IN MX 뒤에 NS와는 다르게 숫자가 들어가며 해당 숫자가 우선순위값이 된다. 기본값은 10으로 숫자가 작을수록 우선순위는 높다. 우선순위를 두는 이유는 메일서버가 동작하면 많은 사용자가 사용하게 되는데 하나의 서버로 모든 사용자를 수용하기 어려울경우 바쁜 서버를 대신할 다른 메일서버를 활용하기 위해서 이다.

 

메일서버로 활용하기 위해 sendmail 패키지를 다운로드하면

/etc/mail 디렉토리에 기존에 없던 파일들이 생성된것을 확인할 수 있다.

/etc/mail/local-host-mames에 내가 사용하는 도메인 kmy.co.ki를 추가하면 해당 도메인을 메일 서버의 주소로 사용할 수 있다.

/etc/mail/sendmail.cf는 메일서버의 설정파일이다. 여기서 85행의 Cwlocalhost는 어떤 계정으로 메일을 받을지 설정하는 부분인데. Cw와 Fw가 존재한다. 둘의 차이점은 C는 문자열을 정의하고 F는 파일을 정의한다. 만약 Fw에 파일에 aaa.com과 bbb.com을 설정했다면 Cwlocalhost aaa.com bbb.com 으로 설정해도 같은 설정으로 적용된다. 앞서 local-host-names 파일에 kmy.co.ki 를 등록하였으므로 해당 도메인으로 메일을 받게 되는것이다.

267행이 어떤 주소에서 리슨을 할것인지 설정한다.
267 O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
268 O DaemonPortOptions=Port=smtp,Addr=192.168.252.15, Name=MTA
이런식으로 내가 수신받을 ip를 설정한다.

access.db가 메일서버에서 실제로 동작하는 파일이다. 어떤 사용자를 접근 허용할지를 결정할때 해당 파일을 참조한다. 해당파일을 만드는 방법은 makemap 명령어를 통해 생성할 수 있다. 

여기서 RELAY는 메일 송수신을 허용, DISCARD는 메일을 거부하는데 거부 메세지를 안 보내주는 설정이며 REJECT는 메일을 거부하는데 거부 메세지를 보내준다.

@naver.com RELAY 과 같이 설정하기도 하는데 @가 앞에 들어간것은 해당 도메인만 허용하는 것이며 @를 붙이지 않은 도메인은 해당 도메인의 하위 도메인까지 전부 허용한다는것 이다. 해당 파일은 바이너리 파일이기 때문에 cat으로는 확인할 수 없다. 이때 strings를 사용하면 최대한 해석해서 보여준다.

access.db에 내용을 추가하고자 다시 명령어를 치고 확인해보면 기존의 내용이 사라지는것을 확인할 수 있다. 따라서 추가하고 싶다면 파일을 만들어서 내용을 추가하고 해당 내용을 리다이렉션을 이용해 명령어의 입력으로 보내면 된다. 그러기 위해서 생성되어 있는 파일이 access이다.

위와같이 설정하고 sendmail 서비스를 재시작하면 설정이 적용된다.

정상동작 하는지 확인하기 위해 mail 명령어를 통해 user1 이라는 계정에 메일을 전송하고

전송한 계정에 들어가 mail 명령어를 통해 확인하면 정상적으로 메일을 수신한것을 확인할 수 있다. & 메일번호 를 입력하면 해당 메일의 내용을 확인할 수 있고 & q 를 사용하면 빠져나올 수 있다.

 

만약 메일이 정상적으로 도착하지 않거나 보내지지 않는다면 메일이 임시 저장되는 곳 /var/spool/mqueue, 정상적으로 받아지는곳 /var/spool/mail에서 확인할 수 있다. 따라서 메일을 테스트할때 어떤곳에 저장되어있는지 확인하고 에러가 발생한다면 고치면 된다.

'정보보안 > 이론' 카테고리의 다른 글

[KITRI] DB 서버  (0) 2020.06.17
[KITRI] Day 19. rndc 원격제어  (0) 2020.05.24
[KITRI] Day18. master, slave 복습  (0) 2020.05.19
[KITRI] Day17. 네임 서버 master, slave  (0) 2020.05.19
[KITRI] Day16. 네임 서버 구축  (0) 2020.05.15

댓글