본문 바로가기
IT Security/LINUX Basic

36. Linux - 메일서버 구축 및 메일 전송2 - Postfix 설정 및 메일 전송

by Rosmary 2021. 5. 2.
728x90
반응형

 

 

 

 

지난 포스팅에 이어, 이번 포스팅에서는 메일 서버의 구축과 메일 전송을 진행해보려한다. 메일 서버와 관련된 이론적인 내용은 이곳을 참고하자.

 

 

 

1. 메일 서버 SMTP 서비스 실행 및 외부와의 통신 확인

 

메일 서버의 구축에 가장 필요한 프로토콜은 SMTP(Simple Mail Transfer Protocol)다. SMTP는 TCP 25번을 사용하는 프로토콜로 사용자가 작성한 메일을 전달받아, 목적지 도메인의 메일 서버로 전송하거나, 타 메일서버로부터 들어온 메일을 내 메일 서버 내 사용자에게 전달하는 역할을 한다. 

 

SMTP를 지원하는 Linux의 서비스는 Sendmail과 Postfix가 있다. Sendmail은 Postfix 이전에 만들어진 서비스인데, 별도로 패키지 설치를 해야하는 것과 더불어, 사용을 위한 설정이 꽤나 복잡한 서비스라, 현재는 CentOS 계열 Linux 설치 시 기본으로 설치되는 Postfix를 많이 사용하는 추세다. 

 

Linux에서 메일 서비스를 실행하기 위해, SMTP 서비스가 실행되어야 한다. systemctl status posftix 명령어를 입력하여, 현재 postfix 서비스가 실행 중인지 먼저 확인하자.

 

 

 

 

 

 

위와 같이 Active (running) 상태가 아니라면, 실행되지 않고 있는 것이니 systemctl start postfix 명령어로 서비스를 시작하자.

 

 

메일 서버를 동작시킬 Linux에서 실제 사용하고 있는 메일로 테스트하기 위해서는 인터넷과의 연결 여부도 확인해야 한다. ping으로 공용 DNS 서버와의 통신이 잘 이루어지고 있는지 먼저 확인하자.

 

 

 

 

 

 

* 참고로 na*er는 등록되지 않은 타 메일 서버로부터 메일 수신을 차단해놓았기 때문에 테스트를 할 수 없다

 

 

 

2. SMTP(Postfix) 설정

 

다른 모든 서비스들이 그러하듯이, Postfix의 설정파일도 /etc 폴더 내에 존재한다. /etc 폴더 및에 postfix 폴더가 별도로 존재하는데, 이 폴더 내에 있는 main.cf라는 파일이 바로 postfix 서비스와 관련된 설정파일이다.

 

 

 

 

 

 

이 파일은 대략 700 줄 정도의 내용으로 구성되어 있는데, 대부분은 주석처리되어 설정에 대한 설명을 달아놓은 부분인데다, 특정 설정을 제외하면 기본값으로 사용하는 설정이 많기 때문에 DNS 설정 파일과 달리, 건드릴 내용이 많지 않다. 따라서, 메일 서버를 진행함에 있어 필수적으로 알아봐야 하는 설정 부분에 대해서만 중점적으로 다루어보려 한다.  /etc/postfix/main.cf 파일을 vi 편집기로 열어 하나씩 살펴보자.

 

 

 

 

 

 

 

(1) LOCAL PATHNAME INFORMATION

 

 

 

 

 

 

파일의 24번째 줄에 LOCAL PATHNAME INFORMATION이라고 적힌 행이 나타난다. 여기서부터 48번째 줄까지 postfix 서비스에 필요한 명령어, 메일 queue 등의 경로를 지정하는 설정부분이라고 보면 된다.

 

- Line #31. queue_directory: 

 

 

 

 

 

 

SMTP는 사용자가 메일을 작성하여 전송 버튼을 누르면, 해당 메일을 다른 메일 서버로 전송하기 전까지 /var/spool/mqueue 디렉토리에 일시 보관한다. 그러나 모종의 이유로 인해 메일 전송이 되지 않을 경우, 전송하지 못한 메일을 별도 파일로 저장하게 되는데, 이 경로를 설정하는 것이라 보면 된다. 기본 경로는 /var/spool/postfix로 되어 있다.

 

 

 

 

 

 

예를 들어, 필자가 postfix 서비스를 중단한 다음, 메일 전송을 하게 되면 작성한 메일이 queue에 임시 저장되는데, 이 메일을 전달할 postfix 서비스가 동작하지 않으니, 이 메일을 전송할 수 없게 된다. 따라서 이 메일을 별도 파일에 작성하여 /var/spool/postfix/maildrop 폴더 내에 저장하게 된다.

 

 

 

 

 

 

queue의 경로 설정은 보통 기본값을 사용한다.

 

 

-  Line #36. command_directory:

 

 

 

 

 

 

command_directory는 postfix와 관련된 명령어가 어느 경로에 저장되어 있는지 설정하는 것이라 보면 된다. 이 부분 역시 기본값에서 변경없이 그대로 사용한다. 참고로, 위의 사진에서 예시를 들었던 메일 전송 명령어인 sendmail처럼, postfix의 주요 명령어가 이 이 경로에 저장되어 있어야 한다.

 

 

 

 

 

 

 

-  Line #42. daemon_directory:

postfix 서비스의 실행 프로그램이 저장된 디렉토리를 지정한다. command_directory와 마찬가지로 기본값으로 그대로 사용한다.

 

 

 

 

 

 

(2)  INTERNET HOST AND DOMAIN NAMES

 

 

 

 

 

 

파일의 68번째 줄에 INTERNET HOST AND DOMAIN NAMES이라고 적힌 행이 나타난다. 여기서부터 116번째 줄까지 메일 전송 시 사용할 주소를 지정하거나, 메일을 수신할 수 있는 외부 서버 설정 등을 지정해주는 행이라고 보면 된다.

 

 

- Line #75. myhostname

 

 

 

 

 

 

myhostname은 메일 서버에서 메일을 전송할 때, 상대방에게 발송인의 메일 도메인(@뒤의 주소)을 설정할 때 사용한다. 만약 상대방에게 필자의 메일 주소가 root@testmail.linux라고 보이도록 설정하고 싶다면, myhostname 값을 testmail.linux라고 작성하면 된다. 먄약, 이 값이 설정되지 않은 경우, 기본 hostname.domain인 localhost.localhost가 주소로 찍혀 상대 메일함으로 날아가게 된다. DNS에 메일 서버 IP 주소가 별도의 주소(mx.domain.com)로 지정된 경우, 해당 주소가 송신자(id@mx.domain.com) 메일에 찍혀 날아간다.

 

 

 

 

 

 

 

 

 

 

 

 

 

실제 필자의 gmail에서 확인한 전송 메일. 주소가 testmail.linux로 찍혀서 날아온 것이 확인된다.

 

 

참고로, myhostname 값을 작성할 때, 반드시 hostname.domainname과 같이 풀 네임으로 작성해야 한다.  Postfix에서 이 설정값을 읽을 때, 특정 함수를 이용해 우리가 작성한 값에서 온점(.)으로 구분된 값 중 가장 앞의 값만 hostname으로 인식하기 때문이다. 

 

 

 

-  Line # 84. mydomain

 

 

 

 

 

 

mydomain은 myhostname과 마찬가지로, 메일 전송 시 상대방에게 보이는 주소를 설정할 때 사용한다. 보통 myhostname에서 실제 hostname을 제외한 나머지 값을 mydomain 변수에 저장하기 때문에 myhostname값을 제대로 입력했다면 설정 변경없이 사용하는 것이 일반적이다. 

 

 

 

(3) SENDING MAIL

-  Line #98. myorigin

 

 

 

 

 

 

myorigin은 myhostname 및 mydomain 설정의 연장선으로 보면 되는데, 실제 메일에 찍혀 날아가는 주소는 이 myorigin 값을 참조한다. 별도의 설정 변경이 없는 이상, myorigin 값은 myhostname과 동일하기 때문에 myhostname값의 수정만으로도 상대 메일에는 변경된 메일 주소가 나타나게 된다. 이 값 역시, myhostname을 제대로 수정했다면 별도의 변경없이 기본값으로 사용한다.

 

 

 

(4) RECEIVING MAIL

- Line #116. inet_interfaes

 

 

 

 

 

 

inet_interface는 메일을 수신받을 LAN interface 를 지정하는 설정값이며, 다른 서비스의 설정 중 listen과 기능이 유사하다. 이 값은 특정 문자열, 메일 서버의 특정 Interface IP 주소를 명시하여 사용하는 것도 가능하다. 아래는 사용 예시다.

 

inet_interface = all   -> 모든 interface로부터 메일 수신.

inet_interface = localhost 또는 inet_interface = 127.0.0.1    -> 메일 서버 내에서 전송된 메일만 수신한다.postfix 2.2버전부터 inet_interface=loopback-only도 지원한다.

inet_interface = $myhostname 또는 별도 domain 주소      -> /etc/hosts에 메일 서버 interface IP주소와 매칭되는 도메인 주소가 존재할 경우, 해당 interface로 유입되는 메일만 수신한다.

inet_interface = interface_IP주소1, interface_IP주소2      -> 해당 Interface의 IP주소를 통해 송신되는 메일만 수신한다.

 

 

보통 크기가 크지 않은 기업체에서 내부 임직원만 사용할 목적으로 메일서버 1대만 구축된 상황이라면 localhost로 설정해서 사용할 수 있다. 이 경우, 공인 DNS에 메일 서버가 등록되어 있더라도 gma**이나 hanmail.net 등의 외부 메일은 전혀 수신할 수 없게 된다.

 

 

(5) Enable IPv4, and IPv6 if supported

- LINE #119. inet_protocols

메일 서버에서 사용할 IP 주소 버전을 표시한다. ipv4, ipv6 및 all 중 값을 입력하여 사용할 수 있다. 기본값은 all이며, 아래와 같이 ipv4, ipv6라고 입력해도 all과 동일한 효과를 나타낸다. 

 

 

 

 

 

 

 

여기까지가 외부 메일 서버로의 송신을 위한 기본적인 필수 설정 내용이다. 여기까지 모든 설정이 완료되었다면 vi 편집기의 내용을 저장한 뒤 종료하고 systemstl restart postix 명령어를 입력하여 postfix 서비스를 재실행시킴으로써 변경된 설정내용을 적용해주자.

 

 

(3) 외부로 메일 발송 테스트

 

 

참고!! 외부로부터 우리가 구축한 메일서버로 메일을 송신하기 위해서는 DNS에 도메인 등록을 해야 하는 등 귀찮은 설정이 더 필요하다. 물론, 가상머신으로 DNS 서버를 계층 구조로 구축하고 직접 만든 메일 서버 사이의 송/수신을 테스트하는 것도 이것 못지 않게 귀찮은 일이지만, 적어도 비용이 추가되지는 않기 때문에 추후 시간이 나는대로 가상으로 망을 구축하여 테스트하고 관련 내용을 포스팅하려 한다.

 

 

이제 postfix 서비스가 동작중인 메일서버에서 필자의 gma** 계정과 hanmail.net 계정으로 메일을 전달해보려 한다. 메일이 잘 전달되는지 확인하기 위해 필자는 PuTTy 창을 하나 더 띄워 통신 과정도 살펴보려 한다.

 

메일 작성 및 전달 명령어는 sendmail이다. sendmail 명령어 뒤에 메일 수신인의 주소를 작성하고 enter를 누르면 명령어가 종료되지 않고 계속 무언가를 작성할 수 있게 되는데, 이 부분에 우리가 보낼 메일 내용을 작성하면 된다.

작성이 끝나면 Ctrl + D 를 누르면 메일 작성을 종료하고 바로 메일을 전송하게 된다.

 

 

 

좌측은 메일 전송 명령어 작성 내용. 우측은 메일 전송 시작 시점부터 수신 메일 서버와 주고받은 통신 내용을 캡쳐한 화면.

 

 

 

패킷 상에서 구*의 메일서버인 74.125.204.26의 25번 포트(SMTP)와 통신이 왔다갔다하는 것을 확인할 수 있다. 구*의 메일서버에서 다행히 필자가 보낸 메일을 어떠한 거부 없이 잘 수신했기 때문에 정상적으로 통신이 완료되었음을 확인할 수 있다. 

 

실제 구* 메일함에는 이러한 종류의 메일이 스팸메일로 처리되어 들어오기 때문에, 스팸메일함을 열어보면 우리가 보낸 메일을 확인할 수 있다.

 

 

 

 

 

 

hanmail도 마찬가지로 위와 같이 잘 들어오는 것을 확인할 수 있다. 구* 메일과 동일하게 스팸메일함으로 들어오는데, 구*보다는 들어오는 속도가 많이 늦다.

 

 

 

 

 

**  참고!! 메일 보낸 날짜를 보면 알겠지만, 이 테스트는 1월 말에 진행된 것이다. 2021년 5월 현재, hanmail(다음) 역시 네이버와 마찬가지로 일반 Linux에서 보내는 메일을 차단하고 있다.

 

 

 

이제 마지막으로 na*ver로 메일을 전송해보자. na*er는 내부 정책에 의해 개인이 만든 메일 서버에서 작성된 메일을 수신하지 않고 막아버리게 되어 있다. 따라서 위와 같은 방식으로 동일하게 메일을 보내면 통신 패킷에 메일 전달이 막혔다는 문구도 확인할 수 있다.

 

 

 

 

 

 

 

 

125.209.222.14는 na*er의 메일서버 IP다. 이전의 테스트와 달리, 메일 전송이 서버에 의해 block되었다는 문구가 나온다.

 

 

 

첫 메일 전송 시도가 막히고 다시 한 번 시도했으나 또 막혔다(철벽이네...). mailq 명령어를 사용하면 전송된 메일이 상대 서버에 의해 막혀 버려졌음을 아주 명확하게 확인할 수 있다.

 

 

 

mailq 명령어로 메일 전송 결과를 확인한 결과, "너랑 이야기하기 싫대.."

 

 

 

주의해야 할 점이 메일 전송에 실패했다고해서 반드시 큐에 저장이 되는 것이 아니다. 지금과 같은 상황은, mail이 상대 서버로 전달은 되었으나, 서버에 의해 막혀 버려졌기 때문에, 그에 대한 내용을 mailq 명령어로 확인할 수 있는 것이다. 실제로 서버 거부가 아닌 단순 인터넷 연결 불량이라던가, 수신지의 메일 서비스 문제라면 당연히 이 메일은 큐에 쌓일 것이다.

 

 

 

 

4. 메일 전송 관련 기타.

 

(1) mailx 명령어

 

지금까지는 sendmail 명령어로, 보내고자하는 메일을 작성하여 전달해보았다. 하지만 sendmail 명령어는 한 가지 단점이 있는데, 우리가 일반적으로 사용하는 메일처럼 메일 제목 작성이 불가능하다는 것이다. 따라서, sendmail 명령어로 보내는 모든 메일은 위의 예시에서 보았던 것처럼 모두 (no subject)라는 제목으로만 전송되는 것을 확인할 수 있다.

 

man 페이지에서 sendmail 명령어에 대한 내용을 훑어봐도 제목을 달아서 보낼 수 있는 내용은 나타나지 않는다.

 

 

 

이러한 불편함 때문에, 메일 제목을 지정하거나, 첨부파일을 추가할 수 있는 mail이라는 명령어를 Linux 환경에서는 훨씬 많이 사용하게 된다. 하지만, 최소 사양으로 설치한 리눅스에서 해당 명령어는 찾을 수 없는데, 이 명령어는 mailx라고 불리는 패키지가 설치되어 있어야 하기 때문이다.

 

 

 

 

yum 명령어 또는 rpm 파일을 받아 패키지 설치를 진행해주자. 패키지 설치 관련 내용은 여기를 참고하면 된다.

 

 

 

 

패키지 설치 후, mail --help 명령어를 사용하면, mail 명령어의 간략한 사용법이 창에 표시된다. 하지만 다른 명령어와 달리, 친절하게 옵션에 대한 설명이 나타나지 않는다. 

 

 

 

 

man으로 mail 명령어의 매뉴얼을 확인해보면 조금 더 자세한 내용을 확인할 수 있다. 

 

 

 

 

특이하게도 man 페이지로 들어가면 mail 명령어가 아닌 mailx에 대한 내용이 나오는데, 두 명령어는 동일한 명령어라 어떤 것을 사용하더라도 상관없다.

 

 

필자가 위에서 언급했던 제목(-s)은 물론, 참조인 주소(-c), 숨긴 참조인 주소(-b), 첨부파일(-a) 등등 여러 사용 옵션이 보이는 것을 확인할 수 있다. mail 명령어와 수신인 주소 사이에 옵션이 들어가는 구조다. 필자는 아래와 같이 메일을 작성하여 실제 메일함에 잘 들어오는지 테스트 해보려 한다.

 

*  제목:  Test

*  수신인: 필자의 gm**l 계정

*  참조인: 필자의 hanmail 계정

*  첨부파일 : test.txt. 내용은 "This is an attachment"

 

 

 

 

구글 메일에서는 Linux에서 보낸 메일을 잘 수신했다. 스팸함에 들어가 있긴 하지만 말이다. 메일을 열어보면 필자가 미리 지정한 CC 주소 및 첨부파일도 정상적으로 잘 전달되었음을 확인할 수 있다.

 

 

 

 

test.txt 파일 내용 역시, 필자가 파일에 작성한 내용 그대로 잘 전달되었음을 확인할 수 있다.

 

 

 

 

불행히도... 필자가 이 포스팅을 초반 작성할 무렵에만 해도 daum 메일도 무리없이 Linux 메일을 잘 받았지만... 현재는안된다. 따라서 CC에 주소가 포함되어 전달되었다는 것으로만 테스트가 정상적으로 진행되었다고 판단해야 한다.

 

 

 

(2) mail 명령어로 메일함 관리하기

 

Linux 터미널 화면에서 메일을 확인하기 위해서는, 항상 /var/spool/mail/{계정} 파일을 cat으로 열어 확인해야 하는 불편함이 있었다. 특히 모든 메일이 하나의 파일에 이어져 쭈욱 출력되기 때문에, 어디가 메일의 시작이고 끝인지 구분하기가 상당히 여렵다. 하지만 mail 명령어는 각 계정이 가지고 있는 메일 내용을 조금이나마 손쉽게 관리할 수 있는 기능을 제공한다.

 

 

 

 

좌측 사진은 /var/spool/mail의 내용을 직접 출력한 화면. 우측은 mail 명령어를 이용한 화면이다.  두 화면 모두 동일한 내용의 메일 2개가 도착해 있음을 알 수 있으나, /var/spool/mail 화면을 직접 출력한 전자와 달리, 후자의 mail 명령어를 이용한 메일 확인이 조금 더 깔끔하게 나타나는 것을 볼 수 있다.

 

mail 명령어를 입력하면, 쉘 프롬프트 모양이 &로 바뀌면서 현재 내 메일함에 들어온 모든 메일의 목록을 확인할 수 있다.

 

 

 

 

mail 명령어 내에서 사용할 수 있는 명령어는 help 또는 물음표(?)를 입력하면 확인할 수 있다.

 

 

 

 

 

각각의 메일 앞에는 메일이 들어온 순서대로 번호가 매겨져 있는데, 특정 메일을 확인하고자 한다면 type {메일 번호}를 입력하면 된다. 예를 들어, 2번째 메일을 확인한다고 해보자. 그럼, type 2를 입력하면 된다.

 

 

메일의 내용은... 음... 신경쓰지 말자. 쓸 말이 없어서 그렇다.

 

 

아무 명령어 없이 enter를 입력하면, 메일함의 가장 첫 번째 메일부터 순차적으로 화면에 출력해준다.

마지막 메일 확인 후, Enter를 누르면 AT EOF라는 문구와 함께 더 이상의 메일이 출력되지 않는다.

 

* EOF = End of File

 

 

 

 

 

 

mail 명령어의 프롬프트 내에서 mail을 입력하면 메일 전송도 가능하다. 하지만 이전의 방식처럼 옵션을 통해 참조인이나 첨부파일을 지정하는 것은 불가능하다.

 

 

to가 아니라 too 다.....

 

 

메일함 내의 메일을 지우려면 delete {지울 메일 번호} 를 입력하면 된다. 아예 메일함을 완전히 비우고자 한다면 메일번호 대신 별표(*)를 입력하면 된다.

 

 

 

mail 명령어에서 원래의 프롬프트로 나가려면, q를 입력하면 된다.

 

 

 

 

 

 


 

 

이번 포스팅에서는 Linux 내에 메일 서버를 설치하고, Linux에서 메일 작성 후 실제 사용하고 있는 상용 메일함으로 전달하는 과정, 그리고 기타 명령어에 대해 알아보았다. 본 포스팅을 처음 작성한 날이 1월 중순이었는데, 너무 바쁜 날을 보내고 있어서 포스팅의 마무리가 늦었다(그 사이에 hanmail은 스팸 메일함으로 못들어가게까지 막혀버리고...).

 

원래 필자가 메일 서버 관련 포스팅을 진행하면서, 간략한 내부망이라도 구성해서 a.com에서 b.com으로 메일 전송하는 테스트도 진행하려 했는데... 또 언제 포스팅을 진행할지 모르겠다. 망 구성 시 DNS도 추가로 넣어줘야해서 적지 않은 시간이 투입되어야 할 듯 한데, 이 내용은 시간이 허락하는대로 조금씩 포스팅을 작성해보려 한다. 중간 중간 메일 서버와 관련없는 다른 내용의 포스팅이 올라올 수도 있을텐데, 망 구성으로 메일 전달하는 포스팅은 완성 시기가 늦더라도 오늘 날짜 전후로 포스팅 일자를 수정해서 업로드하려 한다.

 

 

 

Fin.  

반응형

댓글