본문 바로가기

Linux

리눅스 메일서버 구축 (sendmail 소스 컴파일 방법)



Sendmail은 SMTP를 통해서 메일 서비스 기능을 하는 것인데, 메일 서버간에 메일을 주고 받는 역할을 하는 것임.


이메일 송수신에 사용되는 프로토콜은 3가지가 있는디 대충 알아놓자.

SMTP: Simple Mail Transfer Protocol, 클라이언트가 메일을 보내거나, 메일 서버끼리 메일을 주고 받을때

POP3: Post Office Protocol, 메일 서버에 도착되어 있는 메일을 클라이언트로 가져올 때

IMAP: Internet Mail Access Protocol, POP3이랑 같음




시작해봅시다.



1. 이전버전 체크 + 실행파일 생성


우선 sendmail 이 설치되어있는지 확인해보고 있으면 지워주자

[root@server103 ~]# rpm -qa | grep sendmail

sendmail-8.13.4-2

[root@server103 ~]# rpm -e --nodeps sendmail-8.13.4-2 (--nodeps: 의존성 무시하고 지우라는 옵션 추가)


지웠으면 이제 sendmail 소스를 다운


[root@server103 ~]# mkdir -p /usr/local/sendmail

[root@server103 ~]# cd /usr/local/sendmail

[root@server103 sendmail]# wget http://pkgs.fedoraproject.org/repo/pkgs/sendmail/sendmail.8.14.0.tar.gz/bc0dee396b8090b3f696e748a9caf83d/sendmail.8.14.0.tar.gz

[root@server103 sendmail]# tar zxvf sendmail.8.14.0.tar.gz

[root@server103 sendmail]# cd sendmail-8.14.0/

[root@server103 sendmail]# make

[root@server103 sendmail]# make install


make install 할때 에러가 뜨는 걸 확인 할 수 있다.

install: cannot create regular file `/usr/man/man5/aliases.5': No such file or directory

install: cannot create regular file `/usr/man/man8/editmap.8': No such file or directory

install: cannot create regular file `/usr/man/man1/vacation.1': No such file or directory


그래서 필요한 디렉토리를 만들고 다시 make install 하기

[root@server103 sendmail-8.14.0]# mkdir -p /usr/man/man{1,5,8}

[root@server103 sendmail-8.14.0]# make install

에러 없이 설치되었으면 다음스텝으로 넘어가기




2. Sendmail 설정파일 생성


압축푼 폴더에서 INSTALL를 읽어보면

cf/cf 디렉토리에 가서 내 환경에 맞는 .mc파일을 sendmail.mc로 바꾼 후, sh Build sendmail.cf 명령어를 실행하라고 한다.

또한 압축 푼 폴더에서의 README랑 cf 디렉토리안의 README를 읽어보면,

Sendmail소스의 configuration files 는 cf고, cf 디렉토리 안에 있으며 .mc로 끝나는 파일이라고.

.mc 파일들이 여러종류가 있는데 지금 사용하고 있는 OS에 맞는 generic-*.mc를 사용하면 된다

나는 OS=Linux 이니까 generic-linux.mc를 사용 하면 될듯.

그다음 cf/cf디렉토리에서 sh Build install-cf 명령어를 이용해서 sendmail.cf를 인스톨, 

이때 sendmail.cf가 /etc/mail로 이동한다.


그럼 따라해봅시다.


[root@server103 sendmail-8.14.0]# cd cf/cf

[root@server103 cf]# ll --> 하면 .mc 파일들이 촤라락 보일거임. 거기서 우리는 generic-linux.mc

[root@server103 cf]# mv generic-linux.mc sendmail.mc

[root@server103 cf]# sh Build sendmail.cf


[root@server103 cf]# cd /etc/mail

[root@server103 mail]# ll

total 60

-r--r--r--  1 bin  bin   5594 Dec  4 15:59 helpfile

drwxr-xr-x  2 root root  4096 Dec  2 12:55 spamassassin

-rw-------  1 root bin      0 Dec  4 15:59 statistics

-r--r--r--  1 root bin  41354 Dec  4 15:56 submit.cf

(아직 install 하기 전이라서 /etc/mail 에서 sendmail.cf가 보이지 않는걸 알 수 있다.)


[root@server103 mail]# cd /usr/local/sendmail/sendmail-8.14.0/cf/cf

[root@server103 cf]# sh Build install-cf

Using M4=/usr/bin/m4

../../devtools/bin/install.sh -c -o root -g bin -m 0444 sendmail.cf /etc/mail/sendmail.cf

../../devtools/bin/install.sh -c -o root -g bin -m 0444 submit.cf /etc/mail/submit.cf

[root@server103 cf]# cd /etc/mail

[root@server103 mail]# ll

total 104

-r--r--r--  1 bin  bin   5594 Dec  4 15:59 helpfile

-r--r--r--  1 root bin  41509 Dec  4 16:17 sendmail.cf

drwxr-xr-x  2 root root  4096 Dec  2 12:55 spamassassin

-rw-------  1 root bin      0 Dec  4 15:59 statistics

-r--r--r--  1 root bin  41354 Dec  4 16:17 submit.cf

(install 후 /etc/mail 에서 sendmail.cf가 생긴걸 확인할 수 있음)




3. Sendmail 기타 설정파일 설정하기


1. access - sendmail의 접근을 제어하는 파일, 호스트나 도메인, 아이피, 이메일주소를 쓰고 이것을 허용하겠다면 RELAY,             

허용하지 않겠다고 하면 REJECT를 쓰면 된다. 특정 도메인의 스팸메일 차단하는데 쓰면 좋겠네.


[root@server103 mail]# vi access

자기ip주소 RELAY

127.0.0.1 RELAY

localhost RELAY

localhost.localdomain RELAY

적어주고 저장 (근데 이것들 안써도 되긴 하더이다.)

(적는 방법 더 자세히 알고 싶으면 cf/cf/ 에서 line 2509부터 읽어보쇼)


이것은 databse 즉 db파일이어야 하기 때문에 이렇게 텍스트로 적어논 파일을 db파일로 바꿔줘야한다.

makemap hash /etc/mail/access < /etc/mail/access 이런식으로 바꿔줄수 있다.


[root@server103 mail]# makemap hash access < access

[root@server103 mail]# ls access.db

access.db << 이렇게 생성이 되어야 함!!



2. aliases - 특정 계정으로 메일을 보냈을 경우 그 계정으로 메일이 도착하지 않고, 이 파일에 지정된 다른 계정으로 

메일이 전송될 수 있게 함. 즉, 특정 사용자에게 온 메일을 다른사람에게 보내준다거나, 메일링리스트를 작성해야 하는 경우에 사용되는 파일이라고 함


[root@server103 mail]# vi aliases

webmaster: root 적어주고 저장


역시 aliases.db 파일을 생성해줘야하니까. 

(이때 makamap hash aliases < aliases 하면 db파일 생성 되긴 하던데,,,, 왜 newaliases로 하는지는 모르겠다 ㅠㅠ)


[root@server103 mail]# newaliases

/etc/mail/sendmail.cf: line 73: fileclass: cannot open '/etc/mail/local-host-names': No such file or directory

can not chdir(/var/spool/mqueue/): No such file or directory

이런 에러가 뜨니까 없으면 만들어줘야지


[root@server103 mail]# touch local-host-names

[root@server103 mail]# mkdir /var/spool/mqueue

[root@server103 mail]# chmod 755 /var/spool/mqueue/ <<권한설정 해줘야함.




4. Sendmail 실행


[root@server103 mail]# /usr/sbin/sendmail -Ac -q1h -->중계용 데몬

[root@server103 mail]# /usr/sbin/sendmail -bd -q1h --> 제출용 데몬


(중계용, 제출용 이거 잘 모르겠지만, 제출용 데몬은 백그라운드로 실행되어 다른 호스트로부터 메일을 받을 준비를 취하고 있는 상태, 여기서 -bd는 데몬모드로 실행하라는 옵션이고 뒤의 -q1h는 큐에 있는 내용을 한시간 간격으로 비우라 는 의미...)


[root@server103 mail]# ps -ef | grep sendmail

smmsp     8195     1  0 17:03 ?        00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue

root      8198     1  0 17:03 ?        00:00:00 sendmail: accepting connections

이렇게 확인 한번 해주고

테스트를 해봅시다.


[root@server103 mail]# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 server103.localdomain ESMTP Sendmail 8.14.0/8.14.0; Tue, 4 Dec 2012 17:41:55 +0900

mail from:*****@gmail.com << mail from:보내는사람메일주소

250 2.1.0 *****@gmail.com... Sender ok

rcpt to:*****@gmail.com << rcpt to:받는사람메일주소

250 2.1.5 *****@gmail.com... Recipient ok

data              << data

354 Enter mail, end with "." on a line by itself

dfadfa

.      << . 을 찍어야 끝남

250 2.0.0 qB48ftiU008759 Message accepted for delivery

quit      << 나오기

221 2.0.0 server103.localdomain closing connection

Connection closed by foreign host.




확인 (메일이 안와있으면 스팸메일함도 체크하기)


따단~





** 나는

421 4.3.0 collect: Cannot write ./dfqB48V1PP008601 (bfcommit, uid=0, gid=51): Permission denied

이런 에러가 떠서 고생을 했는데 해결법은 간단했음 (aliases에 오타때문에 그런건줄 알았는데..)

/var/spool/mqueue 의 권한 때문이었음, 아까 chmod 755 /var/spool/mqueue 했는데도 뭐가 문제가 있었나봄.

그래서 chown -R root.root /var/spool/mqueue 로 해서 에러 해결!!!


이렇게 에러나 메일이 어떻게 전송되는지 보려면 log 파일을 열어보면 된다.

위치는 /var/log/maillog (tail -10 /var/log/maillog로 보기 ㅋ)