개인 메일서버 구축하기

2024년 1월 14일 일요일
9분 소요
0회

github에 내 개인 도메인 이메일을 등록하고 싶어서 처음에 시작하게 되었다.

개인 메일 사용하기

메일서버 구축

메일서버를 구축하기 위해 사람들이 많이 이용하는 docker-mailserver + docker-compose를 이용했다. 먼저 해당 레포에 있는 compose.yml을 참조해서 사용한다. 그리고 mailserver.envsetup.sh를 다운받는다.

shellscript

1

2

3

4

curl -o setup.sh https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/setup.sh
curl -o mailserver.env https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.env
# setup 스크립트 실행권한 변경
chmod a+x ./setup.sh

setup.sh를 다운받은 후 아래 명령어를 실행해 사용자를 추가한다. 추후 메일 클라이언트에서 해당 계정으로 로그인하게 된다.

shellscript

1

./setup.sh email add {id}@{example.com} {pw}

필수는 아니지만 DKIM설정도 해준다. 보안 관련된 문제로 도메인 소유자가 메일을 보냈다는 걸 증명하게 해주는 내용으로, 뒷 내용인 DNS 설정까지 완료해야 완벽하게 적용된다.

shellscript

1

./setup.sh config dkim domain 'hopoduck.com'

mailserver.env에서는 원하는 내용을 수정한다. 본인은 아래 내용정도만 수정했다. SSL설정은 필수는 아니나 실제로 외부에 메일을 보내려면 인증이 거의 필수(설정하지 않으면 스팸으로 차단될 확률이 높다)다. 본인은 이미 사용중인 와일드카드 인증서가 있어서 그걸 적용했다.

mailserver.env

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# 도메인 설정
OVERRIDE_HOSTNAME=hopoduck.com
TZ=Asia/Seoul
# SSL 설정
# empty => SSL disabled
# letsencrypt => Enables Let's Encrypt certificates
# custom => Enables custom certificates
# manual => Let's you manually specify locations of your SSL certificates for non-standard cases
# self-signed => Enables self-signed certificates
SSL_TYPE=manual
SSL_CERT_PATH=/etc/pem/fullchain.pem
SSL_KEY_PATH=/etc/pem/privkey.pem
# 스팸필터 설정
ENABLE_SPAMASSASSIN=1

아래 내용은 docker-compose.yml설정이다.

docker-compose.yml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

services:
  mailserver:
    image: ghcr.io/docker-mailserver/docker-mailserver:latest
    container_name: mailserver
    hostname: example.com # 해당 부분을 도메인으로 변경해야 한다.
    env_file: mailserver/mailserver.env
    ports:
      - "25:25" # SMTP  (explicit TLS => STARTTLS, Authentication is DISABLED => use port 465/587 instead)
      - "143:143" # IMAP4 (explicit TLS => STARTTLS)
      - "465:465" # ESMTP (implicit TLS)
      - "587:587" # ESMTP (explicit TLS => STARTTLS)
      - "993:993" # IMAP4 (implicit TLS)
    volumes:
      - ./mailserver/docker-data/dms/mail-data/:/var/mail/
      - ./mailserver/docker-data/dms/mail-state/:/var/mail-state/
      - ./mailserver/docker-data/dms/mail-logs/:/var/log/mail/
      - ./mailserver/docker-data/dms/config/:/tmp/docker-mailserver/
      - ./tls/certbot/live/npm-2/fullchain.pem:/etc/pem/fullchain.pem:ro # 인증서 파일, SSL_TYPE이 manual이 아니면 필요없음
      - ./tls/certbot/live/npm-2/privkey.pem:/etc/pem/privkey.pem:ro # 인증서 파일, SSL_TYPE이 manual이 아니면 필요없음
      - /etc/localtime:/etc/localtime:ro
    restart: always
    stop_grace_period: 1m
    healthcheck:
      test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
      timeout: 3s
      retries: 0

웹 메일 클라이언트

웹 메일 클라이언트도 여러 종류가 있지만 봤을때 제일 괜찮아보였던 roundcube를 사용했다. 이쪽은 큰 설정없이 잘 작동했다.

docker-compose.yml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

services:
  roundcubemail:
    image: roundcube/roundcubemail:latest
    container_name: roundcubemail
    restart: unless-stopped
    volumes:
      - ./roundcube/www:/var/www/html
      - ./roundcube/db/sqlite:/var/roundcube/db
      - ./roundcube/tmp:/tmp/roundcube-temp
    ports:
      - 6000:80 # 앞쪽 포트는 변경 가능
    environment:
      - ROUNDCUBEMAIL_DB_TYPE=sqlite
      - ROUNDCUBEMAIL_SKIN=elastic # 스킨 디자인은 roundcube.net 홈페이지에서 확인할 수 있다.
      - ROUNDCUBEMAIL_DEFAULT_HOST=tls://hopoduck.com # 도메인 주소 입력
      - ROUNDCUBEMAIL_SMTP_SERVER=tls://hopoduck.com # 도메인 주소 입력

DNS 설정

본인은 cloudflare에서 도메인을 구입 및 dns설정을 해서 cloudflare기준으로 설명 내용이 있으니 참고바란다. 도메인은 전체 주소(example.com과 같이)를 입력하면 된다. SPF, DKIM모두 메일 서버 인증에 관련된 것으로 메일을 보낸 이메일과 도메인이 같다는 것을 증명하기 위해 사용되며, 설정하지 않으면 스팸으로 차단될 확률이 높다고 한다. DMARC

  • MX레코드를 설정한다.
    • 이름란에 @, 메일 서버란에 @ 입력한다. 우선순위는 마음대로 입력하고 저장한다. (본인은 40으로 설정함)
  • SPF 설정을 추가한다.
    • 유형은 TXT, 이름란에 @, 콘텐츠 란에 v=spf1 ip4:{ip주소} include:{도메인} ~all입력하고 저장한다.
  • DKIM 설정을 추가한다.
    • 유형은 TXT, 이름란에 mail._domainkey.{도메인}을 입력한다.
    • 콘텐츠는 아까 메일서버 구축할 때 DKIM설정할 때 생성된 파일이 있는데 그곳에서 내용을 복사해서 붙여넣는다. - 파일은 ./docker-data/dms/config/opendkim/keys/{도메인}경로에 mail.txt에 있는 내용으로 괄호 안에 있는 내용을 전부 복사하되 ""(쌍따옴표)는 지우고 붙여넣은 뒤 저장한다.
  • DMARC 설정을 추가한다.
    • cloudflare에서 클릭 한번으로 추가할 수 있게 자동화 되어있다.

오류: do not list domain {도메인} in BOTH mydestination and virtual_mailbox_domains

설정 후 실행하는데 위와 같은 오류가 발생해서 찾아보니 docker-mailserver에 있는 postfix의 설정이 문제라고 해서 컨테이너 내부의 /etc/postfix/main.cf내용을 수정해야 했다. mydestination항목에서 $myhostname내용을 지웠다.

main.cf

1

2

3

4

# 이전 내용
mydestination = $myhostname, localhost.$mydomain, localhost
# 변경 후 내용
mydestination = localhost.$mydomain, localhost

오라클 인스턴스 문제 (25번 포트 차단)

원래는 이렇게 설정했을 때 문제가 없어야 하지만 테스트 해보니 내부는 메일 송/수신이 문제가 없었고, 외부에서는 수신만 되는 문제가 있었다. 알아보니 오라클 인스턴스는 스팸 메일 문제때문에 기본적으로 25번 포트 아웃바운드가 차단되어있다고(+추가자료) 해서 메일을 보낼 수 없었다. 다만 오라클 서포트에 문의를 하면 풀어준다고 해서 또 회원가입을 하고(OCI 계정과는 별개다) Service Request 요청을 보내게 되었다. 문의는 생각보다 금방 처리되서 이틀만에 25번 포트를 열어줬고, 메일을 보내는데 성공했다.

완료 테스트

모두 설정 완료 후 웹메일 클라이언트에 접속했고 테스트를 위해 https://www.appmaildev.com/ko/spf 사이트에 접속해 테스트 메일을 보내봤다.

send-mail-test

PTR은 찾아보니 도메인이 아닌 IP로 도메인을 확인하는 것으로 리버스 도메인이라고도 한다는데, 개인 설정이 아닌 ISP(SKT, KT, LG U+)에 문의하여 등록해야 하고, 특정 ISP는 사업자만 신청할 수 있는 등 제약이 있어서 설정하지 못했다.

send-mail-naversend-mail-google

이렇게 네이버, 구글에 메일 보내기를 성공했다!


Loading reactions

© 2024 Hopoduck. All rights reserved.