Solaris

sendmail 센드메일 virtual 메일

알 수 없는 사용자 2008. 2. 29.
728x90

정작 목적했던 일은 계속 미루어진채 매일 서버 셋팅과의 싸움이 계속 되고 있습니다. ㅋㅋ ^^;

먼저 virtusertable의 본래의 쓰임새에 대해 알아보았습니다.
Sendmail (Virtual Host) : 하나의 호스트(서버)에서 여러 도메인이 운영될 때 서로 다른 도메인에서 같은 메일 계정을 사용한다면 발생할 수 있는 계정 충돌을 피하기 위해 virtusertable을 이용하는 방법에 대해 잘 설명되어 있습니다.
Sendmail (Virtual Domain) : 역시 같은 주제로 위 포스트와 같은 경우를 다루고 있습니다. 자세하기는 하지만 괞히 복잡한 감이 있습니다. 위의 포스트가 훨씬더 깔끔한것 같습니다. 다만 다른 Unix 시스템이라면 이곳의 글이 더 이해하기 쉬울지도 모르겠습니다.

여러 가지 문서를 볼때 주로 한 호스트에 여러 도메인이 운영될때 각각의 도메인이 같은 계정을 사용할 수 있도록 하는데 사용되는 것으로 보입니다. 기타 다른 호스트로의 forwarding도 가능합니다.

이제 피투성의 시스템에서 발생한 문제와 이의 해결을 위해 virtusertable을 활용한 예를 나열해 보겠습니다.

시스템의 특수한 운영환경때문에 오늘 sendmail의 virtusertable을 이용하게 되었습니다.
현재 이 블로그 시스템은 제가 개인적으로 구축한 시스템과 환경에서 운영되고 있습니다.

시스템 운용환경 :
WebServer : CentOS, sendmail 8.x.x
DNS, 전자메일 서버 : FreeBSD, sendmail 8.x.x     

시스템 운용환경을 예시하면, 아래의 그림과 같습니다.

사용자 삽입 이미지
  • 인터넷과 연결되는 제일 앞단에 공유기가 위치하고 있습니다.
  • 인터넷에 서비스 하는 시스템 2개가 있습니다.
  • 그 하나는 이 블로그와 위키, 공개 프로젝트가 운영되는 Web 서버입니다.
  • 다른 하나는 시스템 부하 분산을 위한 것으로 e-Mail과 DNS를 다른 시스템에 분리하여 서비스 하고 있습니다.
  • 할당 받은 공인 IP는 1개 임으로 부득이 한 서버(Web)는 공인 IP(Super DMZ)를, 나머지 한 서버는(e-Mail,DNS)는 사설 IP를 갖고 있습니다.
  • SuperDMZ와 Port Fowarding을 사용하여 외부의 사용자가 봤을때는 Web, e-mail, DNS 모두 한 서버에서 운용되는 것처럼 전혀 문제가 없습니다.

그런데 정작 문제는 Web 서버의 스크립트에 의한 메일이 e-mail 서버의 계정으로 전달될 필요가 있을때 발생했습니다.

메일 서버에 blogmaster란 계정이 존재하고 이메일 주소는

사용자 삽입 이미지
이라고 가정할때 Web 서버에서 해당 블로그에 발생하는 일을
메일로 전달하고자 합니다. (웹 서버에는 blogmaster란 계정이 없습니다.)

그냥 Web 서버에서
사용자 삽입 이미지

으로 메일을 보내면 불행하게도 메일이 return 되어버립니다.

웹 서버의 로그 메시지 분석을 통해 원인을 알아보면
DNS의 MX 필드인 mail.codeforum.net의 주소를 쿼리하면 공인 IP가 리턴되는데, 이 주소가 Web 서버에서 볼때 바로 자신이므로 localhost로 보내는 것으로 판단합니다. 그런데 Web 서버 자신의 시스템에는 blogmaster란 계정이 없기 때문에 보낸 사람인 root 계정으로 되돌아 오고 마는 것입니다.

Web 서버를 위해 mail.codeforum.net의 주소를 실제 메일 서버의 주소인 사설 IP로 변경할 수는 없습니다. 그렇게 되면 외부 사람이 메일을 보낼 수 없게 되기 때문입니다.

그래서 적당한 방법을 찾던 중 위의 포스틀 글들을 보고 다음과 같이 설정해 보았습니다.

먼저 메일,DNS 서버의 DNS 테이블에 192.168.1.102 mailserver.codeforum.net 로 설정하고
웹 서버의 /etc/mail/virtusertable을 다음과 같이 정의 하였습니다.
사용자 삽입 이미지
사용자 삽입 이미지


그리고 virtusertable을 적용코자 웹 서버의 sendmail 재 실행을 위해 /etc/mail 디렉토리에서 make restart를 실행하였습니다. (virtusertable의 DB 등록까지 동시에 이루어집니다)

다시 메일을 보내고 양 서버의 sendmail 로그를 살펴보았습니다.
이제 이전의 에러는 발생하지 않지만 불행하게도 다시 리턴 메일이 되돌아 왔습니다.

이번에는 메일 서버의 로그를 통해 그 원인을 알 수 있었습니다.
사용자 삽입 이미지
[sendmail.mc 의 LOCAL_DOMAIN(`localhost.localdomain')dnl 특성 때문인지도 모르겠습니다. 정확하지는 않습니다.] 부터 메일 서버의 blogmaster에게 메일이 도착했지만 보낸 사람의 도메인인 localhost.localdomain란 호스트가 불명확하기 때문에 전달을 거부하고 되돌려 보내 버렸기 때문입니다.

여러번의 시행착오 끝에 Web 서버에서 /etc/hosts를 다음과 같이 수정하여 문제를 해결할 수 있었습니다.
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost codeforum.net
::1             localhost6
218.158.45.145 
www.codeforum.net ProjectS

127.0.0.1 은 본래 locahost    localhost.localdomain 으로 선언되어 있었습니다.
이 중 localhost.localdomain을 삭제하고 codeforum.net을 추가하였습니다. 도메인을 추가하지 않으면 문제가 발생했습니다.

메일 서버의 로그를 분석하니 이제는 다음과 같이 메일이 도착하였습니다.

Jan 14 04:33:09 codeforum sendmail[80295]: m0DJX9vl080295: from=
사용자 삽입 이미지

, size=527, class=0, nrcpts=1, msgid=,
proto=ESMTP, daemon=MTA, relay=codeforum.net [218.158.45.145]
Jan 14 04:33:09 codeforum sendmail[80296]: m0DJX9vl080295: to=
사용자 삽입 이미지
, delay=00:00:00, xdelay=00:00:00,
mailer=local, pri=30845, relay=local,dsn=2.0.0, stat=Sent

이렇게 해서 메일이 이상없이 전달되었습니다.

특수한 환경에서 공개된 메일 서버에 도착한 메일을 Private 영역에 있는 메일 계정으로 전달한다든지, 또는 반대의 경우 든지의 목적으로도 virtusertable 활용이 가능할 것으로 보입니다.
728x90

댓글