[메일][강좌] Sendmail 로 Mail 서버 구축하기 – 최신
Sendmail 로 Mail 서버 구축하기
목차
1. 메일서버란?
2. 메일서버의 작동방식
3. DNS에서 메일 설정하기
4. sendmail 설치하고 서비스 시작하기
5. sendmail 설정하기
6. SMTP 트랜잭션 자세히 보기
7. pop3 메일 서비스 설정하기
8. 마치며
1. 메일서버란?
메일 서버는 인터넷에 연결된 서버들간에 전자우편 전송 기능을 하며 이메일 교환은 SMTP(Simple Mail Transfer Protocol)를 통해 이루어진다. 일반적으로는 메일 서버가 설치된 유닉스 머신에서 직접 이메일을 교환하지 않고 메일 서버가 설치되지 않은 PC에서 이메일을 주고 받는다. 메일을 보내는 경우에는 가까운 서버에 있는 SMTP 프로토콜을 이용한 릴레이 형식으로 보내며 메일을 받을 때는 POP(Post Office Protocol)이나 IMAP(Internet Message Access Protocol)을 이용한다.
여기서 SMTP 프로토콜을 이용하여 메일을 교환하는 서버를 MTA(Mail Transfer Agent)라고 하고, 사용자가 작성한 전자우편을 MTA에 전달하고 자신의 수신함에 도착한 전자우편을 MTA에서 가져오는 역할을 하는 것이 MUA(Mail User Aget)라고 하며 보통 사용자가 직접 사용하는 프로그램이다.
SMTP 분야에서 가장 유명한 것은 Sendmail Inc.의 sendmail 프로그램으로 가장 오래전부터 사용이 되어 왔으며 현재도 가장 널리 사용되는 메일 서버 프로그램이다. 이외에 qmail, postfix, exim 등이 비교적 최근에 나와 점점 사용자층을 늘려가고 있다.
SMTP 서버들은 자신이 받은 전자우편을 사용자의 전자우편함 파일에 저장하며 이렇게 저장된 파일은 유닉스 서버에서 직접 mutt, pine, 넷스케이프 메신저 등의 프로그램을 사용하여 볼 수 있으며 윈도우가 설치된 PC에서는 Outlook Express, 넷스케이프 메신저 등을 이용할 수 있다. POP/IMAP 구현은 qpopper나 pine과 같이 개발되는 imapd등이 유명하다.
2. 메일서버의 작동방식
메일서버가 작동하는 방식은 다음와 같다.
– 전자우편 사용자가 Unix 시스템의 mail이나 pine, elm 등의 MUA를 이용하여 전자우편을 발송한다. (윈도우 사용자의 경우 Outlook Express나 Netscape Messenger를 이용하여 메일을 발송한다)
– 발송된 전자우편은 Mail Queue (/var/spool/mqueue) 에 잠시 저장된다.
– sendmail과 같은 MTA는 Mail Queue의 전자우편에서 수신자의 전자우편 주소를 이용하여 DNS에 질의하여 전자우편 수신 서버를 조사한다.
– 발송 MTA는 수신 MTA에 접속하여 전자우편을 발송한다. 일반적인 경우에는 발송 MTA가 수신 MTA에 직접 전자우편을 전송하지만 경우에 따라서는 다른 MTA를 경유하여 전송하기도 한다.
– 수신 MTA는 전자우편을 수신하여 수신자의 사서함 (/var/mail)에 저장한다.
– 수신자는 Unix 시스템의 mail이나 pine, elm 등의 MUA를 이용하여 자신의 사서함에 도착한 전자우편을 읽어볼 수 있다. (윈도우 사용자의 경우 Outlook Express나 Netscape Messenger를 이용하여 POP/IMAP 프로토콜을 통해 메일을 읽어볼 수 있다)
ㅇ SMTP
SMTP(Simple Mail Transfer Protocol)는 전자우편을 전송하기 위한 프로토콜이다. 전자우편을 전송하는 경우는 두가지 경우로 나누어 볼 수 있다. 하나는 사용자가 MUA를 이용하여 MTA로 전자우편을 전송하는 경우이고, 다른 하나는 하나의 MTA가 다른 MTA로 전자우편을 중계하는 경우이다. SMTP는 MTA 사이에서 사용되는 프로토콜로, 인터넷에 광범위하게 사용되고 있는 대표적인 응용 계층의 프로토콜이다. (RFC 821)
SMTP는 상당히 오랫동안 사용되어온 프로토콜로, SMTP가 처음 사용되었던 네트워크 환경에 적합하게 설계된 프로토콜이다. 현재의 네트워크 환경은 SMTP가 설계되었던 시점의 네트워크에 비하여 많은 변화가 이루어졌기 때문에 SMTP가 적합하지 못한 부분이 있다. 대표적인 문제점은 SMTP가 ASCII 7bit 코드 데이터를 전송하도록 설계되었기 때문에 한글이나 이진 파일등 8비트 코드로 표현되는 데이터를 제대로 전송하지 못한다는 것이다. 따라서 SMTP를 구현한 많은 MTA는 EUC-KR(8비트 한글 표준 코드 문자 집합, KS5601,KSC5636/US-ASCII)과 ISO-8859-x(유럽 문자)에 사용되는 8비트 문자를 투명하게 전송하지 못한다.
IETF(Internet Engineering Task Force)에서는 SMTP의 이러한 문제점을 해결한 확장 프로토콜로 ESMTP(Extended SMTP)를 제정하였다.
ESMTP는 SMTP를 수용하고 확장한 것으로 SMTP의 기능을 모두 지원할 뿐만 아니라 확장된 기능을 제공하는 프로토콜이다. ESMTP는 SMTP의 7비트 전송 한계를 넘어서 8비트 전송을 지원하고, 전자우편이 정확하게 도착하였는지를 확인할 수 있는 배달 확인 기능(Delivery Status Notification, RFC 1894), 전자우편 크기 제한 기능(Size Declaration, RFC 1870), 전송중 끊어진 전자우편의 재전송 기능(Checkpoint/Restart, RFC 1848)등을 지원한다. ESMTP는 현재에도 지속적으로 기능 확장이 이루어지고 있으며, 현재의 많은 MTA는 ESMTP를 지원하고 있다.
(** 주 : 제4회 리눅스 공동체 세미나 강의 B4 웹, 메일 서비스 구축하기 중 참고)
그림 1 메일 클라이언트 설정
3. DNS에서 메일 설정하기
여기서는 테스팅하려는 도메인이 test.co.kr이라고 가정하여 test.co.kr에 대한 네임서버를 ns.test.co.kr이라고 하겠다. test.co.kr 의 도메인에 대한 메일서버는 mail1.test.co.kr, mail2,test.co.kr로 가정한다.
네임서버에서 MX(Mail Exchange) 레코드는 도메인의 SMTP 메일 서버로 설정될 호스트명을 지정하는 곳이다. 아래의 세팅에서는 두개의 메일서버를 지정하고 있다. 다른 사람이 test.co.kr의 도메인의 특정한 계정으로 메일을 보낼 경우 네임서버에서 MX 레코드로 지정한 메일서버를 이용하게 된다. 만약 다른 사람이 운영하는 SMTP 메일서버에서 taejun@test.co.kr로 메일을 보내는 경우 먼저 test.co.kr의 네임서버에 세팅되어 있는 MX 레코드를 조회한다. 그러면 보내는 쪽의 SMTP 메일서버는 사용가능한 두개의 서버중 우선순위가 높은 mail1.test.co.kr을 메일서버로 선택하고 mail1.test.co.kr의 서버에 SMTP 접속을 시도한다. 만약 어떤 문제로 mail1.test.co.kr 서버에 접속을 하지 못한다면 mail2.test.co.kr 서버로 메일을 전달할 것이다. 여러 개의 메일서버를 운영하는 것은 현재처럼 이메일이 중요한 비즈니스 수단으로 사용되는 경우에는 매우 중요한 부분이다.
# cat /var/named/test.co.kr.zone
$TTL 1w
@ IN SOA ns.test.co.kr. root.test.co.kr. (
2002082101 ;Serial Number
3h ;Refresh
1h ;Retry
1w ;Expire
1h) ;Minimum TTL
;
IN A 211.111.111.111
IN NS ns.test.co.kr.
IN MX 10 mail1.test.co.kr.
IN MX 20 mail2.test.co.kr.
ns IN A 211.111.111.112
mail1 IN A 211.111.111.113
mail2 IN A 211.111.111.114
메일서비스를 하기 위해서는 먼저 위의 내용과 같이 DNS에 적절한 세팅이 되어 있어야 한다.
4. sendmail 설치하고 서비스 시작하기
sendmail은 BSD 기반으로 만들어지고 다른 시스템으로 포팅되어 현재 가장 많이 사용되고 있는 SMTP 서버이다. sendmail은 독특한 설정 파일을 가지고 있으며 룰셋을 이용한 비교적 유연한 제어가 가능하다. sendmail의 개발은 오픈 소스로 이루어졌으나 최근에는 sendmail의 상업적인 개발과 지원을 위하여 Sendmail Inc.사가 새로 세워졌다. sendmail 사이트는 아래와 같다.
http://www.sendmail.org
sendmail의 설치는 배포판(Redhat, Debian, Suse, Caldera 등)에 기본적으로 들어있는 프로그램을 사용할 수 있고 직접 sendmail 사이트에서 소스를 다운받아 설치할 수 있다. 일반적으로 배포판 업체에서는 범용적으로 사용할 수 있도록 프로그램을 구성해 놓으며 자신에게 필요한 기능이 별도로 필요한 경우에는 소스를 다운받아 필요한 기능을 추가하여 컴파일해서 사용해야 한다.
여기서는 실습의 편의를 위하여 배포판을 이용하여 설치할 것이다. 실제 서비스를 하는 경우에는 배포판에 있는 프로그램을 사용하더라도 해당 배포판의 메일서버에 보안관련 버그가 있는지 확인하고 보안버그가 있을 경우에는 각 배포판의 사이트에서 최신 버전을 받아 업그레이드해야한다.
먼저 기존에 sendmail이 설치되어 있는지 확인해야한다. Redhat 등 rpm 패키지 방식을 쓰는 배포판(Suse, Mandrake, Turbo 등)을 기준으로 하겠다.
# rpm -qa | grep sendmail
sendmail-8.11.6-15.s390.rpm
sendmail-cf-8.11.6-15.s390.rpm
sendmail-devel-8.11.6-15.s390.rpm
sendmail-doc-8.11.6-15.s390.rpm
메일서버를 세팅하기 위해서 필요한 것은 sendmail-8.11.6-15.s390.rpm 이며 sendmail-cf-8.11.6-15.s390.rpm 는 환경파일을 개개인의 필요에 맞게 새롭게 설정하는 경우 필요한 패키지이다. devel은 개발관련 패키지이고 doc는 sendmail 관련 문서이다. 여기서는 sendmail-8.11.6-15.s390.rpm 만 있으면 된다.
만약 sendmail 패키지가 설치되어 있지 않다면 배포판 CD나 ftp를 이용하여 설치할 수 있다. 설치작업과 세팅 작업은 root 계정으로 해야한다.
CD를 읽기 위하여 먼저 CD-ROM을 마운트해야한다. (배포판은 여러장의 CD로 구성되어 있고 일반적으로는 첫번째 CD에 sendmail이 들어있다)
# mount -t iso9660 /dev/cdrom /mnt/cdrom
CD에서 설치에 필요한 패키지가 있는 디렉토리로 이동한다.
# cd /mnt/cdrom/Redhat/RPMS
ls 명령을 이용하여 필요한 패키지가 있는지 확인한다.
# ls sendmail*
원하는 패키지가 있다면 이제 sendmail 패키지를 설치한다.
# rpm -Uvh sendmail-8.11.6-15.s390.rpm
설치한 sendmail 패키지를 앞에서 사용했던 명령어를 이용 확인해보자.
# rpm -qa | grep sendmail
설치하고 나서는 해당 패키지가 어느 디렉토리에 어떤 파일들이 있는지 궁금할 것이다. 이 경우에는 아래 rpm 명령을 이용하여 패키지의 위치를 확인할 수 있다.
# rpm -ql sendmail
/etc/mail 는 sendmail 설정파일이 있는 디렉토리로 sendmail 에 여러가지 기능을 사용하기 위해 주로 수정을 하는 곳이다. 메일서버에서 받은 메일이 저장되는 메일보관 디렉토리는 /var/spool/mail (또는 /var/mail) 이다. 해당 디렉토리로 이용하면 각 계정마다 별도의 파일이 있고 vi 에디터로 안의 내용을 볼 수도 있다. 물론 root 권한을 이용하여 남의 메일을 읽는 것은 개인의 사생활 침해가 되기에 테스팅으로만 이용하기 바란다.
이제 sendmail 프로그램 설치를 마쳤고 메일 서버 프로그램을 실행하여 보자. 프로그램 실행은 수동으로 할 수도 있고 부팅시 자동으로 서비스가 실행되도록 설정을 할 수도 있다.
먼저 수동으로 띄워보자.
# sendmail -bd -q1h
sendmail 명령어 뒤에 있는 옵션은 sendmail의 실행과 연관이 있는 것으로 –bd는 대몬 모드로 수행하겠다는 것이고 –q1h는 메일 스풀의 점검시간을 1시간으로 하겠다는 것이다. 여기서 메일 스풀 점검시간은 메일을 받는 SMTP 서버에서 문제가 있는 경우 보내는 메일을 잠시 보류하고 다시 메일을 보내려고 시도하는 간격을 말한다.
sendmail 프로세스가 떠 있는지 확인을 하여보자.
# ps auxw | grep sendmail
root 6856 0.0 0.9 3808 1260 ? S Sep11 0:00 sendmail: accepting connections
taejun 11042 0.0 0.4 1704 572 pts/0 R 23:06 0:00 grep sendmail
수동으로 띄운 sendmail을 다시 내리는 것은 아래와 같다.
# killall sendmail
ps 명령을 이용하여 다시 확인을 해보자.
sendmail의 시행과 정지를 편하게 만들어놓은 스크립트를 이용할 수 있다. 아래와 같이 sendmail을 실행할 수 있다.
# /etc/rc.d/init.d/sendmail start
뒤의 start라는 인자를 주지 않고 실행하면 간단한 사용방법이 나온다.
sendmail을 정지시키는 것은 아래와 같다.
# /etc/rc.d/init.d/sendmail stop
sendmail.cf의 설정파일을 바꿀 경우에는 sendmail을 재시작해주면 되는데 이 경우에는 restart라는 옵션을 이용하면 된다.
일반적으로 메일 서비스는 1년 365일 24시간 가동되어야 하므로 부팅시 자동으로 실행이 되도록 설정해야한다. 이를 위해서는 setup 명령을 이용하여 System Services를 고르거나 ntsysv 명령을 이용한다.
# /usr/sbin/ntsysv
그림 2 sendmil 서비스 확인하기
위에서 나오는 화면에서 sendmail 부분을 스페이스키를 이용하여 체크해주면 된다. 그러면 이후에는 재부팅시 자동으로 sendmail 프로그램이 실행된다.
가급적 /etc/rc.d/init.d/sendmail 스크립트를 이용하여 대몬을 실행하거나 정지하는 것이 좋다.
sendmail 프로그램이 제대로 실행되었는지 확인을 하기 위해서 시스템의 로그파일을 이용할 수도 있다.대몬 관련 메시지는 아래의 파일을 이용하여 확인할 수 있다.
# tail -f /var/log/messages
Sep 17 00:54:07 test sendmail: sendmail shutdown succeeded
Sep 17 00:54:07 test sendmail: sm-client shutdown succeeded
Sep 17 00:54:12 test sendmail: sendmail startup succeeded
참고로 메일관련 메시지는 /var/log/maillog에 남으며 메일을 전송하거나 받을때 문제가 생긴다면 가장 먼저 살펴보아야한다. 실습을 하면서 계속 maillog에 어떤 내용이 기록되는지 보기 바란다.
먼저 telnet 을 이용하여 이메일 클라이언트 프로그램을 에뮬레이트해서 이메일을 보내보자.
# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 test.co.kr ESMTP SMTP 8.11.6-15 Tue, 17 Sep 2002 13:36:35 +0900 C=kr
helo test.co.kr
250 test.co.kr Hello localhost.localdomain [127.0.0.1], pleased to meet you
mail from:taejun@test.co.kr
250 2.1.0 taejun@test.co.kr… Sender ok
rcpt to:taejun@tunelinux.pe.kr
250 2.1.5 taejun@tunelinux.pe.kr… Recipient ok
data
354 Enter mail, end with “.” on a line by itself
subject: test mail
This is test mail.
.
250 2.0.0 g8H4aZ0x017910 Message accepted for delivery
quit
221 2.0.0 test.co.kr closing connection
helo 명령을 이용해 간단하게 자기 소개를 하고나서 mail from 을 이용해 발신자의 이메일 주소를 적는다. 그다음 rcpt to 를 이용하여 수신자의 이메일 주소를 적고 data 를 이용해 메일의 내용을 적는다. subject 라고 되어있는 것은 메일의 제목이다. 이메일 본문 내용을 다 적고 난 후 마지막 줄에 .을 입력한다. 서버에서 메시지를 접수했다는 응답이 나온후에 quit를 입력하면 서버 접속이 마무리된다. 지금은 별도의 메일 프로그램을 사용하지 않고 telnet을 이용하여 직접 메일서버와 통신을 하면서 메일을 보낸 것이다. 실제 telnet으로 메일을 보내는 경우는 없겠지만 메일 서버와 어떤 과정을 통해 통신을 하고 메일을 보내는지 과정을 이해하는데에는 도움이 될 것이다.
5. sendmail 설정하기
ㅇ sendmail.cf 설정하기
sendmail.cf는 sendmail에 대한 기본설정을 하는 파일로 사람이 보기 편하게 되어 있는 것이 아니라 sendmail 대몬에 맞게 최적화되어 있어서 보기가 까다롭다. 그래서 sendmail.cf 설정은 유닉스 관리자들이 설정하기에 가장 복잡한 부분으로 간주하고 있다. 그러나 대부분의 경우 이 설정파일을 수정할 경우는 별로 없으며 기본 설정만으로도 sendmail을 잘 운영할 수 있다.
이중 몇가지만 간단히 살펴보겠다.
# 메일을 서비스할 도메인 목록 파일
Fw/etc/mail/local-host-names
# 송수신되는 메시지의 크기 제한(byte 단위)
O MaxMessageSize=1000000
# Sendmail 보안구현을 위한 프라이버시 보호 설정
O PrivacyOptions=authwarnings,needmailhelo,novrfy,noexpn,restrictqrun
# 시스템 로드평균이 지정된 값을 넘어가는 경우 접속 요청을 거부
O RefuseLA=18
# SMTP 서버에 접속할때의 메시지
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
# 한번에 발송할 수 있는 수신자의 최대 개수
O MaxRecipientsPerMessage=100
ㅇ /etc/mail/aliases를 이용하여 사용자에 대한 alias 작성하기
서버을 세팅한 후에는 cron 메시지 등이 모두 root 계정으로 이메일을 보낸다. 이런 경우 root 계정으로 오는 이메일을 보려면 root 계정을 이용해야 할까? webmaster라는 계정으로 오는 메일을 여러 명이서 동시에 받아보려면 어떻게 할까? 이런 경우에 사용되는 것이 aliases 이다.
root: taejun
webmaster: taejun, admin, service
aliases 파일을 위와 같이 세팅하면 root로 오는 메일은 taejun 계정으로 전달되고 webmaster 로 오는 메일은 taejun, admin, service 라는 계정으로 전달이 되어 여러 명이 동시에 같은 메일을 받아볼 수 있다. 이러한 기능을 이용하여 support 로 오는 메일은 기술지원 담당자에게, sales로 오는 메일은 영업 담당자에게 보내도록 설정할 수 있다.
sendmail은 aliases 설정 파일을 직접 사용하지 않고 파일의 DBM 데이터베이스 버전을 사용한다. aliases 파일을 수정한 후에는 아래와 같은 명령을 실행하여 db를 새로 구성해야한다.
# /usr/bin/newliases
sendmail cf 파일에 아래와 같이 지정이 되어있다.
O AliasFile=/etc/mail/aliases
ㅇ /etc/mail/access를 이용하여 메일서버로의 접근 제한하기 (스팸메일 방지 및 보안을 위하여 중요함)
access 파일은 sendmail 서버에 대한 접근 제한 데이터베이스를 설정하는데 사용한다. 특히 스팸메일 방지와 보안을 위하여 중요한 파일이다. sendmail 8.9.x 대부터 스팸 메일의 폐해 때문에 기본적으로 모든 곳에서의 메일 발송을 막아놓도록 되어있다. 설치 후에 설치한 메일서버를 이용하여 다른 컴퓨터에서 메일을 보낼 경우 해당 컴퓨터의 IP에 대한 RELAY를 풀어줘야한다.
설정은 다음과 같은 형식으로 되어 있다.
host or user access control option
host or user 에는 호스트 이름, 도메인 이름, ip 주소, 네트워크 주소, 이메일 주소를 사용하며 access control option에는 OK, RELAY, REJECT, DISCARD 등이 있다.
Access control option 은 다음과 같다.
OK 지정된 호스트나 사용자가 보낸메일은 다른 설정 rule 이 거부하는 경우
에도 받아들인다.
RELAY 지정된 호스트에 대해 SMTP 메일 중계 역할을 한다. 즉 지정된 도메인에
있는 사용자에게 오는 메일을 받고 그 도메인에있는 사용자가 서버를 통
해 메일을 보낼수 있도록 한다. 지정된 도메인에서 오는 메일은 다른 룰
이 거부하는 경우에도 받아 들인다.
REJECT 지정된 도메인과 관련된 모든 메일(수신/발신)을 거부한다.
DISCARD $#discard mailer를 사용해 메세지를 완전히 폐기한다. 메세지를 받기는
하지만 배달은 하지않고 발신자에게 폐기사실을 알리지 않기 때문에, 발
신자는 배달되었다고 생각하게 된다.
501 <message> 지정된 user@host 와 발신자의 주소가 전체 혹은 부분적으로 일치할경우
이메일을 받지 않는다. 뒤의 message에는 return mail 에 포함될 에러 메시지
구문을 지정하여 넣을수 있다.
553 <message> 발신자의 주소에 호스트명이 없을 경우 메일을 받지 않는다.
550 <message> 지정된 도메인과 관련된 메일을 받지 않는다.
이중 메일 전송과 관련있는 것이 RELAY로서 다른 곳의 컴퓨터에서 해당 메일서버를 이용하여 메일을 보내려고 할 경우에는 해당 IP를 등록해주어야 한다. 예를 들어 211.50.6.245 의 IP를 가지고 있는 윈도우 클라이언트가 있는 경우 현재 세팅한 메일서버를 이용하여 메일을 보내려면 아래와 같은 설정을 해주어야 한다. IP주소 대신 네트워크 주소(211.50.6.0 등)을 이용하여 해당 네트워크에 있는 모든 PC에서 메일발송을 할 수도 있다.
211.50.6.245 RELAY
RELAY로 풀어준 IP에 대해서는 해당 메일서버를 이용한 메일 발송이 가능하며 메일 클라이언트 프로그램에서는 지금 설정한 메일서버를 “보내는 메일서버”로 지정하면 된다.
그런데 만약 이 메일서버를 이용하려는 사용자가 고정 IP가 아닐 경우는 어떻게 할까? 이런 경우 때문에 어디에서나 이 메일서버를 이용하여 메일 전송을 하도록 설정해둔다면 수많은 스팸메일이 자신의 메일서버를 이용하게 될 것이다. 이러한 경우에는 SMTP AUTH 기능을 이용할 수 있다. 메일을 받는 경우에는 서버의 계정과 비밀번호를 이용하여 인증 과정을 거치지만 메일을 보내는 경우는 RELAY 가 지정되어있으면 가능하며 별도의 인증과정을 거치는 것이 아니다. 이런 경우에 SMTP AUTH 기능을 이용하여 메일을 보내는 서버에서도 인증 과정을 거칠 수 있다. SMTP AUTH 기능은 별도의 프로그램 설치가 필요하므로 메일서버에 관심을 가지게 된다면 한번 살펴보면 좋은 기능이다.
sendmail은 aceess 설정 파일을 직접 사용하지 않고 파일의 DBM 데이터베이스 버전을 사용한다. access 파일을 수정한 후에는 아래와 같은 명령을 실행하여 db를 새로 구성해야한다.
# makemap hash /etc/mail/access < /etc/mail/access
실행후에는 같은 디렉토리안에 access.db 파일이 만들어진다.
ㅇ /etc/mail/local-host-names를 이용하여 서비스할 메일 수신지 설정
예전에는 sendmail.cw 였다가 sendmail 8.10 버전부터는 local-host-names 로 파일 이름이 바뀌었다. 여기에는 메일을 받을 호스트와 도메인 이름을 지정한다. DNS서버에 MX 레코드가 정확하게 설정이 되었다고 하더라도 local-host-names에 지정이 되어 있어야한 해당 도메인에 대한 메일을 받을 수 있다. 여러 개의 도메인을 호스팅하고 있는 메일 서버라면 각 도메인을 local-host-names에 추가해 주어야 한다. 보통 이 설정을 하지 않고 메일 받는 것이 되지 않는다고 하는 경우가 많다.
이파일은 sendmail.cf 에서 Fw/etc/mail/local-host-names로 지정이 되어 있다.
ㅇ .forward를 활용하여 메일 포워딩하기
사용자 계정 디렉토리 안에 .forward 파일이 존재하면 메일 서버로 오는 메일을 파일안에 기록된 메일 주소로 전달해준다. 예를 들어 특정한 계정의 홈디렉토리에 아래와 같이 .forward 파일을 설정했다고 하자.
$ cat .forward
webmaster@hitel.net
test@hitel.net
이 계정에서 메일을 받으면 자동으로 webmaster@hitel.net 과 test@hitel.net 으로 메일이 전달이 된다. 이러한 기능을 이용하여 자신의 계정으로 오는 메일을 주로 쓰는 메일 계정으로 전달할 수도 있고 간단하게 자신만의 메일링리스트를 구현할 수도 있다.
6. SMTP 트랜잭션 자세히 보기
sendmail –vt 명령을 이용하여 sendmail이 어떤 식으로 메일을 전송하는지 상세히 볼 수 있다. 아래에서 진하게 입력된 부분은 자신이 직접 입력해야 한다. to는 메일을 받을 주소이고 from은 메일을 보내는 주소이다. subject는 제목이며 그 이후에 본문을 입력하고 다 입력했으면 . (콤마)를 치면 된다. 그 이후 보내는 메일 서버와 받는 메일 서버가 주고받는 메시지들이 나온다.
# sendmail -vt
to:taejun@tunelinux.pe.kr
from: taejun@test.co.kr
subject: test mail
This is test mail
.
taejun@tunelinux.pe.kr… Connecting to localhost.localdomain. via relay…
220 test.co.kr ESMTP SMTP 8.11.6-15 Tue, 17 Sep 2002 01:25:22 +0900 C=kr
>>> EHLO test.co.kr
250-test.co.kr Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
>>> MAIL From:<taejun@test.co.kr> SIZE=84 AUTH=taejun@test.co.kr
250 2.1.0 <taejun@test.co.kr>… Sender ok
>>> RCPT To:<taejun@tunelinux.pe.kr>
>>> DATA
250 2.1.5 <taejun@tunelinux.pe.kr>… Recipient ok
354 Enter mail, end with “.” on a line by itself
>>> .
250 2.0.0 g8GGPM0x017317 Message accepted for delivery
taejun@tunelinux.pe.kr… Sent (g8GGPM0x017317 Message accepted for delivery)
Closing connection to localhost.localdomain.
>>> QUIT
221 2.0.0 test.co.kr closing connection
위에서 >>> 로 표시된 부분이 로컬에 있는 sendmail 서버에서 원격에 있는 sendmail 서버로 메시지를 보내는 것이다. telnet tunelinux.pe.kr 25로 접속하여 직접 확인을 해 볼 수도 있다.
7. pop3 메일 서비스 설정하기
일반적으로 메일을 받기 위해서 직접 서버에 접속을 하지는 않을 것이다. 개인의 PC에서 Outlook Exress 등의 메일 프로그램을 이용하여 메일을 받는다. 이러한 경우 POP이나 IMAP 서버를 이용한다. 대부분의 사용자들이 직접 유닉스에 텔넷으로 접속하여 메일을 보고자 하지는 않을 것이다. SMTP가 서버간에 메일을 전송한다면 POP이나 IMAP은 메일서버에 있는 메일을 클라이언트로 가져오는 기능을 한다. 기능상으로는 IMAP이 더 낫지만 실제로는 POP 사용자가 더 많다. POP은 서버에 있는 메일을 다운로드하여 클라이언트에서 본다면 IMAP은 자신의 클라이언트에 다운로드받지 않고 서버에서 메일을 읽을 수 있다. 여기서는 imap이라는 프로그램을 이용하여 pop3 를 설정해 보겠다. 참고로 imap 패키지에는 POP, IMAP 둘다 이용가능하다.
imap 패키지가 설치되어있는지 확인을 한다.
# rpm –qa | grep imap
설치가 되어 있지 않다면 배포판 CD를 이용하거나 ftp를 이용해 설치한다.
# rpm –Uvh imap-2000c-15.s390.rpm
이제 pop 서버 설정을 할 차례이다. 배포판에 들어있는 패키지에 기본적인 설정은 되어있으며 pop 서버에 접속할 ip만 지정하면 된다. 설정파일은 /etc/xinetd.d/ipop3 이다.
# vi /etc/xinetd.d/ipop3
service pop3
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/ipop3d
log_on_success += HOST DURATION
log_on_failure += HOST
disable = yes
}
여기서 설정을 바꾸거나 추가할 것은 두가지이다.
disable = yes
only_from = 127.0.0.1
disable 이 yes로 되어있으면 사용하지 않는다는 것이므로 no로 바꾸어주어야한다. 인터넷 서비스는 보안과 연관이 되므로 기본적으로 사용이 off 되어 있다고 생각을 하면 된다. only_from 은 접속할 ip를 지정하는 것이다. 서버에 누구나 접속하면 안되므로 접속할 ip를 제한하는 것이다. 자신의 클라이언트 pc의 ip를 넣어주면 된다.
이렇게 설정을 하고 난후 ntsysv를 확인하고 xinetd 명령을 실행해 주어야 한다. ntsysv 에서 ipop3 에 체크가 되어 있지 않으면 체크를 해준다. 위에서 ipop3d의 설정파일에 disable 을 no로 바꾸었으면 자동으로 체크가 되어 있을 것이다.
# /usr/sbin/ntsysv
그림 3 pop3 서비스 확인하기
# /etc/rc.d/init.d/xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
sendmail은 프로그램이 독자적으로 실행을 하지만 pop3나 imap 서버 프로그램은 xinetd라는 프로그램의 도움을 받아 실행을 한다. 그러므로 xinetd를 재실행해야 설정에서 변경한 것을 xinetd에서 읽을 수 있다. sendmail은 서버 시스템에 항상 떠 있지만 pop3나 imap 서버 프로그램은 사용자가 메일 클라이언트 프로그램으로 접속하는 경우에만 xinetd의 도움을 얻어 실행이 된다고 생각하면 된다.
이제 메일 클라이언트 프로그램을 실행하여 서버에 있는 메일을 자신의 pc에서 확인하면 된다. sendmail과 마찬가지로 /var/log/maillog의 내용을 살펴보면 도움이 된다.
참고로 xinetd가 아니라 예전의 inetd 프로그램을 이용하는 경우가 있는데 이때는 /etc/inetd.conf 에서 pop-3에 해당하는 줄을 수정하고 inetd를 재시동하면 된다. 이 경우에는 TCP wrapper(tcpd)를 이용하여 접근 권한을 제한하여야 하며 상세한 내용은 이메일이나 리눅스 관련 사이트를 참고하기 바란다.
pop3 메일 또한 telnet 을 이용하여 메시지가 처리되는 과정을 이해할 수 있다.
# ls > list.txt
# mail -s test taejun < list.txt
# telnet localhost pop3
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
+OK POP3 localhost.localdomain v2001.78rh server ready
user taejun
+OK User name accepted, password please
pass xxxxxx
+OK Mailbox open, 1 messages
list
+OK Mailbox scan listing follows
1 552
.
retr 1
+OK 552 octets
Return-Path: <root@test.co.kr>
Received: from test.co.kr (localhost.localdomain [127.0.0.1])
by test.co.kr (8.11.6/8.11.6) with ESMTP id g8H4nt0x018029
for <taejun@test.co.kr>; Tue, 17 Sep 2002 13:49:55 +0900
Received: (from root@localhost)
by test.co.kr (8.11.6/8.11.6/Submit) id g8H4nsF5018028
for taejun; Tue, 17 Sep 2002 13:49:54 +0900
Date: Tue, 17 Sep 2002 13:49:54 +0900
From: root <root@test.co.kr>
Message-Id: <200209170449.g8H4nsF5018028@test.co.kr>
To: taejun@test.co.kr
Subject: test
Status:
list.txt
mail/
package/
updates/
.
quit
+OK Sayonara
Connection closed by foreign host.
테스팅을 위해 미리 사용자를 만들어두고 메일을 보내두어야 한다. 위에서는 리눅스에 들어있는 mail 이란 이메일 프로그램을 이용하여 taejun 이라는 사용자에게 메일을 보내는 것이다. ls는 현재 디렉토리에 있는 파일의 목록을 보는 것으로 메일 내용을 간편하게 작성하기 위해 list.txt라는 파일을 만들었다. 이제 taejun 이라는 사용자에게 메일을 하나 보낸 것이다. 먼저 telnet 으로 pop3 포토에 연결을 한다. user는 메일 박스를 열 사용자를 지정하고 pass는 해당 사용자의 비밀번호이다. List 명령을 이용하면 현재의 메시지 목록을 볼 수 있는데 조금 전에 발송한 한통의 메일이 있다. 내용을 보기 위해서 retr 1 (첫번째 메시지)을 입력하면 첫번째 메일 내용이 출력된다. 메일내용에 없는 부분은 메일의 헤더 부분으로서 메일전송시 자동으로 생성이 된다. 마지막으로 quit를 입력하여 pop3 서버와의 연결을 끊는다.
8. 마치며
이상으로 리눅스 서버를 SMTP, POP3 메일 서버로 설정하는 방법을 배웠다. 생각보다는 어렵지 않게 자기만의 메일 서버를 구축할 수 있다. 실제 서비스를 할 경우에는 메일 프로그램 설치 전에 보안과 관련한 버그가 있는지 확인을 하고 보안버그가 있다면 최신의 프로그램으로 업데이트를 해야 한다. 그리고 필요한 기능에 따라 접근할 수 있는 ip를 제한하여 최대한 보안 위협을 줄여야 할 것이다.
** 관련자료
sendmail 사이트 : http://sendmail.org
UW Imap : http://www.washington.edu/imap/
IBM 사이트 : http://www.ibm.com
IMB eServer ZSeries : http://www-903.ibm.com/kr/zseries/
Linux at IBM : http://www-903.ibm.com/kr/linux/
리눅스 한글 자료 : http://kldp.org
레드햇 사이트 : http://ww.redhat.com
Sendmail 2nd Edition by Bryan Costales with Eric Allman. O’Reily & Associates, Inc.
DNS & BIND 개정 4판. 폴 앨비츠, 크리켓 류 저 이성희역. O’Reily & Associates, Inc., 한빛미디어㈜