Rocky Linux - 메일서버 구축 트러블슈팅(troubleshooting)

    트러블슈팅이란
    trouble [문제, 골칫거리] + shooting[발사, 사냥]으로 골칫거리를 사냥하다의 합성어처럼 보이는데 영어사전에는 troubleshooting은 하나의 단어로 문제 해결(고장 수리), 분쟁 조정 등의 의미로 사용되고 있습니다. IT에서는 그런 의미로 문제 원인을 해결하기 위해 논리적이고 체계적으로 찾을 수 있게 순차적인 단계를 밟습니다. 프로그램 개발단계 또는 운영중 발생하는 원인을 찾기 위해 디버깅(Debugging) 또는 디버그(Debug) 로그를 확인하는 것도 이에 포함됩니다.

    필자의 경우는 그런 능력까지는 되지 않으므로 잘 알지 못하는 상태에서 옵션 하나하나 수정해서 소거법의 형태로 오류를 찾는 방법을 많이 사용합니다. 시간이 많이 소요되더라도 당장 해결할 기술자가 없다면 이렇게라도 할 수 있다는 뜻입니다.

    ※ 진행하기전 참고사항

    메일서버 구축 참고 : https://foxydog.tistory.com/104

    Postfix와 RoundCube 연동 세팅을 하다 보면 가장 많이 발생하는 문제가 SMTP 인증 연동입니다. 이 설정은 주로 /postfix/master.cf /postfix/main.cf 2개의 설정 파일에 의해 좌우되는데 옵션 하나라도 잘못되면 디버그(Debug) 메시지를 확인해도 쉽게 원인을 찾기 어렵습니다. 그래서 제가 작업하면서 자주 실수하게 되는 또는 놓치게 되는 문제를 남기고자 합니다.

     

    일단 가장 먼저 기억할 부분은 SMTP는 25번 포트를 이용해 수발신을 하게 되는 중요한 포트이지만 최근 스패머들에게 많은 타깃이 되면서 보안적으로 취약으로 인식하여 일부 ISP(인터넷 제공 업체)에서는 무식하게 그냥 막아버리는 경우가 있습니다. 내부에서(Localhost) 외부로 발송하는 것에 대해서는 문제가 없지만 외부에서 서버에 접근하기 위한 SMTP  AUTH(인증)을 할 수 없는 경우가 많아졌습니다. 특히 해외 쪽의 경우는 더욱 심합니다. 그래서 메일 서버를 구축할 때 처음부터 SMTP[25]대체 포트인 Submission[587]로 세팅을 진행합니다.

    공식 Postfix 기본 설정 매뉴얼 : https://www.postfix.org/BASIC_CONFIGURATION_README.html

    공식 Postfix 옵션 매뉴얼 : https://www.postfix.org/postconf.5.html

    궁금한 옵션은 한글로 번역하여 한번씩 읽어보는 것도 도움이 됩니다.


    ① SMTP[25] 기본 포트를 사용해야 할 경우

    그러면 대부분이 RoundCube 메인 config.inc.php 설정에서 smtp_port 옵션을 25로 바꾸실 겁니다.

    [root@localhost ]# vim /var/www/html/roundcube/config/config.inc.php

    하지만 변경하고 발송 시도를 하면 다음과 같은 에러 메시지가 발생합니다.

    오류 메시지

    SMTP 오류 (250): 인증을 실패했습니다.

    SMTP Error (250): Authentication failed.

     

    서버 로그는 어떻게 찍힐까?

    [root@localhost ]# tail -f /var/log/maillog

    postfix/smtpd[20863]: connect from localhost[::1]

    postfix/smtpd[20863]: discarding EHLO keywords: CHUNKING

    postfix/smtpd[20863]: disconnect from localhost[::1] ehlo=1 quit=1 commands=2

    이렇게 Localhost로 연결 시도를 하였지만 알 수 없는 이유로 바로 연결을 끊어버립니다.

    네트워크 설정 문제일까요?

    ※ telnet 명령어가 없다면 #dnf install telnet 설치

    [root@localhost ]# telnet localhost 25    [Localhost 연결 테스트]

    Trying ::1...

    Connected to localhost.

    Escape character is '^]'.

    220 mail.foxydog.co.kr ESMTP Postfix    [220 메시지 서비스 정상 응답]

    [root@localhost ]# netstat -nlp  |grep 25    [포트 확인 명령어]

    tcp        0      0 0.0.0.0:25      0.0.0.0:*          LISTEN      18632/master      [25번 포트 정상 응답]

    tcp6      0      0 :::25                   :::*               LISTEN      18632/master      [25번 포트 정상 응답]

    와 같이 25 포트는 정상적으로 열려 있습니다.

    그렇다면 우리는 이 인증이라는 단어를 생각해야 합니다.

    RoundCube에서 발송을 눌렀을 때 SMTP 계정 인증을 한다는 뜻인데, 이전 세팅을 한번 되짚어 보면 포트를 587로 설정했으며 해당 포트만 로그인 인증을 허용한다는 뜻입니다. Postfix의 설정을 변경하지 않고 RoundCube 설정만 변경한다면 이 두 개만 수정을 하시면 됩니다.

     

    ◇ 해결방법

    [root@localhost ]# vim /var/www/html/roundcube/config/config.inc.php

    //$config['smtp_user'] = '%u';    [//주석 처리]
    //$config['smtp_pass'] = '%p';   [//주석 처리]
    $config['smtp_user'] = '';    [별도로 추가 후, 따옴표 사이에 공백이 있으면 안 됩니다. NULL로 처리]
    $config['smtp_pass'] = '';   [별도로 추가 후, 따옴표 사이에 공백이 있으면 안 됩니다. NULL로 처리]

    이렇게 하면 SMTP USER/PASS 인증을 하지 않고 25 포트 Localhost로 바로 던지기 때문에 메일 발송이 가능해집니다.


    ② SMTP[25] 포트로 정상 발송이 되었지만 SMTP[USER/PASS] 통해 인증하여 발송을 하고 싶다.

     

    이제 여기서 /postfix/master.cf 설정 수정이 필요하게 되는데 앞서가기 전 다음 화면을 비교하여 다른 점을 찾아보세요.

     

    Telnet을 이용해 Postfix응답 상태를 확인할 수가 있는데요. 응답이 있다면 EHLO 명령을 합니다.

    ※ EHLO = "Extened HELO" 의미 (그리고 HELO=Hello 헬로라는 인사말이다), 즉 SMTP 25/587 세션으로 메일서버에 접근하면 EHLO 뒤에 자신의 도메인 이름을 붙이고 커맨드 명령어를 보내면 기본적인 상태 값 정보를 확인할 수 있다.

    [root@localhost ]# telnet localhost 25    [연결 테스트]
    220 mail.foxydog.co.kr ESMTP Postfix
    ehlo localhost     [커맨드 명령어 입력]
    [root@localhost ]# telnet localhost 587    [연결 테스트]
    220 mail.foxydog.co.kr ESMTP Postfix
    ehlo localhost    [커맨드 명령어 입력]

     

    정답 : 587 포트에는 있지만 25 포트에는 250-AUTH 인증이 보이지 않는다.

    이거만 확인해봐도 ①에서 왜 SMTP USER/PASS 인증을 못하였는지 알 수가 있게 됩니다.

    실제로 외부 인증을 할 수 없는 상태였던 겁니다. (Postfix 입장에서는 RoundCube가 SMTP를 통해 인증 시도를 하는 경우 임)

     

    ◇ 해결방법

    [root@localhost ]# vim /etc/postfix/master.cf

    smtp      inet  n       -       n       -       -       smtpd    [하단에 바로]
      -o smtpd_sasl_auth_enable=yes    [동일하게 해당 옵션을 추가]

    [root@localhost ]# systemctl restart postfix    [Postfix 서비스 재시작]

    다시 RoundCube 설정을 변경 후 발송 테스트를 합니다.

    [root@localhost ]# vim /var/www/html/roundcube/config/config.inc.php

     

    ※ 주의 사항으로 master.cf 설정 파일에서 SMTP/Submission/SMTPS 포트별로 옵션을 설정해야 한다.

    예시로 보안 옵션인 smtpd_sasl_security_options을 사용한다면 SMTP/Submission 양쪽에 각각 추가해야 한다는 뜻입니다.


    ③ PC 메일 클라이언트에서도 SMTP[25]/Submission[587] 세팅 시에 AUTH [인증]이 허용이 되어 있지 않다면 다음과 같은 에러 메시지를 확인할 수 있다.

    이 클라이언트가 지원하는 인증 방법을 서버에서 지원하지 않습니다

    마이크로소프트 메일 아웃룩 프로그램에서 POP3/SMTP [Submission] 연결 시도 시 [25/587] 포트 인증이 허용되어 있지 않아 거부하는 모습

    ◇ 해결 방법

    smtpd_sasl_auth_enable옵션은 사용하지 않으면 기본 설정으로 [default: no] 되어 있으므로 SMTP[25]과 submission[587]하단에 smtpd_sasl_auth_enable=yes 추가 후 Postfix 서비스를 재시작한다. 보안을 신경 쓴다면 587포트만 AUTH[인증]을 할 수 있게 하는 것을 권고합니다.


    ④ 발송은 되지만 수신이 되지 않습니다.

     

    패턴1-1 virtual_transport 옵션 설정에 의한 문제

    [root@localhost ]# tail -f /var/log/maillog    [수신 로그 실패 확인]

    May 31 15:25:35 mail postfix/lmtp[21894]: 5EBC8800E8: to=<foxydog@foxydog.co.kr>, relay=none, delay=0.09, delays=0.05/0.04/0/0, dsn=4.4.1, status=deferred (connect to mail.foxydog.co.kr[private/dovecot-lmtp]: No such file or directory)

     

    ◇해결 방법

    [root@localhost ]# vi /etc/postfix/main.cf

    virtual_transport = dovecot     [변경]

    ※ LinuxOS마다 다를 수 있으며 되는 것으로 변경하여 이용하시면 됩니다.

    [root@localhost ]# systemctl restart postfix    [서비스 재시작]

    [root@localhost ]# tail -f /var/log/maillog    [수신 로그 성공 확인]

    May 31 15:42:06 mail postfix/pipe[22119]: 5EBC8800E8: to=<foxydog@foxydog.co.kr>, relay=dovecot, delay=991, delays=991/0.07/0/0.08, dsn=2.0.0, status=sent (delivered via dovecot service)

    조금 더 설명하자면

    virtual_transport 설정이 $virtual_mailbox_domains=DB에 저장된 database-domains정보를 최종적으로 확인하여 수신자에게 메일을 전달(던지는)해주는 역할을 한다고 생각하면 됩니다.


    ⑤ 간혹 다른 사용자들께서는 mynetworks와 relay_domains 옵션을 설정하라고 하지만 만약 단일 메일 서버라면 사용할 필요 없습니다.

    [예시 옵션]
    #mynetworks = 168.100.189.0/28, 127.0.0.0/8    [설정 X]
    #relay_domains =     [설정 X]

    기본 설정은 주석[#] 처리입니다. 저 의미가 릴레이 하지 말고 네트워크 내부 Localhost를 찾아갈 수 있게 유도를 해주는 부분이나 이미 mydestination = localhost 옵션으로 제대로 찾아간다면 서버가 불필요하게 혼란을 줄 필요가 없습니다.


     

    ※ 해당 포스팅은 새로운 오류가 발견될 때마다 내용을 추가 합니다.

    Designed by JB FACTORY