1. 개요
지난 글에 이어, 메일서버 구축에 대해 설명합니다.
준비사항
- Windows Server 2019
- 도메인
2. 순서
4. 메일서버 설치
5. 메일 클라이언트와 연동
6. 보안 설정
3. 메일 서버 설치에 앞서 확인할 사항
- Windows Server에 IIS, mysql이 이미 설치된 것을 전제로 합니다.
- 주의 - 메일서버는 보안에 특히 신경써야 하며 스팸메일발송의 릴레이 서버가 되지 않도록 설정해야 합니다.
- 발송하는 메일이 스팸으로 인식되지 않기 위해서는 1)SPF 및 DMARC설정 2)DKIM 설정 3)KISA에 화이트리스트 등록이나 4)인터넷 회사에 역방향 DNS(PTR record) 등록이 필요합니다. 3)과 4)방법은 이 글에 서 다루지 않겠습니다. 다른 사이트를 참고하시기 바랍니다.
- 보안 설정을 모두 하였더라도 수신 메일 서버의 정책에 따라 스팸메일로 분류될 수 있습니다. 이 경우에는 수신자에게 직접 스팸해제 요청을 하여야 합니다.
- 윈도우용 메일서버 프로그램으로는 hMailServer(무료), MailEnable(무료,유료), MS Exchange Server(유료) 등이 있습니다. - 이 글에서는 hMailServer의 설치 및 설정에 대해서 다룹니다. (hMailServer의 장점은 설정이 간편하고 무료이며 한글 메뉴를 사용할 수 있습니다., 단점은 웹 메일을 지원하지 않고, 멀티도메인 적용 기능이 미흡합니다.)
4. 메일서버 설치
- 진행과정 - 메일서버의 도메인을 정한 후, 메일서버프로그램을 설치하고, 메일앱에서 접속/메일발송,수신을 확인합니다. 예시로 1)테스트.net을 기본도메인으로 하고 2)테스트.co.kr 도메인을 추가하여 메일서버를 설정해 보겠습니다.
4-1. 도메인 설정
-
도메인을 구입한 사이트의 설정페이지에서 1) 루트도메인에 MX record를 등록합니다. MX record는 IP주소값으로 입력할 수 없고 반드시 도메인명 형식으로 지정해야 합니다. 2) MX record로 지정한 도메인을 A record 또는 C name 으로 서버에 연결합니다
-
아래에서 1) 빨간 박스는 루트도메인에 MX record를 등록한 것이고, 2) 파란 박스는 그 도메인을 서버로 연결한 것 입니다. 만일 웹서버와 메일서버가 분리되어 있으면 여기서 메일서버로 연결할 수 있습니다.
4-2. 포트 개방 및 연결
- 윈도우 방화벽에서 포트 열기
서버 관리자 > 도구 > 고급 보안이 포함된 Windows Defender 방화벽 > 인바운드 규칙 > 새 규칙
열어줄 포트는 다음과 같습니다. 여기서는 SMTP와 IMAP을 사용하기 위해 25, 143포트를 열어 진행해보겠습니다. (보안 연결에 대해서는 6-4.를 참고하세요.)
- 25 (기본 SMTP 포트, 필수)
- 465 (SMTP, 보안 연결)
- 587 (SMTP, 보안 연결)
- 110 (POP3)
- 995 (POP3, 보안 연결)
- 143 (IMAP)
- 993 (IMAP, 보안 연결)
4-3. hMailServer 설치
- https://www.hmailserver.com/download 에서 프로그램을 다운로드 받아 설치합니다.
- mysql을 사용합니다.
- 관리자 비밀번호를 설정합니다.
- DB설정을 위해 바로 위에서 설정한 관리자 비밀번호를 입력합니다.
- DB에 새로운 Schema(database)를 만듭니다. DB는 mysql을 선택합니다.
- DB 정보를 입력합니다. (참고-https://xetown.com/tips/1301091#user_content_6)
서버주소 - localhost 또는 127.0.0.1
포트 - 3306
Database name - 새로 생성할 Schema(database) 이름을 지정합니다.
Authentication - DB user 정보를 입력합니다.
- hMailServer가 시작하기 전에 DB 프로세스가 먼저 실행되도록 DB service를 지정해 줍니다.
- libmysql.dll 오류 - mysql server를 64bit 버전으로 설치한 경우 아래와 같은 오류메세지가 나타납니다.
- 해결 - C:\Program Files (x86)\hMailServer\Bin 폴더에 첨부한 32bit용 libmysql.dll 을 복사합니다.
- 첨부파일 - libmysql.dll
- 한글화 방법 (첨부파일 - korean.ini)
C:\Program Files (x86)\hMailServer\Languages 폴더에 첨부한 korean.ini 을 복사합니다.
C:\Program Files (x86)\hMailServer\Bin\hMailServer.ini 을 메모장 등 편집기로 열어 ValidLanguages 에 korean 추가합니다. (편집기에서 수정하여 바로 저장하면 권한오류가 발행하므로, 바탕화면 같은 폴더에 임시로 저장하였다가 복사합니다.)
hMailServer Administrator - (상단메뉴)File > Select language... 에서 korean을 선택합니다. (korean이 뜨지 않는 경우 Stop service/Start servic로 재시작하면 나타납니다. 또는 서버를 재부팅해도 됩니다.)
4-4. hMailServer 설정
- hMailServer Administrator 를 실행 합니다.
- 사용할 도메인을 입력합니다. - 여기서는 멀티도메인 상황을 가정하여 1)테스트.net 도메인을 기본 도메인으로 2)테스트.co.kr 도메인을 추가로 설정하겠습니다. (이렇게 구성하는 경우, (1)발신메일 주소는 ID@테스트.net이 되고 (2) ID@테스트.net 또는 ID@테스트.co.kr 주소로 메일을 수신할 수 있습니다.)
- 이름 탭에서 추가 설정할 두번째 도메인을 지정합니다. 도메인이 1개인 경우 이 과정은 생략합니다.
- 사용할 계정들을 생성합니다.
- 설정 > 프로토콜 > SMTP 의 (상단)이메일 송신 탭에서 "로컬 호스트 이름"에 기본 도메인을 지정합니다.
- 고급 > 기본 도메인 지정
- 고급 > IP 범위 > Internet 에서 릴레이 서버로 이용되지 않도록 배달 허용을 재설정합니다. 또한 수신메세지에는 인증 요구가 있으면 안되므로 이를 설정합니다.
- 너무 많은 접속이 있거나 ID/비밀번호가 일정횟수 이상 틀리면 자동차단이 됩니다. (고급 > 자동-차단에서 설정) 이 규칙으로 인하여 자신의 ID가 차단되지 않도록 우선순위를 높여 접속을 허용해줍니다. 우선순위의 숫자가 클수록 먼저 적용됩니다. (자동차단의 우선순위는 20입니다.)
- 유틸리티 > 백업 에서 백업을 저장할 적당한 폴더를 지정합니다.
- 고급 > 로깅에서 사용을 체크하여 접속 로그를 볼 수 있습니다.
- 유틸리티 > 진단에서 서버 상태를 테스트할 수 있습니다.
5. 메일 클라이언트와 연동
- 여기서는 윈도우 10의 기본 메일 앱을 이용하여 메일 송/수신을 테스트해 보겠습니다.
- (왼쪽메뉴)계정 > (오른쪽메뉴) 계정 추가 > 고급설정 > 인터넷 전자 메일
- 전자 메일 주소와 사용자 이름을 동일하게 설정하여야 합니다.
- 메일서버주소는 도메인 설정에서 지정한 것을 입력하며, "받는 전자 메일 서버"에는 포트 번호까지 입력합니다.
- 메일발송 테스트 - 1)계정을 클릭하여 선택한 뒤 2) + 새 메일을 클릭하여 메일을 작성하고 3)보내기 버튼을 누릅니다.
- 메일 발송에 실패하는 경우 - 로그를 확인하여 문제를 파악할 수 있습니다. 1)로그에서 접속이 확인되지 않으면(아무 접속도 없었다면 로그파일이 생성 조차 되지 않습니다.) 방화벽, 포트포워딩, 도메인설정등을 확인하고 2)접속 후 차단이 되는 경우에서 고급>자동-차단을 확인하거나, 메일앱에서 전자메일주소와 사용자이름이 일치하는지 확인합니다.
6. 보안 설정
6-1. SPF(Sender Policy Framework)
- 도메인의 TXT 레코드에 메일 서버의 정보를 기록합니다. 메일 수신자는 도메인의 TXT 레코드를 조회하여 여기에 없는 서버에서 메일을 수신 받으면 이를 스팸으로 판단할 수 있습니다. 자세한 SPF 문법은 다른 사이트를 참고하시기 바랍니다. (참고 - KISA 불법스팸대응센터)
- 도메인 등록기관의 도메인설정사이트에서 루트도메인의 TXT 레코드에 작성합니다.
- 아래는 제 SPF 설정입니다 - 제 메일서버의 ip(299.299.299.299)가 아닌 곳에서 발송한 메일은 수신자의 메일서버에서 모두 drop 되도록 지시하였습니다.
v=spf1 ip4:299.299.299.299 -all
6-2. DKIM(DomainKeys Identified Mail)
- (1)도메인(selector._domainkey.루트도메인)의 TXT 레코드에 공개키를 저장하고, (2)개인키(비밀키)를 사용하여 암호화한 서명을 발신메일의 헤더에 추가하여 메일을 발송합니다. (3)수신 서버는 공개키로 메일 헤더를 복호화여 메일이 변조되었는지 판단합니다.
- 먼저 공개키와 개인키를 생성해야 합니다. (1) https://dkimcore.org/tools/ 에서 간편하게 생성하거나 (2) openssl로 직접 생성할 수 있습니다.
- 여기에서는 openssl를 통한 인증키생성을 진행해 보겠습니다.
① https://code.google.com/archive/p/openssl-for-windows/downloads 에서 OS의 bit에 맞게 프로그램을 다운로드 하여 압축을 풀어 줍니다. bin폴더의 openssl.exe를 관리자 권한으로 실행합니다. (관리자 권한으로 실행하지 않으면 random state 오류가 발생하며 인증키가 제대로 생성되지 않습니다.)
②개인키를 생성합니다. 명령어는 다음과 같습니다. (아래 그림의 빨간박스)
genrsa -out dkim_private.pem 1024
③공개키를 생성합니다. (아래 그림의 파란박스, 생성된 파일은 bin폴더에 있습니다.)
rsa -in dkim_private.pem -out dkim_public.pem -pubout
- hMailServer에서 도메인키를 등록합니다. (도메인 > 생성한 기본도메인 > DKIM Signing)
①사용에 체크
②위에서 생성한 개인키(dkim_private.pem)을 지정
③selector 지정 (적당한 문자열을 지정합니다)
- 도메인 등록기관의 도메인설정사이트에서 공개키를 등록합니다.
①서브도메인 명은 위에서 지정한 selector._domainkey 가 됩니다. 제 경우에는 selector로 "dkim"을 설정하였으므로 "dkim._domainkey.테스트.net" 의 TXT 레코드에 공개키를 저장하게 됩니다.
②TXT 레코드 값은 "v=DKIM;t=s;k=rsa;p=공개키" 입니다. 공개키는 dkim_public.pem파일에서 "-----BEGIN PUBLIC KEY-----"과 "-----END PUBLIC KEY-----"를 제외하고 그 사이에 있는 문자열 입니다.
아래는 제 DKIM 설정입니다.
6-3. DMARC(Domain-based Message Authentication, Reporting, and Conformance)
- 도메인의 TXT 레코드에 의심스러운 이메일(SPF/DKIM 인증을 통과하지 못한 이메일)에 대한 처리방법을 정의 합니다.
①서브도메인 명은 _dmarc 입니다. 제 경우에는 "_dmarc.테스트.net" 의 TXT 레코드에 설정하게 됩니다.
②TXT 레코드 값은 DMARC 문법에 의합니다. 자세한 DMARC 정책은 다른 사이트를 참고하시기 바랍니다.(참고 - https://support.google.com/a/answer/2466563?hl=ko)
- 아래는 제 DMARC 설정입니다.
v=DMARC1; -- dmrac "버전" 정의
p=reject; sp=reject; -- 루트도메인(p), 하위도메인(sp) 모두에서 의심스러운 메일은 "거부"
adkim=s; -- 메일정보와 DKIM 서명이 "정확"하게 일치하지 않으면 스팸처리
rua=dmarc-reports@테스트.net; -- 보고서 "수신 메일주소"
- 확인 - gmail로 테스트 메일을 보낸 뒤 "원본 보기"를 하여 SPF/DKIM/DMARC 인증 결과를 확인할 수 있습니다.
6-4. 보안연결 - SSL인증서
- 인증서 발급 - 메일 서버의 도메인에 대해 인증서를 발급받습니다.
제 경우 4-1.도메인설정에서 smtp.테스트.net 과 smtp.테스트.co.kr 을 메일서버의 도메인으로 지정하였으므로 이 도메인들에 대해 win-acme으로 lestencrypt 인증서를 발급받겠습니다.
①wacs.exe를 관리자 권한으로 실행합니다. Manual input으로 도메인을 입력하고, self-hosting 인증방식으로 지정합니다.
② hMailServer에서 사용하기 위해 pem파일로 인증서를 저장하고, 적당한 저장경로를 지정합니다.
③ 이전 글에서 작업스케줄러 갱신예약작업을 미리 등록하였기에 여기서 교체하지는 않습니다.
- hMailServer에 인증서 등록
① 설정 > 고급 > "SSL 인증서" 에서 위에서 저장한 pem파일을 지정합니다.
인증서 파일 - [인증서이름]-chain.pem
개인 키 파일 - [인증서이름]-key.pem
② 설정 > 고급 > "TIP/IP 포트" 에서 기본포트(25)를 제외한 나머지 연결(465,587,993)은 모두 SSL 인증서를 사용한 보안연결로 추가해 줍니다. (110,143 등 보안연결을 사용하지 않는 포트는 삭제합니다)
- 465 - SSL/TLS
- 587 - STARTTLS (Required)
- 993 - SSL/TLS
- 게이트웨이에서 포트포워딩, Windows 방화벽에서 해당 포트개방을 확인합니다. (25,465,587,993)
- 테스트 메일을 송신/수신한 뒤 hMailServer log파일에서 "SMTPC" 또는 "TCPIP" 행에서 보안연결이 잘 되고 있는지 확인할 수 있습니다.
6-5. 보안연결 설정 후 메일앱 접속 설정
- 받는 전자 메일 서버 - 993포트를 사용합니다.
- SSL 필요에 체크합니다.