Study/Network

[Network] Sendmail 메일 서버 구축 + DNS 서버 연결

seomj 2024. 8. 9. 22:00

메일 서버 동작 과정

MUA: 사용자가 사용하는 클라이언트 프로그램(ex. 아웃룩)

MTA: 전자메일을 전송하는 서버(ex. 센드메일)

Mail Queue: 차례대로 전송할 메일이 쌓여있는 공간(ex. /var/spool/mqueue)

MDA: MTA가 수신한 전자메일을 수신자에게 전달해주는 프로그램(ex. procmail)

Mail Box: 사용자의 메일함

MRA: 원격 메일 서버에서 MUA(클라이언트)로 메일을 가져오는 프로그램(ex. dovecot)

 

  1. 사용자 A(MUA)는 SMTP 프로토콜을 이용하여 메일 서버 1(MTA)에 사용자 B(B@메일 서버2)에게 메일을 보내달라고 요청
  2. 메일 서버 1은 사용자 A가 작성한 메일을 Mail Queue에 추가
  3. 센드메일(MTA)은 사용자 A 메일 송신 차례가 되면 MDA에게 메일을 전송 요청
  4. MDA는 SMTP 프로토콜을 이용하여 메일 서버 2로 메일 전송
  5. 메일 서버 2는 SMTP 프로토콜을 이용하여 메일 박스에 전달
  6. 사용자 B는 MUA를 사용하고 있기 때문에 요청에 의해 MRA가 동작
  7. MRA는 메일 서버 2에 저장되어 있는 사용자의 메일을 메일 클라이언트(MUA)로 전달

 

SMTP: Simple Mail Transfer Protocol, 클라이언트가 메일을 보내거나 메일 서버 간의 메일을 주고 받을 때 사용되는 서비스

POP3: 메일 서버에 도착되어 있는 메일을 클라이언트가 가져올 때 사용되는 프로토콜

서버로부터 이메일을 가져오고 가져온 이메일이 확인되면 서버로부터 이메일을 삭제

IMAP: 이메일을 받은 서버로부터 이메일 메시지를 관리하고 이메일을 꺼내서 가져오는 데 사용되는 프로토콜

POP3와 동일하지만 서버에 메시지를 저장하고 여러 가지 디바이스에 이 메일들을 동기화

 

Sendmail

일반적으로 전자 메일을 보내는 데 사용되는 메일 전송 에이전트(MTA, Mail Transfer Agent)

인터넷 전자 메일의 표준 규약

프로토콜을 통해서 메일 서버 간에 메일을 주고받는 역할을 수행

 

SMTP를 사용하여 이메일을 송수신

sendmail.mc에서 m4 매크로 프로세서를 통해 sendmail.cf 파일로 변환

 

내가 이해하기로 TLS 설정도 가능하며, pop3 나 imap 프로토콜을 dovecot이나 courier imap같은 프로그램과 연동하여 사용할 수도 있다고 한다.

* dovecot : Linux/Unix 게열 시스템용 IMAP과 POP3를 사용하는 전자메일 서버

 

구축

로컬에서 로컬로 동작하는 간단한 실습만을 진행한다.

그렇기에 따로 sendmail.mc를 수정하지 않았다.

telnet을 통해 테스트를 진행한다.

 

이후 DNS 서버 연동 후 테스트를 진행한다.

 

Sendmail 설치

yum install -y sendmail*

*로 관련된 모든 패키지를 설치(sendmail-cf, cyrus 등 포함)

 

systemctl start sendmail

 

telnet 설치

yum install -y telnet telnet-server

 

로컬 TEST

telnet localhost 25

 

mail from: 을 입력하고 메일 보내는 계정 입력

rcpt to: 를 입력하고 메일 받을 계정 입력

data를 입력한 후 

subject로 제목 입력하고

내용을 입력한 후 

'.' 입력하면 작성 끝

quit라고 입력하면 연결 종료

 

(사진에선 딜레이가 있었어서 좀 안 맞음...)

 

해당 경로로 이동하여 확인

cat /var/spool/mail/root

 

DNS 서버 연동

mail server에서 DNS 서버(네임 서버)를 거쳐서 mail을 전송할 수 있게끔 설정

 

mail 서버 설정 (1)

호스트 이름 수정, 시스템의 호스트 이름을 설정

$ vi /etc/hostname
You have new mail in /var/spool/mail/root
$ cat /etc/hostname
smj.com

 

IP 주소를 호스트 이름에 매핑

$ vi /etc/hosts
$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
<mail server ip> smj.com

 

Sendmail에서 어떤 호스트 이름을 메일 서버의 로컬로 처리해야 하는지 결정하는 데 사용

$ vi /etc/mail/local-host-names
$ cat /etc/mail/local-host-names
# local-host-names - include all aliases for your machine here.
smj.com

 

DNS 서버 설정

DNS 서버에 Domain 정보를 설정해야 한다.

두 가지 과정이 필요하다.

  1. named 파일에 도메인 정보 추가
  2. zone file 생성

서버는 zone 파일을 읽어 DNS 서버를 동작

zone 파일은 도메인을 IP 주소로 변환해주는 역할

 

도메인 정보를 먼저 추가해보자.

zone "smj.com" IN {
        type master;
        file "smj.com.zone";
        allow-update { none; };
};

zone “smj.com” IN

  • DNS 영역에 대한 구성
  • smj.com: 도메인 이름
  • IN: internet을 의미(DNS Record의 Class)

type master;

  • 기본(master) 서버
  • 기존의 원본 권한 데이터가 들어 있음을 의미

file "smj.com.zone";

  • 영역 데이터가 저장되는 파일 이름
  • 블록의 지시문에서 지정한 디렉토리에 위치해야 함(일반적으로 /var/named)

allow-update { none; };

  • 누가 영역을 동적으로 업데이트할 수 있는지 지정
  • none 값이기에 아무도 업데이트 할 수 없음

 

문제가 없는지 확인

$ namd-checkconf /etc/named.conf

 

 

이제 /var/named에 smj.com.zone 파일을 생성하자.

더보기

zone 파일 구성 설명

 

$TTL 1D

  • DNS 레코드에 대한 기본 TTL(Time To Live)를 1D(24시간)으로 설정

@

  • origin 도메인을 의미
  • /etc/named.conf 파일에 설정되어 있는 도메인 명을 의미(smj.com)
  • 따라서 @기호 대신 owner.co.kr.이라는 도메인을 지정해도 되지만 이때에는 owner.co.kr.이라는 도메인의 끝부분에 반드시 .(마침표)를 표시해주어야 한다. 여기서 .(마침표)는 루트도메인을 뜻하는 것이다.

SOA

  • 권한 시작 레코드(start of authority), 기본 DNS 서버에 대한 정보를 제공
  • ex. SOA smjmail.com. root.smjmail.com.
  • ”smjmail.com”은 네임서버를 의미, “root.smjmail.com”은 root@aptmail.com으로 관리자 이메일 주소를 의미

serial

  • secondary 네임 서버가 primary 네임 서버의 정보를 어떻게, 얼마나 자주 갱신할 것인지를 설정
  • 대부분 “YYYYMMDD” 형식을 사용
  • 도메인 설정은 1차 네임 서버에서 하고, 2차 네임 서버에서 1차 네임 서버의 설정 값을 주기적으로 가져가게 된다. 이때 1차 네임 서버에서 zone 파일 변경 및 추가 시에 serial 값을 1이상 증가시킨다. 그렇게 되면 2차 네임 서버의 serial 값보다 1차 네임 서버의 serical 값이 커지기 때문에 2차 네임 서버에서 해당 도메인 변경을 인식하고 기존의 zone 파일을 새로운 zone 파일로 업그레이드한다.

refresh

  • 2차 네임 서버에서 1차 네임 서버의 변경된 값들이 있는지 체크하는 주기
  • 1D - 하루에 1번 1차 네임 서버에 문의하여 체크

retry

  • 2차 네임 서버에서 1차 네임 서버로의 접근이 안될 경우에 접근 시도 주기
  • 1H - 1시간마다 1번 연결을 시도

expire

  • expire 시간 동안 연결되지 않을 경우 더 이상 연결 시도를 하지 않는다
    • 2차 네임 서버는 해당 도메인의 정보가 삭제되었거나 폐기 되었다고 판단
  • 1W - 1주동안 연결이 되지 않으면

minimum

  • TTL값
  • 해당 도메인 정보를 다른 네임 서버에서 가져갔을 때에 가져간 도메인 정보를 얼마나 보관하고 있을 것인가에 대한 시간 값
  • 3H - 3시간동안 보관 3시간이 지나면 원래 정보를 버리고 다시 이 네임 서버에게 연결하여 해당 도메인의 정보를 가져가고 3H 만큼 캐시에 보관

NS 레코드

  • 해당 도메인의 네임 서버를 지정하는 레코드

A 레코드

  • 해당 도메인의 실제 IP 주소를 설정하는 레코드

MX

  • Mail eXchanger, 해당 도메인의 메일서버로 사용하게 될 메일 서버 지정
  • MX뒤에있는 숫자는 우선순위를 표시하는 것으로 상대적인 값으로만 인식

 

zone 파일

$TTL 1D
@       IN SOA  @ root.smj.com (
                                        20240807       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN      NS      @
        IN      A       <mail server ip>
        IN      MX      10 mail.smj.com.
mail    IN      A       <mail server ip>

 

설정에 문제가 없는지 확인

$ named-checkzone smj.com /var/named/smj.com.zone
zone smj.com/IN: loaded serial 20240807
OK

 

재시작

$ systemctl restart named
$ systemctl status named

 

mail 서버 설정 (2)

서버는 등록된 DNS를 찾기 못하기 때문에 /etc/resolv.conf에 추가하자.

 

/etc/resolv.conf

DNS 쿼리가 처리되는 방식을 정의

여기에는 쿼리할 DNS 서버와 검색 도메인, 시간 초과 설정 등의 기타 매개변수가 지정

현재 지정한 DNS 서버가 10.0.17.103이기 때문에 해당 IP를 nameserver로 지정

$ vi /etc/resolv.conf
$ cat /etc/resolv.conf
nameserver <DNS server ip>

$ nslookup
> smj.com
Server:         <DNS server ip>
Address:        <DNS server ip>

Name:   smj.com
Address: <mail server ip>
> mail.smj.com
Server:         <DNS server ip>
Address:        <DNS server ip>

Name:   mail.smj.com
Address: <mail server ip>

 

vi /etc/mail/access에 도메인 추가

$ 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.
#
# If you want to use AuthInfo with "M:PLAIN LOGIN", make sure to have the
# cyrus-sasl-plain package installed.
#
# By default we allow relaying from localhost...
Connect:localhost.localdomain           RELAY
Connect:localhost                       RELAY
Connect:127.0.0.1                       RELAY

smj.com RELAY
$ makemap hash /etc/mail/access < /etc/mail/access
$ systemctl restart sendmail

 

DNS TEST

방화벽 정지

$ systemctl stop firewalld

 

sendmail.mc를 수정해야 한다

DNS를 통한 접근이기 때문에 127.0.0.1 에서 0.0.0.0 으로 수정하자

$ vi /etc/mail/sendmail.mc
...
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
...
$ m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
$ systemctl restart sendmail

 

25 포트를 확인해보면 0.0.0.0으로 변경된 것을 확인 (기존에 127.0.0.1 이였다)

$ netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1704/sendmail: acce

 

이제 테스트해보자.

telnet localhost 25

제대로 잘 동작한다.

 

 

 

참고

https://goldsony.tistory.com/184

https://goldsony.tistory.com/185

https://growupcoding.tistory.com/47

https://velog.io/@xodbs1123/리눅스-메일-서버-설치와-운영-데이터베이스-서버-구축과-운영-6일차#ftp

https://velog.io/@tlsalsckd13/리눅스-메일서버-구축

https://pinetreeday.tistory.com/184

https://www.linux.co.kr/bbs/board.php?bo_table=lecture&wr_id=5745