Unix/Solaris 관련게시판

2001/11/12(17:39) from 61.84.168.217
작성자 : 강줄기 (jkkang65@hanmail.net) 조회수 : 3946 , 줄수 : 274
Re: [sendmail] 센드메일을 실행시키는 방법
1-4 센드메일을 실행시키는 방법
센드메일은 쉘상에서 sendmail -옵션 수신자순으로 치면 된다. -로 시작되는 것은 옵션을 가르 킨다. 옵션은 크게 세가지로 구분할 수 있다.

       -b      운영모드로 실행
       -v      실행하는 과정을 보여줌
       -d     디버깅모드로 실행


1-4-1 운영모드(Become Mode: -b)
-b로 시작되는 옵션은 다음과 같다.

       -bd     데몬 모드로 실행(부팅시 /usr/sbin/sendmail -bd -q1h)
       -bi     앨리어스 데이터베이스 파일을 초기화
       -bm    Be a mail sender(MDA만의 기능으로 작동)
       -bp     큐에 있는 내용을 프린트
       -bs     표준 입력으로 SMTP을 실행
       -bt     테스트 모드: 메일주소에서만 사용(Rewrite를 테스트 하기위해 이용)
       -bv     확인(Verify)

다른 방법은

       smtp            -bd
       newalises       -bi
       mailq           -bp
       bsmtpd         -bs

와 같다.

따라서 sendmail -bd -q1h는 sendmail -smtp -q1h와 같다. -bd옵션과 smtp 옵션이 같은 결과를 가져올까? 그것은 이름만 다르고 이름이 가르키고 있는 파일은 같기 때문이 다.

** 데먼 모드
데몬모드란 백그라운드로 실행되어 다른 호스트로부터 메일을 받을 준비를 취하고 있는 상태이 다. 데먼모드로 실행시키기 위해 쉘상에서 /usr/sbin/sendmail -bd -q1h라고 치면 된다. 여기서 -bd는 데몬모드로 실행하라는 옵션이고 뒤의 -q1h는 큐에 있는 내용을 한시간 간격으로 비우라 는 의미이다.

센드메일은 실행될 때 /etc/sendmail.cf화일을 읽는다. 그후 컨피그 파일을 고쳤더라도 센드메일을 다시 실행시키지 않으면 /etc/sendmai.cf을 읽지 않는다. 따라서 컨피그 파일을 고치면 반드시 센드메일 데먼을 죽였다가 다시 실행시켜야 한다. 센드메일 프로세스를 죽일 때 kill --9 `cat /etc/sendmail.pid`라고 치면 된다.

만일 센드메일 프로세스를 죽이지 않고 /usr/sbin/sendmail -bd -q1h라고 실행시키면

    getrequest: cannot bind: Address already in use

라는 에러가 난다.
좀더 자세하게 이야기 하자면 센드메일이 데먼으로 떠 있을 때 다른 곳에서 메일이 오면 fork(2) 를 이용하여 자신과 똑같은 프로세스를 생성해낸다. 이 프로세서를 자식프로세스라고 하고 데먼 으로 떠 있는 프로세스를 부모프로세스라고 한다. 자식 프로세스는 특정 작업이(메일을 받고 처 리하는 일) 끝나면 죽어 버리고 제어권을 부모 프로세스에게 넘겨준다. 자식프로세스가 일을 하고 있는 동안 부모 프로세스는 자신의 일을 계속할 수 있다.

하나의 자식프로세스가 일을 하고 있는 동안 메일이 오면 부모 프로세스는 또다른 자식프로세스 를 실행시켜 일을 처리하게 한다. 그런이유로 센드메일은 데먼으로 떠 있어야 한다. (포워딩만 하 는 호스트는 제외)

자식프로세스가 있을 때 ps를 해보면 다음과 같은 구절을 볼 수 있다.

       $ ps ax|grep sendmail
       100     ? IW   0:09     /usr/sbin/sendmail -bd -q1h
       49500   ? S     0:00    -SAA1490  (sendmail)

괄호로 쳐저 있는 부분이 자식프로세스가 일하는 것이다.

** 큐모드( -bp)
큐에 있는 내용을 보여준다. mailq와 같은 명령어이다. 다음은 한글 뉴스그룹에서 베껴온 것이다.

Subject: Mail Queue에 쌓인 메세지 다시 보내려면...
같은 도메인내 시스템을 secondary mail server로 할려고 하는데, secondary mail system에 문제가 없다는 가정하에 같은 도메인내의 시스템을 사용하는데 문제가 있는 것은 아니지요?

메일이 전송될 때 일단 상대편 호스트의 MX레코드를 찾습니다. 만일 디엔에스가 설치된 호스트 가 메일서버라면 문제가 있죠. 디엔에스에 문제가 생기면 메일도 같이 문제가 발생하니까 세컨더 리를 설정해놓아도 찾을 리가 만무하죠.

만일 디엔에스와 메일서버를 분리해 놓았다면 세컨더리 메일서버가 정말 리얼라이어블해야 합니 다. 그리고 디엔에스에도 세컨더리 TTL을 정확히 설정해야 합니다. 만약 세컨더리에 메일이 가 서 저장이 되어 있는데 MX의 TTL이 너무 짧거나 길면 문제가 있습니다. 그리고 같은 네트웍 에서는 보통 문제가 같이 일어나지 않는가요.

그런데 이렇게 세밀하게 메일을 관리해주는 관리자는 드물것입니다. 그냥 컴퓨터가 고장이 나서 메일이 전부 사라져 버렸어. 왜 고장이 났는데? 기계가 안좋은 거래. 한국에서 제대로 하는게 뭐 있겠어 이야기 하는 것으로 책임을 모면할 수 있으니까요.

그런데, /usr/lib/sendmail -q나 알려 주신대로 해도 메일이 다시 전송이 어 큐에서 없어지지는 않는군요.

먼저 /usr/sbin/sendmail의 허가권을 보세요 4755로 suid로 설정이 되어 있는지요. 다음엔 /usr/bin/mailq가 /usr/sbin/sendmail에 링크되어 있는지. /etc/sendmail.cf로 가서 OQ/var/spool/mqueue가 있는지 /var/spool/mqeue로 가서 직접 원인을 살펴 봅시다.

df로 시작하는 것은 데이터이구요 qf로 시작하는 것은 큐컨트롤 파일입니다. 보통은 두 개씩 있을거여요. dfKAA00994 qfKAA00994이런식으로요. df화일이 사이즈가 0이 아닌
지 일단 보구요(만일 사이즈가 0이면 지워도 되죠) qf로 시작되는 파일을 편집기로 열어 봅니다.

V2
T860463050 (작성된 시간
K860493553
N18
P1561702(현재 Priority)
I3/1/290346
MDeferred: Connection refused by wilbur.eng.auburn.e(왜 큐에 쌓여 있는지 이유).
Fwb


--------------------------------------------------------------------------------
$rSMTP 이하 헤더 정보
$ssuny
$_andkor@suny.multi.co.kr [203.227.86.1] S
RPFD:
H?P?Return-Path:
HReceived: from suny (andkor@suny.multi.co.kr [203.227.86.1])
by suny.multi.co.kr (8.8.5/8.8.5) with SMTP id KAA00994
for ; Tue, 8 Apr 1997 10:30:50 +0900

H?x?Full-Name: Andy Straisfeid
HSender: andkor
HMessage-ID: <33499FC9.7A47552E@suny.multi.co.kr>
HDate: Tue, 08 Apr 1997 10:30:49 +0900
HFrom: Andy Straisfeid
HX-Mailer: Mozilla 3.01 (X11; I; Linux 2.0.29 i486)
HMIME-Version: 1.0
HTo: David B McWaters
HSubject: Re: Government position/available land.
HReferences: <199704071448.JAA14306@endeavour.eng.auburn.edu>
HContent-Type: text/plain; charset=us-ascii
HContent-Transfer-Encoding: 7bit


그래서 원인을 알았으면 그쪽으로 접속해봅니다. 위의 예에서는

suny:/var/spool/mqueue# telnet endeavour.eng.auburn.edu 25
Trying 131.204.31.42...
telnet: Unable to connect to remote host: Connection refused


접속이 안되는 군요.

보통은 메일이 전달 안되는 이유가 이런 이유죠. 이런 에러가 있는데 sendmail -q한다고 메일이 다시 가는 것은 아니겠지요. 다시 큐에 그대로 쌓일수 밖에요.

가만히 놔두면 /usr/sbin/sendmail -bd -q1h와 같이 명령어를 주어 실행시켰으면 1시간마다 큐를 비우려고 합니다.


cd /var/spool
mv mqueue omqueue
mkdir mqueue
chmod 700 mqueue


한후 현재 센드메일 데먼을 죽이고 /usr/sbin/sendmail
-oQ/var/spool/omqueue -q
큐가 비면 rm omqueue하면 되죠.

혹시 오리발내밀 준비가 되어 있으면 rm -f /var/spool/mqueue/* 라고 하면:-)

그런데 왜 한글 센드메일을 사용하지요? 신정식님이 제안한 영문센드메일+procmail을 이용하지 않구요? 이전 버전은 보안상 치명적인 문제가 있지요
http://pantheon.cis.yale.edu/~jshin 를 참조하세요.

** 앨리어스 모드 (-bi)
앨이서스가 담는 데이터가 많을 경우 dbm이나 db와 같은 데이터 베이스를 이용한다. 앨리어스 데이터 베이스가 갱신되었을 경우 이를 센드메일이 다시 읽게 하는 명령어로 newaliases가 사용 된다. 이 명령어는 /usr/sbin/sendmail -bi와 같은 것이다.

newalises명령어를 실행시키면

890 aliases, longest 780 bytes, 30983 bytes total
과 같은 결과가 나온다.

** 확인 모드(-bv)
앨리어스가 제대로 되었는지 체크할 때 -bv옵션을 사용한다. 만일 에러가 있을 경우

       leestl...          user unknown
       tomy..          deliverable

와 같은 결과가 나온다.


1-4-2 실행하는 과정을 보여주는 모드(Verbose mode -v)
센드메일이 수행하는 과정을 보여주는 모드이다.
/usr/sbin/sendmail -v leesl@trade.chonbuk.ac.kr < /dev/null
이라고 치면 수행하는 과정을 보여준다.

leesl@trade.chonbuk.ac.kr... Connecting to trade.chonbuk.ac.kr. via esmtp...
220 trade.chonbuk.ac.kr ESMTP Sendmail 8.8.4/8.8.4; Mon, 7 Apr 1997 22:49:13 +0900
>>> EHLO suny.multi.co.kr
250-trade.chonbuk.ac.kr Hello leesl@suny.multi.co.kr [203.227.86.1], pleased to meet you
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-ETRN
250-XUSR
250 HELP
>>> MAIL From:
250-trade.chonbuk.ac.kr Hello leesl@suny.multi.co.kr [203.227.86.1], pleased to meet you
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ONEX
250-ETRN
250-XUSR
250 HELP
>>> MAIL From:
250 ... Sender ok
>>> RCPT To:
250 ... Recipient ok
>>> DATA
354 Enter mail, end with "." on a line by itself
>>> .
250 WAA21044 Message accepted for delivery
leesl@trade.chonbuk.ac.kr... Sent (WAA21044 Message accepted for delivery)
Closing connection to trade.chonbuk.ac.kr.
>>> QUIT
221 trade.chonbuk.ac.kr closing connection


숫자로 시작하는 줄은 받는 쪽의 센드메일(trade.chonbuk.ac.kr)이 응답한 것이고 >>>로 시작하 는 줄은 보내는쪽의 센드메일(suny.multi.co.kr)이 실행한 명령어이다.

처음줄은 trade.chonbuk.ac.kr에 esmtp프로토콜로 접속하고 있다는 말이다. 그럼 받는쪽의 센드메일이 자신은 센드메일 8.8.4를 버전이다 라는 것을 표시한다. 보내는 쪽(suny)의 센드메일이 잘있냐 (EHLO) 하니까 받는 쪽(trade)가 잘있다. suny.multi.co.kr라고 대답한다. >>> MAIL From...여기 leesl@suny.multi.co.kr로 부터 메일이 있다. 250 보내라
>>> RCPT To 받는 사람은 당신호스트의 leesl이다. 250 좋다
>> DATA 데이터를 보낸다
354 받고 있다. 다보내면 .을 찍어라
>>> . 다 보냈다
250 잘 받았다.
>>> QUIT 끝났다.
221 접속을 끝는다.


1-4-3 디버깅 모드 (-d)
디버깅모드는 센드메일 컨피그가 제대로 되었나 확인하기 위해 사용한다. 디버깅 모드로 실행하 는 방법은 쉘상에서 /usr/sbin/sendmail -d leesl < /dev/null라고 쳐보자 그러면 많은 줄들이 지 나간다. 자세한 내용은 다른 페이지를 만들어 설명하기로 한다.

디버깅되는 범위을 조절하기 위해 -d 옵션뒤에 숫자를 붙임으로서 조절할 수 있다. 이 숫자를 catogory라고 한다. 예를 들어 /usr/sbin/sendmail -d40 leesl
emotename(Lee Sanglo )
>>>>> queueing XAA03926 (new id) >>>>>
queueing 80a06d8=leesl:


       mailer 3 (local), host `'
       user `leesl', ruser `leesl'
       next=0, alias 0, uid 502, gid 100
       flags=600c
       owner=(none), home="/home/leesl", fullname="Lee Sanglo"
       orcpt="(none)", statmta=(none), status=(none)
       rstatus="(none)"
       specificity=0, statdate=Thu Jan  1 09:00:00 1970

<<<<< done queueing XAA03926 <<<<<

Catogary와 더불어 레벨이라는게 있다. 레벨은 출력되는 량을 조절한다. 따라서 디버깅모드는

catogary.level

로 구성되어 있다.

/usr/sbin/sendmail -d0.1 -bp명령어에서 -d0는 센드메일이 일반적인 디버깅 정보를 출력하라는 것이고 .1은 이때 나오는 정보를 최소한으로 줄여 나타내라는 말이다.

[결과]
Version 8.8.5
Compiled with: LOG MATCHGECOS MIME7TO8 MIME8TO7 NAMED_BIND NETINET

NETUNIX NEWDB QUEUE SCANF SMTP USERDB XDEBUG

SYSTEM IDENTITY (after readcf) ============ (short domain name) $w = suny (canonical domain name) $j = suny.multi.co.kr
(subdomain name) $m = multi.co.kr

(node name) $k = suny


--------------------------------------------------------------------------------

               Mail Queue (6 requests)
--Q-ID-- --Size-- -----Q-Time----- ------------Sender/Recipient------------

UAA03600     1419 Tue Apr  8 20:59
                (Deferred: Connection refused by a.mr.aol.com.)
                                  
UAA03466     9656 Tue Apr  8 20:22
                (Deferred: Connection refused by a.mr.aol.com.)

다시 레벨을 높여보면 (/usr/sbin/sendmail -d0.5 -bp) 더많은 정보를 볼 수 있다.

[결과]
Version 8.8.5
Compiled with: LOG MATCHGECOS MIME7TO8 MIME8TO7 NAMED_BIND NETINET

NETUNIX NEWDB QUEUE SCANF SMTP USERDB XDEBUG canonical name: suny.multi.co.kr

       a.k.a.: suny
       a.k.a.: suny.multi
UUCP nodename: suny
       a.k.a.: suny.multi.co.kr
       a.k.a.: [203.227.86.1]
       a.k.a.: [127.0.0.1]
       a.k.a.: localhost

Modify Delete Post Reply Backward Forward List
Powered by Kang Jul Ki