4. Mail & POP 서버

 

  인터넷을 사용하다가 보면 메일을 보내야할 경우가 반드시 생기게 된다.

  그럴 때면 hanmail, chollian 등에서 무료로 제공해주는 메일을 사용하여 메일을 보낼 때가 있다. 하지만 서버를 운영하고 직접 도메인을 가지고 있으면, 자신의 도메인도 홍보하고 원하는 만큼의 메일계정 생성, SMTP서버의 필요성 때문에 메일서버를 구축하게 된다. 특히 자신의 서버로 웹호스팅을 하는 서버관리자라면 메일 서버는 꼭 필요할 것이다.


  그러면 메일서버의 필요성을 알아보았으니 이제는 메일이 어떻게 전송이 되는지 알아볼 필요가 있다.

 

  (test)    (mail.manpage.co.kr)         (mail.hostway.co.kr)   (test)

<그림 4-1 메일이 전송/수신되는 개략도>


 

  MUA (Mail User Agent) : 아웃룩등의 메일을 보낼때 사용하는 프로그램들

  MTA (Mail Transfer Agent) : 서버에서 다른서버로 메일을 전송할 때 사용하는

                                프로그램. Sendmail, Qmail등

  MDA (Mail Delivery Agent) : pop, imap 등의 프로그램으로 메일을 서버에서

                                받아올 때 사용하는 프로그램 (아웃룩, 유도라 등)

 

  위의 그림은 test@manpage.co.kr 이라는 사용자가 manpage.co.kr메일서버를 이용하여

  test@hostway.co.kr의 사용자에게 메일을 발송하고, test@hostway.co.kr사용자는 서버로부터 메일

  을 확인하는 과정을 간략히 나타낸 것이다.


  메일서버를 운영하다가 갑자기 메일이 안될때 위의 그림을 잘 생각해보면 어느 쪽에서 문제가 발생했는지 알 수 있을 것이다.


4-1 메일 프로그램의 종류


  리눅스 서버에서 운영되는 메일프로그램의 종류는 크게 Sendmail과 Qmail로서 나뉠 수가 있다.

  호스트웨이에서는 서버설치시 RPM Sendmail을 기본적으로 설치 제공하고 있다.

 

  다음은 Sendmail과 Qmail의 간단한 비교이다.

 

 

Sendmail

Qmail

수  신

  한개의 프로세서가 담당

  수신담당 프로세서가 담당(qmail-send)

송  신

  송신담당 프로세서가 담당 (qmail-smtp)

로  그

  /var/log/maillog 생성

  (로그정보가 많음)

  /var/log/maillog

  (로그정보가 적음)

Mailbox

  /var/spool/mail/사용자아이디

  에 메일이 쌓임

  일반적으로 사용자의 홈디렉토리밑에 생

  성됨 (new / cur / tmp )

설치 경로

  /etc/mail/

  /var/qmail/

프로세서수

  1

  설치에 따라서 12-14개

속  도

  Qmail비해서 느림

  분업화로 인해서 속도 빠름

주 사용규모

  소/중 규모에서 사용

  대형 규모에서 사용

특  징

로그분석이 쉬움

많은 사용자들이 사용하고 있어

   자료나 문제해결시 편리함

rpm으로도 제공되어 설치가 쉬움

프로세서 관리가 쉬움

서버안의 실제 계정에 대해서만

    메일이 관리될수 있다.

여러 프로세서가 분업화되어 동시적으로        작동함으로 속도가 빠름

메일하나하나 다른 파일로 기록되므로

   메일관리가 쉬움

가상유저방식으로 가상호스팅에 강함

<표 4-1 Sendmail과 Qmail의 비교>


  qmail과 sendmail 두 메일러의 특징을 비교해 보았다.

 

  이번에는 Redhat CD를 설치하게 되면 기본적으로 설치되는 sendmail의 설정법과 사용법에 대해서

  알아보도록 하겠다. ( qmail은 기본 패키지가 아니라 따로 설치를 해줘야 하는 메일러이므로 설명하지 않는다. )

 

4-2. Sendmail의 설정

  Sendmail은 전 세계적으로 가장 많이 사용되는 메일러이다. 그렇기 때문에 오류나 버그에 대해서 다른 메일러보다 패치와 정보가 빨리 나오기 때문에 Sendmail을 많이 사용하게 된다.



  여기에서는 sendmail rpm버전을 설치하여 설정하는 법을 알아보도록 하겠다.


  #) 단 Redhat 7.3 기본 패키지에 설치되어있는 sendmail의 경우는 root권한을 취득할 수 있는

      버그가  존재하므로 반드시 패치하여 사용하기 바란다.

     패치는 redhat 홈페이지나, hostway 서버호스팅 고객지원 페이지, manpage.co.kr에 들어가면 구

     할수 있다. 보안상 중요한 사항이므로 반드시 패치를 해야 한다. 여기서는 7.3에 설치된 패키지만을

     가지고 설명을 하므로 다른 버전의 사용자들은 안내 되어있는 패키지 버전을 따라서 패치해야 한다.


 

4-2-1. Sendmail의 설정 ( RPM버전 )


  자신의 서버에 sendmail이 설치되어 있는지 확인하기 위해서는

rpm -qa | grep sendmail  이라는 명령을 사용하면 된다.

 

< 그림 4-2 sendmail 패키지 확인 >


   그림 4-2를 보게 되면 패치된 버전인 sendmail-8.11.6-25.73이 설치되어있는 것을 알수 있다.

  

   기본적으로 설치되어있는 sendmail은 아무런 설정을 변경하지 않았을때에는 localhost에서만 메일을  주고 받을 수 있도록 설정되어있다. 즉 내부에서만 메일이 되고, 외부에서는 메일서버에 접근할 수가 없다.

   그럴때에는 /etc/sendmail.cf 파일을 열어서 다음과 같이 Addr=127.0.0.1을 제거해 주면 된다.

 

< 그림 4-3 sendmail.cf 설정변경 >

 

   그리고 나서 /etc/rc.d/init.d/sendmail restart를 해주게 되면 새로운 설정이 적용되어, 외부에서도

   SMTP에 접속할수 있게 된다.


4-2-2. Sendmail의 설정 (aliases 갱신)

   시스템에서 보내오는 메일등을 받아보거나 특정 유저에게로 메일을 포워딩 하고자 할때 aliases에 적용하게 된다. 적용하고 난후에는 새로운 설정을 갱신해 주어야 하는데 다음과 같은 명령으로 갱신해 줄수 있다.

 

  [root@manpage tmp]# newaliases

  /etc/aliases: 40 aliases, longest 10 bytes, 395 bytes total

< 그림 4-4 aliases 갱신 >

 

4-2-3. 가상도메인을 위한 /etc/mail 의 설정

   여기까지만 설정을 마치더라도 단독 도메인의 경우는 바로 사용이 가능하다.

   하지만 한서버에서 도메인을 여러개 사용하는 메일서버의 경우에는 좀더 추가 설정을 해주어야만

   메일서버로서 기능을 할수 있게 된다.

   RPM으로 설치가 되었다고 가정하고 설정을 하는것임을 다시한번 주의해야 한다.

   (소스로 설치후에 같은 내용을 적용하고자 한다면, sendmail.mc 파일에

 

FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')

 

  위와 같은 라인이 있어야 가상도메인을 위한 메일을 세팅할 수가 있다.


  하지만 여기서는 rpm으로 설정을 하기 때문에 이미 위의 설정은 적용되어있다.

  /etc/mail 로 이동을 해본다.

  여러개의 파일이 존재 하지만, 실제로 설정할 때 변경을 시켜야 하는 파일은 local-host-names 파일 과 virtusertable 파일이다.

  그럼 각 파일의 설정방법에 대해서 알아보도록 한다.


  local-host-names : 메일을 교환을 허용하는 도메인들을 기록하는 곳이다.

                      이곳에 설정되어있는 도메인들에 대해서만 메일을 수신할수 있다.

                      서버내에 설정된 메일을 수신하는 도메인들은 모두 적어 둔다.

                       (이 파일에 등록된 도메인에 대해서는 로컬의 메시지 큐에 메일을 보관하게 되는데 이곳

                       에 메일이 없게되면 sendmail은 다른곳으로 메일을 보내게 되고 결국 메일은 목적지 도

                       메인을 찾지 못해서 배달되지 않게 된다.)

 

< 그림 4-4 /etc/mail/local-host-names 설정 >

 

  virtusertable : local-host-names에 등록된 메일들이 서버로 수신되었을 때 각각의 계정으로 메일을 배달하기 위해 설정하는 부분이다. sendmail은 리눅스에 존재하는 실제 계정에 대해서만 메일을 배달한다. ( virtusertable을 사용하는 목적은 각 계정으로의 메일 포워딩도 그 목적이 될 수 있지만, 각각의 도메인에 원하는 이메일 계정을 부여하기 위해서 사용한다. )

 

< 그림 4-5 /etc/mail/virtusertable 설정>

 

  그림 <4-5>에서 보면 대충 짐작은 할수 있겠지만, 다시한번 설명을 해보면,

  zmnkh@manpage.co.krzmnkh@hostway.co.kr의 메일은 모두 리눅스 서버의 zmnkh란 계정이 받아볼수 있도록 하는 것이며, webmaster@manpage.co.kr은 webmaster라는 계정이, 그리고 webmaster@hostway.co.kr은 hostway라는 계정이 받아볼수 있도록 하는 것이다. 이 때 유심히 봐야 할 것은 리눅스에서는 동일 계정이 존재 할수 없으므로 메일 계정은 webmaster 라고 하지만, 실제로 받아보는 것은 hostway임을 숙지해야 한다.

  virtusertable을 이용하면, 리눅스 서버내의 실제 계정만 다르게 해준다면 여러 도메인에 같은 메일 계정을 부여할 수 있는 것이다. (사이는 반드시 tab으로 띄어야 한다.)


  자! 여기 까지 했다면 이제는 virtusertable을 갱신하여 db로 만들어야 할 차례이다.

 

< 그림 4-6 virtusertable 갱신 >


  그림 <4-6> 처럼 /etc/mail 디렉토리로 이동한 뒤에 makemap 명령을 내리면 virtusertables이 갱신이 되며, 제대로 갱신이 되었는지 strings명령으로 virtusertable.db를 확인해 보면 virtusertable에서 설정되었던 내용들이 들어있음을 확인할 수 있다.


  이제부터는 가상 도메인으로 설정된 도메인들도 메일을 받을 수 있게 된다.


  여기까지 되었다면 메일세팅이 완료되었다.


   만약 메일서버가 잘 세팅되어서 잘 운영이 되어지고 있다면, 스팸메일에도 대처를 해야 할 것이다. 스팸을 대처하기 위해서는 상용툴도 있고, procmail을 위한 스팸 차단도 있지만( procmail에 의한 스팸 차단은 메일 문구나, 내용으로 스팸을 차단할수 있지만, 기본적으로 서버로 들어오는 모든 메일을 받아서 스팸메일 여부를 검사하게 되므로 서버에 부하가 증가하게 된다.), 가장 기본적으로 sendmail에서 제공하고 있는 "access" 라는 파일의 사용법을 간단히 알아보자. access는 서버가 메일을 받기 전 에 차단하므로 procmail의 문제점을 해결할 수가 있다. 대신 도메인과 IP, 메일주로소만 처리가 되므 로 상세한 필터링이 되지 않는다.


  access파일은 SMTP의 사용을 허가하고 차단하는 역할을 하는 파일이다.

 

< 그림 4-7 /etc/mail/access 파일 설정 >


  그림 <4-7>에서 보여지는 설정은 localhost에 대해서는 모두 허가하고, 66.232.145.2에서 오는 메일은 송수신 거부, 211.239.151.21에서 오는 메일은 모두 송수신 허가, manpage.co.kr에서 오는 메일은 모두 차단을 하지만, manpage@manpage.co.kr은 수신을 허가 한다는 내용이다.

  OK라고 설정된 것은 어떠한 차단 설정에도 메일을 수신할수 있도록 설정하는 것이다.


  아래 표는 access파일에서 사용할수 있는 옵션들을 나열하고 설명한 표이다.

  참고하여 설정에 활용하도록 한다.

 

옵    션

설                        명

RELAY

  지정된 도메인이나 IP에서 오는 모든 메일을 허가한다.

OK

  지정된 도메인이나 IP, 특정유저에게서 오는 메일을 허가한다. REJECT 등으

  로 막혀 있는 도메인에 대해서도 OK로 설정된 메일 유저는 허가 한다.

REJECT

  지정된 도메인, IP, 특정 유저에 대해서 송수신 차단. (이때 거부되었다는 내

  용을 발신한다. - 메일이 많이 올때, 거부되었다는 내용을 보냄으로서 서버에

  부하가 올수 있다)

DISCARD

  지정된 도메인, IP에서 오는 모든 메일을 받아서 응답 없이 모두 폐기 한다.

  (응답 메시지가 없으므로 서버에 부하가 유발되지 않는다)

501

  지정된 메일주소와 일치하는 모든 메일 수신 차단

553

  발신자 주소와 호스트명이 없을 경우 메일 수신 차단

550

  지정된 도메인과 관련된 모든 메일 수신 차단

< 표 4-2 /etc/mail/access에서 사용되고 있는 설정 옵션 >

 

  sendmail의 sendmail.cf에서도 스팸메일을 차단할 수 있다.

 

HSubject: $>check_subject

Scheck_subject

R<ADV>$*            $#error $: We don't accept SPAM

R$*[$*광$*고$*]$*     $#error $: We don't accept SPAM - Go away.


  sendmail.cf의 제일 하단에 위와 같이 설정해 놓으면, 메일의 Subject부분을 체크하여 ADV란 글자가 들어갔거나 [광고] 라는 글자가 들어갔을 때에는 We don't accept SPAM이란 메시지를 보내면서 차단하도록 하는 문구이다. (위의 필터링에 해당하는 메일제목을 가진 메일이 들어왔을 때 /var/log/maillog 에 차단된 메일주소와 메시지가 기록되어 진다.)

 

  위의 설정 종류는 상당히 많으며, Message-Id, Reply-To 등으로 검색하여 필터링 하는 방법이 있으며, 좀더 상세한 방법들은 검색엔진이나, http://kldp.org등의 사이트에서 자료를 찾을 수 있을 것이다.


  스팸메일은 쓸데없는 메일로 인한 시각적이나 공간적 불편함도 있지만, 필터링이 되지 않음으로 인해 서버에 가중되는 부하도 상당할 수가 있으므로, 서버 관리자들은 maillog와 ps 등의 명령으로 메일 프로세서를 확인하여 불법 스팸메일이 들어오지 않는지 확인하여 필터링을 해주어야 할 것이다.


 



4-2-4. sendmail의 기본적인 명령어


▶ rpm sendmail의 구동과 정지

   - /etc/rc.d/init.d/sendmail start

   - /etc/rc.d/init.d/sendmail stop


▶ sendmail의 동작 확인

   - ps -aef | grep sendmail

     ( sendmail: accepting connections 이란 문구가 나오면 정상적으로 동작중이다. )


▶ mqueue에 있는 메일들 확인

   - mailq


▶ queue에 있는 메일들 강제로 보내기

   - /usr/sbin/sendmail -q


▶ mailer 통계

   - mailstats


▶ sendmail.cf 설정

   - #O MaxDaemonChildren=12 (앞의 주석을 제거 해주고 활성화 시킨다)

     O MaxDaemonChildren=30 ( 최대 sendmail프로세서가 생성할수 있는 프로세서의 숫자를 제한한  다. 프로세서숫자가 제한되면, 메일이 한번에 수발신 될 수 있는 양이 줄어들므로 DoS 공격이나 spam relay에 의해서 공격을 당했을 때 서버의 다운을 방지할 수 있다. 숫자는 임의 조정가능)


  -  O DaemonPortOptions=Port=smtp, Addr=127.0.0.1, Name=MTA

     O DaemonPortOptions=Port=smtp, Name=MTA or ( Addr=자신의 서버 아이피 ) 로 변경해 준  다. 이것을 하는 이유는 앞서서 이미 설명되었지만 기본 sendmail은 로컬에서만 메일이 수발신이 되어지도록 설정되어 있으므로 외부로 메일을 보내기 위해서 설정하는 것이다.


  -  #MaxMessageSize=1000000

      MaxMessageSize=1000000 ( 최대 전송할 수 있는 메일 사이즈의 값을 활성화 시킨다. 송수신   하는 메일의 양을 줄이는 것은 서버의 부하를 줄일 수 있는 방법 중 하나이다. 설정값은 변경가능 하다.)


  -  O Timeout.initial=2m

     O Timeout.connect=1m

     O Timeout.iconnect=1m

     O Timeout.helo=2m  (최적화에 관련된 부분들이다.)



- #O MaxRecipientsPerMessage=100

     O MaxRecipientsPerMessage=30 ( 한번에 메일 발송시 동시발송이(참조나 전달등) 가능한 메일계정의 수를 말하는 것으로 SMTP을 서비스 하는 곳에서는 동시발송을 하게 되면 그만큼 프로세서를 많이 쓰게 되므로 적절하게 조절해 주는 것이 좋다. )


  - #O QueueLA=8

    O QueueLA=8 ( 서버의 Load Average가 8이상 증가하게 되면, 부하를 줄이기 위해서 메일을 발송하지 않고 queue에 쌓아둔다. 후에 load가 낮아지면 발송을 재개한다. 숫자는 조절 가능)


  - #O RefuseLA=12

    O RefuseLA=12 ( 서버의 Load Average가 12이상 높아지게 되면, sendmail의 동작을 멈춘다.

       외부의 공격으로부터 서버가 다운되지 않도록 하기 위한 조치이다. 숫자는 조절 가능하다 )



 

4-3. pop3 와 imap 비교


  pop과 imap은 서버로부터 클라이언트가 메일을 받을 수 있도록 통신을 하기 위한 프로토콜이다.

 

 

pop

imap

지    원

  거의 모든 메일서버에서 지원

  지원하는 메일서버가 적음

사용포트

110

143

메일 확인

  제목과 내용을 무조건 모두 다운로

  드후 확인 (서버에는 메일 남아있지

  않음)

  서버에 접속, 메일 다운로드 필요없

  이 서버에서 확인가능 (서버에 메일

  이 그대로 남아있음)

서버와의접속

  메일을 받아올 때만 접속, 이후 접속

  이 안되어도 로컬에서 메일 확인.

  메일을 보고있는 동안에는 계속 서

  버에 접속해 있어야 한다.

서버 공간

  메일을 다운로드 받아오므로 서버저

  장공간이 적게 소요

  서버에 메일을 두고 확인하는 방식

  으로 사용자 컴의 저장공간 적게소요

주 사 용

일반 인터넷 메일

웹 메일

특    징

한곳의 지정된 공간에서 메일을 읽

  을때 편리함

메일을 다운받을 때만 인터넷라인

  이용 라인속도가 느릴 때 유효

메일을 읽더라도 서버에 저장되어

  있으므로 어디서든지 메일 확인 가능

계층적 폴더 관리와 원격 폴더 조작

  이나 메일 폴더 공유가 가능하다.

< 표 4-3 pop과 imap의 비교 >

 


<그림 4-8 pop 구동 테스트>

 

 

<그림 4-9 imap 구동테스트>

 

  호스트웨이에서 설치되어지는 서버에는 기본적으로 imap을 이용한 pop3와 imap이 제공된다.

  하지만 여기에서는 qpopper를 이용한 pop3를 설치하고 그 사용법을 알아보도록 한다.


  현재 최신 qpopper의 버전은 qpopper4.0.4.tar.gz 이다.


  설치는 standalone모드와 server모드 설치가 있다. server모드는 xinetd 데몬안에 qpopper 실행 데몬을 추가하여, xinetd를 실행시킬때 동시에 qpopper가 동작되게 실행하는 방법으로 tcp-wrapper에 의한 차단이 가능한 반면에 요청을 받으면 xinetd가 qpopper의 데몬을 띄어주는 방식이라서 xinetd에 의존적이며, 단독으로 실행되는 것이 아니라 속도가 standalone 모드에 비하여 늦다.


  이에 반해 standalone 모드는 독립적으로 실행이 되며, 항상 qpopper 데몬이 listen 하기 때문에 요청이 들어오면 바로 처리할수 있어서 server모드에 비해서 속도가 빠르다. 단 tcp-wrapper에 의한 차단 효과를 기대할 수는 없다.


  여기서의 설치는 standalone 모드 방식으로 설치를 하게 될 것이다.

  먼저 압축파일을 해제한다.


  tar -zxvf qpopper4.0.4.tar.gz

  cd qpoper4.0.4

  CFLAGS="-O3 -march=i686 -funroll-loops -fomit-frame-pointer" \

  ./configure --enable-specialauth --enable-bulletins=/var/spool/bulls --enable-standalone

  make

  make install

  만약 매뉴얼 디렉토리가 없다는 에러가 발생하면 수동으로 만들어 주면된다.

  mkdir -p /usr/local/man/man8

  후에 다시 한번 make install을 해주면 정상적으로 설치가 될 것이다.

  mkdir /var/spool/bulls


  여기까지 무사히 되었다면 설치는 완료되었다.


  이제 qpopper를 실행시켜 볼 차례이다.

  만약 기존에 다른 pop3 프로그램으로 이미 110번 포트가 사용 중이라면 이미 사용 중인 프로그램을 중지 시킨 후에 실행을 시켜야 한다.

 

/usr/local/sbin/popper -s

 

  netstat -nap | grep :110 명령을 사용하여 110번 포트가 열려있는지 확인을 해본다.

  netstat 명령의 결과값이 나온다면 그것은 정상적으로 110번 포트가 열렸음을 뜻하며, popper가 정상적으로 동작, 수행되고 있다는 것을 의미하는 것이다.


  telnet을 통한 구동 test는 그림 <4-8>을 참고 하면 되겠다.


  이제 리부팅을 하더라도 qpopper가 자동으로 실행될 수 있도록 /etc/rc.local에 등록을 해주면 된다.


vi /etc/rc.local

  ========================

/usr/local/sbin/popper -s -R

  ========================


  -R 옵션이 하나 더 붙었다. 이것은 아래 TIP을 참고 하기 바란다. 왜 -R 이 더 추가가 되었는지

  확실히 알 수 있을 것이다.

 

 

TIP

 

 

 

 

 

아웃룩을 사용하여 메일서버로부터 메일을 받아올 때 서버로 연결하는 시간이 한참 걸

리는 것을 경험해 보았을 것이다.

그것은 아웃룩을 사용하는 사람의 PC가 reverse domain 에 설정되어 있지 않아서 이다.

서버의 telnet이나 pop3나 기타 tcp-wrapper의 영향을 받는 프로그램들은 로그를 남기

고자 한때 호스트명(도메인명)으로 남기고자 노력한다.

그래서 서버의 110번에 접속하여 메일을 받아가고자 접속한 IP를 거꾸로 추적하여 호스

트명(도메인명)을 알아내고자 하는데 reverse domain이 설정되어 있지 않거나 제대로 되

어있지 않다면 서버에서는 IP를 거꾸로 추적하는데 많은 시간을 소요하게 되고 그로인해

서 접속이나 연결에 속도가 걸리는 것이다.

( 이 시간은 서버가 IP를 찾다 찾다 못 찾아서 timeout이 걸리는 시간이다. )

그렇다고 사용자가 사용하는 IP를 일일이 reverse domain을 걸어달라고 할 수도 없는

노릇이다 보니, qpopper에서는 이 reverse domain을 체크하지 않는 옵션을 만들어 놓았

다.

바로 -R 이다. 이 옵션을 사용해서 qpopper를 실행시키게 되면 reverse-lookup을 하지

않아서 빠른 시간에 아웃룩으로 서버의 110번으로 접속하여, 메일을 가져올 수 있다.

 

/usr/local/sbin/popper -s -R


 

  여기까지 메일을 주고받는데 필요한 sendmail과 pop의 설치와 사용법에 대해서 알아보았다.

  최대한 필요한 부분은 많이 설명하려고 했으나 부족한 부분은 관리자가 각종 검색엔진이나, kldp.org등과 같은 전문적인 사이트에서 확인하고 배워야 함을 잊지 않았으면 한다.