본문으로 바로가기

MAIL Server

category Linux/Linux Network 2017. 9. 13. 19:38
  • 메일 관련 기초 용어
- E-MAIL
- MTA ( Message Transfer Agent )
메일 전송 에이전트(MTA, Message Transfer Agent)는 메일을 다른 메일서버로 전달해 주는 프로그램들인데 대표적인 프로그램은 sendmail, qmail 같은 프로그램이 있다. 또한 postfix, smail, exim, Exchange, EMWAC 등도 있다.
-> RedHat Enterprise Linux(RHEL) : Sendmail, Postfix , Fetchmail

- MDA ( Mail Delivery Agent = LDA ( Local Delivery Agent ))
메일 딜리버리 에이전트(MDA, Mail Delevery Agent)는 사용자가 작성한 메일을 MTA에게 전달하고 목적지 MTA까지 전달된 메일을 개별 사용자의 편지함으로 분류해서 전달해 주는 직업을 담당하는 것이 바로 MDA이다. 
-> RedHat Enterprise Linux(RHEL) : mail, Procmail

- MUA ( Mail User Agent )
MUA는 때로 이메일 에이전트 또는 이메일 클라이언트라는 말로 불리기도 한다. 
메일 사용자 에이전트(MUA, Message User Agent)는 메일을 송수신하는 클라이언트용 프로그램들은 넷스케이프 메시저, 아웃룩 익스프레스, elm, pine, mutt, Evolution 등이 있다.
-> RedHat Enterprise Linux(RHEL) : Evolution, Mozilla Mail(GUI), mutt(TUI)


- 메일 관련 프로토콜

메일 전송을 위한 프로토콜(Mail Transport Protocol): SMTP, ESMTP 등

메일 수신을 위한 프로토콜(Mail Access Protocol)   : POP3, IMAP4 등


  • 메일 동작 원리


- Envelope : 송신측과 수신측의 메일 주소를 나타낸다. ( 메일헤더)

- Message  : Header와 Body로 구성된다. (메일바디)

Header : From, To, Cc, Date, subject등의 필드로 시작된다.

Body   : 최대 1000문자의 7비트 ASCII문자로만 구성된다.


sendmail 동작원리



위의 그림은 HostA에서 HostB로 메일을 보내는 과정이다.
① HostA의 사용자는 MUA(EX: Outlook)을 통해서 메일서버에 메일을 작성해서 보내게 된다.
② MailA에서는 잠시동안 /var/spool/mqueue라는 곳에 잠시 큐잉 되었다가 이상이 없으면 MTA(EX: sendmail)로 보낸다.
③ MailA의 MTA(EX: sendmail)은 메일을 MailB로 보낸다.
④ MailB의 MTA(EX: sendmail)은 메일을 /var/mail 디렉토리 밑에 사용자 이름의 파일에 저장하게 된다.
⑤ HostB의 사용자는 MUA(EX: Outlook)을 통해서 서버에 있는 자신의 메일을 읽어 볼수 있다.

  • 메일 프로토콜 종류 및 사용법
-종류
SMTP
ESMTP
POP3
IMAP4

SMTP ( Simple Mail Transfer Protocol )

# telnet localhost 25

 

 Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 linux.example.com ESMTP Sendmail 8.13.8/8.13.8; Wed, 13 Sep 2017 18:03:39 +0900

help /* 입력 */
214-2.0.0 This is sendmail
214-2.0.0 Topics:
214-2.0.0       HELO    EHLO    MAIL    RCPT    DATA
214-2.0.0       RSET    NOOP    QUIT    HELP    VRFY
214-2.0.0       EXPN    VERB    ETRN    DSN     AUTH
214-2.0.0       STARTTLS
214-2.0.0 For more info use "HELP <topic>".
214-2.0.0 To report bugs in the implementation see
214-2.0.0       http://www.sendmail.org/email-addresses.html
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info
QUIT /* 입력 */

 


POP3 명령어


# telnet localhost 110 /* 서비스 open 확인 */

 

 Trying 127.0.0.1...

telnet: connect to address 127.0.0.1: Connection refused

telnet: Unable to connect to remote host: Connection refused

 


# rpm -qa | grep dovecot  /* 패키지 확인 */


# vi /etc/dovecot.conf

 

......중략.........

# If you only want to use dovecot-auth, you can set this to "none".

protocols = imap imaps pop3 pop3s   /* 주석 제거 */

......중략.........

 


# service dovecot restart

# chkconfig dovecot on


# telnet localhost 110

 

 Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

+OK Dovecot ready.

user user01

+OK

pass user01

+OK Logged in.

list

+OK 2 messages:

1 573

2 574

.

top 1 1

+OK

Return-Path: <root@linux.example.com>

Received: from linux.example.com (linux.example.com [127.0.0.1])

        by linux.example.com (8.13.8/8.13.8) with ESMTP id v8D9Akvx004795

        for <user01@linux.example.com>; Wed, 13 Sep 2017 18:10:46 +0900

Received: (from root@localhost)

        by linux.example.com (8.13.8/8.13.8/Submit) id v8D9AkI5004794

        for user01; Wed, 13 Sep 2017 18:10:46 +0900

Date: Wed, 13 Sep 2017 18:10:46 +0900

From: root <root@linux.example.com>

Message-Id: <201709130910.v8D9AkI5004794@linux.example.com>

To: user01@linux.example.com

Subject: test


test1

.

retr 1

+OK 573 octets

Return-Path: <root@linux.example.com>

Received: from linux.example.com (linux.example.com [127.0.0.1])

        by linux.example.com (8.13.8/8.13.8) with ESMTP id v8D9Akvx004795

        for <user01@linux.example.com>; Wed, 13 Sep 2017 18:10:46 +0900

Received: (from root@localhost)

        by linux.example.com (8.13.8/8.13.8/Submit) id v8D9AkI5004794

        for user01; Wed, 13 Sep 2017 18:10:46 +0900

Date: Wed, 13 Sep 2017 18:10:46 +0900

From: root <root@linux.example.com>

Message-Id: <201709130910.v8D9AkI5004794@linux.example.com>

To: user01@linux.example.com

Subject: test


test1

.

dele 1

+OK Marked to be deleted.

list

+OK 1 messages:

2 574

.

quit

+OK Logging out, messages deleted.

Connection closed by foreign host.

 


  • sendmail 메일 서버
메일 서버는 DNS 서버의 의존적이다. 
-> root@naver.com : naver.com이 도메인 이름이다.( 특정 서버가 아니다. ) 
-> 누군가 mail이 저장될 서버를 지정해줘야하는데 DNS서버가 이 역할을 해주므로 메일서버는 DNS 서버에 의존적이다.

패키지: sendmail, sendmail-cf
데몬 & 포트 & 프로토콜: /usr/sbin/sendmail, 25, TCP
주 설정 파일: /etc/mail/sendmail.cf
하위 설정 파일: /etc/mail/*, /etc/aliases
스크립트: /etc/init.d/sendmail

프로토콜 & 포트번호
==============
smtp          25
smtps        465
pop3        110
pop3s        995
imap        143
imaps        993
==============


# rpm -qa | grep sendmail  /* 프로그램 확인 */


# grep smtp /etc/services  /* 포트 확인 */


# cd /etc/mail ; ls     /* 설정파일 확인 */


[참고] DNS 서버 zone 파일 설정

linux.example.com.    IN      MX 10   mail.linux.example.com.

mail                     IN      A       192.168.17.220



- sendmail 설정 파일

파일의 종류

설 명

/etc/mail/aliases

메일 엘리어스 설정 파일

/etc/mail/sendmail.cf

메일 주 설정 파일(sendmail 주 설정 파일)

/etc/mail/access

메일 중계 기능 설정 파일

/etc/mail/virtusertable

메일 가상 메일 설정 파일

/etc/mail/local-host-names

메일 서버 도메인 기록 파일

/etc/mail/trusted-users

메일 신뢰 사용자 지정 파일

/etc/mail/domaintable

다중 메일 서버를 위한 도메인 기록 파일

/etc/mail/spamassassin/

스팸 메일 등록 설정 파일 위치 디렉토리

/var/spool/mqueue/

메일 송신측의 사용자 메일 임시 저장 디렉토리

/var/mail/<사용자이름>

메일 수신측의 사용자 메일 저장 파일

읽으면 홈폴더의 mbox로 옮김


# vi /etc/mail/sendmail.cf   /* 주설정 파일 */

-> 초기에 만들어진 프로그램이라 설정 파일이 굉장히 복잡하다. 자주 사용하는 몇가지만 알아보자


- 매일 호스트 지정

 

89 Cwlocalhost

90 # file containing names of hosts for which we receive email

91 Fw/etc/mail/local-host-names

 

-> 호스트를 지정할수 있다. Cwmail.linux.example.com 처럼 하나하나 적어도된다.

-> 너무 많아질 경우 Fw /etc/mail/local-host-names 에 추가한다.  보통 Cw는 손대지 않고 local-host-names 파일을 편집한다.


- 메일 호스트 강제 지정

 

 93 # my official domain name

 94 # ... define this only if sendmail cannot automatically determine your domain

 95 #Dj$w.Foo.COM

 

-> sendmail 자신의 호스트명을 알아내지 못하는 실수가 있을 경우 지정된 도메인으로 작동될 수 있게 해주는 지정이다. 기본적으로 주석처리 되어 있으므로 주석을 제거한다. 보통 DNS 이름을 잘 찾지 못하는 경우 Dj를 자신의 도메인으로 지정한다. 


- 릴레이 도메인 설정

 

120 # Hosts for which relaying is permitted ($=R)

121 FR-o /etc/mail/relay-domains

 

-> /etc/mail/access 파일이 있어 보통 설정하지 않는다. 


- 한글 처리 지정

 

170 # strip message body to 7 bits on input?

171 O SevenBitInput=False

172 

173 # 8-bit data handling

174 #O EightBitMode=pass8 

 

-> 8비트 데이터를 설정할 수 있도록 설정하면 한글을 사용할 수 있다. (174번째줄 주석 제거)


- 메일 엘리어스 지정

 

179 # location of alias file

180 O AliasFile=/etc/aliases

 

-> 메일에 관한 엘리어스를 지정할 수 있다. 

-> 엘리어스에 많은 계정을 포함시켜놓으면 한꺼번에 메일을 보낼 수 있다. 


- 메일 용량 제한 지정

 

185 # maximum message size

186 #O MaxMessageSize=0

 

-> 한번에 전달할 수 싱는 메일 크기를 정한다. (단위는 Bytes) 0이면 제한이 없는것이다.


- SMTP 접속 메세지 지정

 

443 # SMTP initial login message (old $e macro)

444 O SmtpGreetingMessage=$j Sendmail $v/$Z; $b

 

-> telnet 으로 메일 서버의 25번 포트로 접속 하였을때 sendmail 정보를 나타나도록 설정하는 옵션이다.

-> 보안상 버전정보를 노출하지 않는 것이 좋다.

# vi /etc/mail/sendmail.cf /* 변경 권장 */

DJmail.exampl.com

...

DZexampe.com

...

O SmtpGreetingMessage=$Z; $b


- 메일 릴레이 기능 설정
/etc/mail/access 파일안에 지정되어 있는 네트워크 주소에 대해서만 메일을 전송할 수 있기 때문에 자신의 네트워크를 우선적으로 이 파일안에 지정해 주어야 한다.

# ls /etc/mail/access* 
/etc/mail/access     /etc/mail/access.db

# vi /etc/mail/access

 

 # Check the /usr/share/doc/sendmail/README.cf file for a description

# of the format of this file. (search for access_db in that file)

# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc

# package.

#

# by default we allow relaying from localhost...

Connect:localhost.localdomain           RELAY

Connect:localhost                       RELAY

Connect:127.0.0.1                       RELAY


/* 릴레이 추가 */
Connect:example.com RELAY
Connect:203.240.50 RELAY        
Connect:From:user01@example.com RELAY 
Connect:To:user02@example.com RELAY

/* 스팸방지 ( 거부 ) */
Connect:spammer@linux104.example.com REJECT
Connect:linux104.example.com REJECT
Connect:TLD REJECT
Connect:192.168.1 REJECT

 


# makemap hash /etc/mail/access < /etc/mail/access  /* access 파일을 access.db 파일로 저장 */

-> 서비스는 access 파일을 읽지 않고 access.db 파일을 읽어 설정한다.  

-> access.db 파일은 바이너리 파일로 cat 명령어로 읽을 수 없기때문에 ls -l  명령어로 시간을 간단히 확인한다.


[참고] /etc/mail/access 파일안에서 쓸수 있는 동작 키워드

키워드

설 명

OK

다른 규칙에 의해 거부되는 메일이더라도 받아들이도록 한다. 이러한 행위가 릴레이를 허용해 주는 것은 아니지만 도메인 이름 조회가 실패하거나 거부 규칙에 적용되는 메일이라고 해도 이 규칙에 적용된다면 이 서버가 수신하게 된다.

-> 무조건 허용

RELAY

메일서버가 수신한 메일을 다른 메일서버로 대신 전달해 주는 기능을 담당한다.

-> 중계 기능 허용

REJECT

이 규칙에 해당되는 메일은 상대편에게 거부 메세지를 출력해 주고 거부한다.

-> 허용 거부, 사용자에게 알림 거부 메세지 0

DISCARD

이 규칙에 해당되는 메일은 특별한 알림 작업 없이 거부된다. 스팸메일 거부에 가장 적당한 옵션이다.

-> 허용 거부, 사용자에게 알림 거부 메세지 X

SKIP

도메인 이름과 IP 주소 규칙에 대해서만 사용할 수 있는 행동으로 메일에 대한 수신 규칙 탐색을 취소해 버린다. 즉 이 규칙에 적용되는 메일은 기본 수신 규칙에서 정의한 바를 따르게 된다.

ERROR:### 반응문자열

RFC 821에서 정의된 에러 번호를 ### 위치에 기록하는 방법으로 메일 발송자에게 필요한 거부 메세지를 보내 줄 수 있다. 예를 들자면 ERROR:550 "We Don't accept mail from spammers" 같은 규칙은 550 에러와 함께 스팸 메일을 수신하지 않는다는 메세지를 나타내 줄수 있다.


  • 메일 실습
# vi /etc/mail/sendmail.cf

 

 ........중략........

[수정전]

  95 #Dj$w.Foo.COM

[수정후]

  95 Djmail.linux2XX.example.com        <----- 주석 제거 후 내용 변경

 ........중략........

[수정전]

 163 DZ8.13.8

[수정후]

 163 DZsmtp-information                 <----- 정보 변경

 ........중략........

[수정전]

 174 #O EightBitMode=pass8

[수정후]

 174 O EightBitMode=pass8               <----- 주석 제거

........중략........

[수정전]

    265 O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA   <---- 'Addr=127.0.0.1' 삭제

[수정후]

    265 O DaemonPortOptions=Port=smtp, Name=MTA

 ........중략........

[수정전]

 444 O SmtpGreetingMessage=$j Sendmail $v/$Z; $b

[수정후]

 444 O SmtpGreetingMessage=$Z; $b       <----- 정보 변경

........중략.......

 


# vi /etc/mail/local-host-names

 

 # local-host-names - include all aliases for your machine here.

linux.example.com        

mail.linux.example.com

 


# vi /etc/mail/access

 

 # Check the /usr/share/doc/sendmail/README.cf file for a description

# of the format of this file. (search for access_db in that file)

# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc

# package.

#

# by default we allow relaying from localhost...

Connect:localhost.localdomain           RELAY

Connect:localhost                       RELAY

Connect:127.0.0.1                       RELAY

Connect:mail.linux.example.com       RELAY  /* 자기 서버 */

Connect:example.com                     RELAY  

Connect:192.168.17                        RELAY

 


# makemap hash /etc/mail/access < /etc/mail/access  


# service sendmail restart
# service devecot restart

-확인

# mailx user01

Subject : test

testset

.

Cc:<Enter>


# mailx -u user01


-메일 포워딩


# vi /etc/aliases   /* 마지막 줄에 추가 */

mail01:    mail02   

-> mail01 에 메일을 보내면 mail02에 전송된다.  (= mail01는 가상 유저로 useradd로 생성 안해도된다. mail02는 있어야함 )


# newaliases  ( # makemap hash /etc/mail/aliases < /etc/mail/aliases )

-> access와 마찬가지로 aliases도 aliases.db 파일을 읽어 파일을 적어야한다.  

-> makemap hash 를 쓸수도 있다. 

# praliases | grep mail    /* access.db 와 달리 aliases.db는 확인 해 볼수 있는 명령어가 존재한다. mail이 기록 되었는지 확인 */


# mailx mail01


# mailx -u mail02 

-> mail01에게 보낸 메일이 온것을 알 수 있다. 


# vi /etc/aliases  /* 마지막 줄에 추가 */

teammain:    team01,team02,user01@linux.example.com

teamsub:      :include:/etc/mail/list/teamsub.list

- teammain 에게 메일을 보내면 team01, team02 , linux.example.com 서버의 user01 에게 메일이 전송된다.

- teamsub 에게 메일을 보내면 /etc/mail/list/teamsub.list 에 기록된 사용자 모두에게 메일이 전송된다.


# newaliases

# praliases | grep team


# mailx teammain /* teammain 에게 메일을 보낸다 ( teammain이라는 유저는 존재하지 않는다 )*/

# mailx -u team01

# mailx -u team02

# mailx -u user01@linux.example.com


# mkdir /etc/mail/list

# vi /etc/mail/list/teamsub.list     /* teamsub로 메일을 보내면 받을 사용자를 추가한다. 한줄에 한 사용자씩 추가한다.*/


[참고] 모든 사용자 추가하기

# cat /etc/passwd | awk -F: '$3 > 499 && $3 < 60000 {print $1}' > /etc/mail/list/teamsub.list 


# newaliases

# mailx teamsub


/* mailx -u USER 명령어로 몇몇 사용자를 확인한다. */


(실무 예) /etc/aliases 파일의 대표적인 사용 예(EX: 메일링 리스트)

공지 메일(회사내의 모든 사용자에게 공지 메일 발송)

(회사내의 특정 팀에게 공지 메일 발송)


  • 메일 클라이언트 프로그램
- evolution (GUI)
- mutt (TUI)

(주의) root 사용자로 테스트하지 않는다. 

- evolution 
# export LANG=ko_KR.UTF-8 
# evolution 

--------------------------------------------------
Evolution Setup Assistant user01 사용자 설정 방법
--------------------------------------------------
■ Welcome 화면
   -> Forward 
■ Restore from backup 화면
   -> Forward
■ Identity 화면
   -> Required Information
      Full Name : user01 
      Email Address : user01@linux2XX.example.com 
   -> Forward
■ Receiving Email 화면
   -> Server Type: POP
   -> Configuration
      Server: mail.linux2XX.example.com
      Username: user01
   -> Forward
■ Receiving Options 화면
   -> Forward
■ Sending Email 화면
   -> Server Type: SMTP
   -> Server : mail.linux2XX.example.com 
   -> Forward
■ Account Managenment 화면
   -> Forward
■ Timezone 화면
   -> Selection : Asia/Seoul
   -> Forward
■ Done 화면
   -> Apply

- mutt
# yum -y install mutt
# mutt -f pop://user01@mail.linux.example.com









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

NFS  (0) 2017.09.14
Web Mail Server  (0) 2017.09.13
FTP  (0) 2017.09.13
WEB Server ( Apache )  (0) 2017.09.11
DNS_2 ( Master DNS / Slave DNS )  (0) 2017.09.11