Skip to content

조회 수 13853 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
이 글은 qmail의 기본적인 릴레이 설정과 인증후 릴레이 허용 방법, STARTTLS 사용 방법등에 대해서 간단히 썼습니다. 조금이나마 도움이 되기를 바라며, 수정할 사항이 있다면 연락 주시기 바랍니다 (질문은 게시판으로...) -- 임은재 2004-04-15 23:01:58
1 qmail relay, 암호 인증, STARTTLS
1.1 tcpserver
1.1.1 tcp.smtp
1.1.2 rcpthosts
1.2 AUTH 릴레이
1.3 STARTTLS
1.4 netqmail
1.5 patch cocktail

1.1 tcpserver #

qmail-smtpd 서버는 tcpserver에 의해 구동되도록 설정하는 것을 기본으로 합니다(아마 대부분 이렇게 하시겠지만). 대부분 다음과 비슷하게 생겼을 겁니다.
#!/bin/sh
Q_UID=$(id -u qmaild)
Q_GID=$(id -g qmaild)
exec /usr/local/bin/tcpserver -vRHl0 -x /etc/tcp.smtp.cdb \
-u $Q_UID -g $Q_GID 0 25 \
/var/qmail/bin/qmail-smtpd 2>&1
아마 내용이 같지는 않을 겁니다만, 여기서 중요한 것은 릴레이를 조절할 /etc/tcp.smtp.cdb 입니다. tcp.smtp.cdb를 만드는 방법은 바로 다음에 설명합니다.

1.1.1 tcp.smtp #

이제 /etc/tcp.smtp를 만들어 봅시다. 메일 서버의 ip 주소192.168.1.1 이라고 가정하고, 192.168.1.100의 릴레이를 열어주고, 192.168.2.XXX ip 대역의 릴레이도 열어준다고 가정하면 다음과 같이 될 것입니다.
127.0.0.1:allow,RELAYCLIENT=""
192.168.1.1:allow,RELAYCLIENT=""
192.168.1.100:allow,RELAYCLIENT=""
192.168.2.:allow,RELAYCLIENT=""
:allow
첫번째와 두번째줄은 메일 서버 내부의 릴레이를 열어 준 것입니다. 릴레이를 전혀 허용하지 않으려면 첫번째와 두번째 룰만 있으면 됩니다. 192.168.1.100:allow,RELAYCLIENT="" 를 예를 들어 설명하면 tcpserver는 해당 ip (192.168.1.100)로 부터의 접속을 허용하고 (:allow) 해당 ip에서 접속이 있을 경우 RELAYCLIENT 환경 변수를 설정한 후 qmail-smtpd 를 실행하게 되므로 릴레이가 허용되는 원리 입니다.

마지막 줄의 :allow 는 다른 ip에서의 접속을 허용만 하고 RELAYCLIENT 환경 변수는 설정하지 않습니다. 즉, 릴레이는 허용하지 않습니다. (사실 기본값이 allow이므로 이 값은 없어도 마찬가지 입니다).

tcp.smtp를 수정한 후에는 tcpserver가 사용할 수 있는 cdb 형식으로 바꿔주기 위해 다음과 같이 합니다 (이 과정을 빼먹으면 아무런 효과가 없으며 qmail 자체를 재시작 할 필요는 없습니다).
$ tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
메일 서버를 운영하다 보면 특정 주소로 부터의 메일을 막아 버려야 하는 경우(예를 들어 스팸 메일)가 생기는데 이런 경우에는 다음과 같은 룰을 tcp.smtp에 추가해 준 후 cdb파일로 만들어 줍니다.

예를 들어 66.115.47.XXX 대역으로 부터 오는 모든 메일과 216.240.138.237로 부터 오는 메일을 완전히 막으려면:
66.115.47.:deny
216.240.138.237:deny
다시 말씀 드리지만 이것은 메일의 주소와 상관없이 해당 주소로 부터의 SMTP 접속을 아예 거부하는 것입니다.

1.1.2 rcpthosts #

/var/qmail/control/rcpthosts 를 수정할 차례인데 여기에는 간단하게 이 서버가 메일을 받아 들일 도메인만 적어 줍니다. 즉, 이 서버의 도메인이 foobar.com 이라면 내용은 foobar.com 만 있으면 됩니다. 다중 도메인을 사용하는 경우에는 차례대로 적어 주면 되겠죠?. ([http]vpopmail를 사용하는 경우에는 자동으로 추가/수정 됩니다).

이제 부터 qmail-smtpd 는 위에서 설정한 tcp.smtp에서 릴레이를 열어주지 않은 경우, rcpthosts에 적혀 있지 않은 도메인으로 메일을 보내려 하면 "553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)" 메세지와 함께 릴레이를 거부 할 것입니다.

1.2 AUTH 릴레이 #

대부분의 경우에는 지금까지의 설정만으로 충분 할 것입니다. 하지만, 유동 IP 사용자들에게 릴레이를 열어 줘야 하는 메일 서버의 경우에는 인증후 릴레이 방식을 사용하는 것이 좋습니다. 이 방법은 qmail 소스를 패치해야 합니다. 즉, qmail-smtpd가 암호 인증후에 릴레이를 열어 주도록 만들어 줘야 합니다.

인증 패치는 [http]패치 칵테일에 포함되어 있으며, 이것은 brush@elysium.pl의 [http]smtp-auth 패치와 몇가지 많이 사용되는 패치들을 하나로 모아 놓은 것입니다.

또는 [http]netqmail 패키지에 Bill Shupp의 TLS + SMTP Auth patch를 적용해서 사용할 수 있습니다.
<!>
인증 방법은 여러가지로 유연하게 적용할 수 있는데 다음중 하나이거나 여러 가지 인증 소스를 동시에 사용할 수도 있습니다.
  1. 시스템 계정 (/etc/passwd)
  2. cmd5checkpw (/etc/poppasswd)
  3. checkpassword + mysql (유저 데이터를 db에 저장)
  4. vchkpw (vpopmail pop 유저 데이터를 사용, db또는 vpasswd)
  5. 첫번째로 smtp 인증 사용자가 몇명되지 않을때 가장 손쉽게 적용할 수 있는 cmd5checkpw 를 사용하는 방법을 설명합니다. [http]cmd5checkpw 를 받습니다. 물론 qmail을 패치해야 하므로 qmail 소스도 가지고 있어야 하겠죠.

    * 먼저 cmd5checkpw를 설치합시다.
    $ tar xzf cmd5checkpw-0.22.tar.gz
    $ cd cmd5checkpw-0.22
    $ make ; make install
    $ touch /etc/poppasswd
    $ useradd -M checkpw
    $ chown checkpw /bin/cmd5checkpw
    $ chmod a+s /bin/cmd5checkpw
    $ chown checkpw /etc/poppasswd
    $ chmod 400 /etc/poppasswd
    * qmail을 패치/설치 합니다 (기존에 qmail 데몬이 실행되고 있다면 미리 중지 시키세요). 칵테일 패치를 사용 한다면,
    $ tar xzf qmail-1.03.tar.gz
    $ tar xzf qmail-ej-cocktail-XX.tar.gz

    $ cd qmail-1.03
    $ patch -p1 < ../qmail-ej-cocktail-XX/qmail-ej-cocktail-XX.patch

    $ make
    $ make setup check

    smtp-auth 패치만 한다면,
    $ tar xzf qmail-1.03.tar.gz
    $ tar xzf qmail-smtpd-auth-0.30.tar.gz

    $ cd qmail-smtpd-auth-0.30
    $ cp README.auth base64.c base64.h ../qmail-1.03
    $ patch -d ../qmail-1.03 < auth.patch

    $ cd ../qmail-1.03
    $ make
    $ make setup check
    정상적으로 패치가 되었다면, 후에 qmail이 구동되었을때 다음과 같이 EHLO 응답 메세지를 확인해 볼 수 있습니다.
    $ telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 foobar.org ESMTP
    ehlo localhost <-- 이 부분은 제가 입력한 것입니다.
    250-foobar.org
    250-PIPELINING
    250-AUTH LOGIN CRAM-MD5 PLAIN <-- 이 부분이 나오면 정상입니다.
    250 8BITMIME
    자, 이제 우리는 패치된 qmail-smtpd가 생겼습니다. "인증후 릴레이 열어주기"가 가능하도록 하려면 qmail-smtpd 구동 스크립트를 수정해 줘야 합니다.
    #!/bin/sh
    Q_UID=$(id -u qmaild)
    Q_GID=$(id -g qmaild)
    exec /usr/local/bin/softlimit -m 7340032 \
    /usr/local/bin/tcpserver -vRHl0 -x/etc/tcp.smtp.cdb \
    -u $Q_UID -g $Q_GID 0 25 \
    /var/qmail/bin/qmail-smtpd foobar.com \
    /bin/cmd5checkpw /bin/true 2>&1
    foobar.com은 여러분의 도메인명으로 바꿔야 되겠죠? (cmd5checkpw와 true의 경로가 맞는지 확인하세요.)
    패치된 qmail-smtpd에는 "checkprogram subprogram" 의 형식을 사용할 수 있는데 여기서는 "/bin/cmd5checkpw /bin/true"를 사용했습니다. cmd5checkpw 는 암호 파일을 /etc/poppasswd 를 사용하며, 내용은 다음과 같은 요령으로 추가 해 줍니다.
    username:password
    이제 클라이언트들은 인증후에 이 서버를 사용해서 메일을 보낼 수 있습니다 (항상 테스트/로그 확인 하는 것을 잊지마세요).

    [http]checkpassword를 사용해서 계정 유저의 /etc/passwd를 사용하는 방법도 있지만 이것은 별로 권장하지 않습니다. 암호가 알려지는 경우 서버로 로그인까지 가능케 되버리니까요. 되도록 cmd5checkpw 와 /etc/poppasswd 만을 사용하도록 하고 계정 사용자 인경우 로그인 암호와는 다른 암호를 사용하도록 하는 것이 보안상 좋습니다 (POP, SMTP, LOGIN 암호를 모두 동일하게 설정하는 실수를 하지 마세요).

    mysql 패치된 checkpassword를 사용하는 방법도 있습니다. 참고: [http]checkpassword + sql.

    vpopmail에는 로밍 서비스라는 것이 있어서 POP 인증후에 smtp 릴레이를 열어주도록 하는 기능이 있습니다만, 이것을 사용하지 않고 이 패치와 vpopmail의 암호 확인 프로그램인 vchkpw를 사용하면 vpopmail에서 생성해준 사용자와 암호를 그대로 사용할 수 있습니다. 다음은 vchkpw를 인증 프로그램으로 사용하도록 한 qmail-smtpd 구동 스크립트 예입니다:
    #!/bin/sh
    QMAILDUID=$(id -u vpopmail)
    NOFILESGID=$(id -g vpopmail)
    exec /usr/local/bin/softlimit -m 7340032 \
    /usr/local/bin/tcpserver -H -R -l 0 \
    -x /etc/tcp.smtp.cdb \
    -u "$QMAILDUID" -g "$NOFILESGID" 0 25 \
    /var/qmail/bin/qmail-smtpd foobar.com \
    /home/vpopmail/bin/vchkpw /bin/true 2>&1
    <!>


    1.3 STARTTLS #

    STARTTLS는 SSL을 사용해서 SMTP 프로토콜 연결을 암호화 하는 것입니다. 역시 qmail에서 STARTTLS 지원을 가능하게 하는 패치가 나와 있습니다. (이 패치는 칵테일 패치에 이미 포함되어 있습니다).
    TLS 패치는 openssl-0.9.6 이상을 필요로 합니다. 패치후에 qmail을 재 컴파일/설치 한 후에 제대로 링크가 되었는지 확인해 봅니다.
    $ ldd /var/qmail/bin/qmail-smtpd
    libssl.so.0.9.6 => /usr/lib/libssl.so.0.9.6 (0x4001b000)
    libcrypto.so.0.9.6 => /usr/lib/libcrypto.so.0.9.6 (0x4004a000)
    libc.so.6 => /lib/libc.so.6 (0x40111000)
    libdl.so.2 => /lib/libdl.so.2 (0x4024f000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    위 결과 처럼 ssl 라이브러리가 표시되어야 합니다. 사용할 인증서를 만들어 줘야 하는데, 패치된 qmail 소스 디렉토리에서 make cert 하거나 다음과 같이 직접 만들어 줍니다 (다음 예에서는 1년짜리 인증서를 만들어 보았습니다). 인증서 생성시 기입해야 것들은 정확하게 입력하고 특히 Common Name은 정확히 메일 서버의 FQDN명을 사용하는 것이 좋습니다.
    $ openssl req -new -x509 -nodes -out /var/qmail/control/servercert.pem \
    -keyout /var/qmail/control/servercert.pem -days 365
    $ chmod 640 /var/qmail/control/servercert.pem
    $ chown qmaild.qmail /var/qmail/control/servercert.pem
    $ ln -s /var/qmail/control/servercert.pem /var/qmail/control/clientcert.pem
    이렇게 패치된 qmail서버는 25번 포트로 SSL 접속과 일반적인 smtp 접속을 모두 허용합니다.

    ** vpopmail 쓰시는 분들은 qmaild.qmail 대신 vpopmail.vchkpw 로 해주셔야 퍼미션 에러가 나지 않습니다. - tester


    STARTTLS, AUTH 패치가 제대로 되었는지 먼저 telnet으로 확인해 보면:
    $ telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 foobar.org ESMTP
    ehlo localhost <-- 이 부분은 제가 입력한 것입니다.
    250-foobar.org
    250-PIPELINING
    250-STARTTLS
    250-AUTH LOGIN CRAM-MD5 PLAIN
    250 8BITMIME
    테스트는 STARTTLS 패치한 다른 qmail서버, sendmail (v8.11.6), ssmtp, 윈도우에서는 OE 로 메일을 보내 보았는데 auth, ssl이 잘 동작합니다. 실제로 ssl 연결이 제대로 이루어져 프로토콜이 암호화 되는지는 tcpdump나 sniffit 같은 툴을 사용해서 직접 패킷을 확인해 보거나, 도착된 메일의 헤더를 확인해 보면 됩니다 ("Received xxx with DES-CBC3-SHA encrypted SMTP;").


    1.5 patch cocktail #

    qmail은 여러가지 패치가 존재하기 때문에 따로 적용하다 보면 충돌이 생겨 패치가 제대로 적용되지 않는 경우가 있습니다. 그래서 개인적으로 유용하다고 생각되는 몇가지 패치를 손쉽게 적용할 수 있도록 하나의 패치로 만들어 보았습니다.
     

List of Articles
번호 제목 글쓴이 날짜 조회 수
82 SPF 레코드등록.. 이틀간의 삽질의 결과물..(hotmail) ADMINPLAY 2010.06.04 19054
81 네임서버에 SPF 적용하기(bind) l2zeo 2010.05.29 15312
» qmail relay, 암호 인증, STARTTLS ADMINPLAY 2010.05.12 13853
79 해외(Hotmail 등)로 안정적인 메일발송방법 - Reverse DNS... ADMINPLAY 2010.03.10 14015
78 RBL 참조사이트 이용 및 스팸차단 설정 ADMINPLAY 2010.01.22 12217
77 qmail queue 서브디렉토리 복구 ADMINPLAY 2009.12.25 10292
76 Q메일서버 관리 1 ADMINPLAY 2009.12.25 11079
75 qmail 큐삭제 ADMINPLAY 2009.12.25 14462
74 리눅스 메일로그 분석 및 확인 ADMINPLAY 2009.12.23 13671
73 sendmail mqueue 에 쌓인 메일삭제 주기수정 ADMINPLAY 2009.12.14 15147
72 telnet을 이용한 SMTP 테스트 ADMINPLAY 2009.11.26 11943
71 qmail error (unable to lock directory /var/log/qmail/s... ADMINPLAY 2009.11.26 11243
70 폼메일 테스트 방법 ADMINPLAY 2009.11.26 11275
69 spamassassin 필터 설치하기 ADMINPLAY 2009.11.24 9281
68 Sendmail 계정 및 도메인생성 ADMINPLAY 2009.11.24 13310
67 squirrelmail (다람쥐메일) 설치하기관리자 file ADMINPLAY 2009.11.24 11082
66 roundcube첨부파일 한글일때 깨지는 문제해결 ADMINPLAY 2009.11.01 12404
65 /var/spool/mail/에 저장된 메일 다른 메일로 보내기 ADMINPLAY 2009.11.01 9443
64 주요포탈업체 IP차단해제하기 ADMINPLAY 2009.11.01 11026
63 Sendmail 세부설정 ADMINPLAY 2009.10.20 9940
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6

Copyright ADMINPLAY corp. All rights reserved.

abcXYZ, 세종대왕,1234

abcXYZ, 세종대왕,1234