개인 메일서버 구축하기
github에 내 개인 도메인 이메일을 등록하고 싶어서 처음에 시작하게 되었다.
개인 메일 사용하기
메일서버 구축
메일서버를 구축하기 위해 사람들이 많이 이용하는 docker-mailserver + docker-compose
를 이용했다. 먼저 해당 레포에 있는 compose.yml
을 참조해서 사용한다. 그리고 mailserver.env
와 setup.sh
를 다운받는다.
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
를 다운받은 후 아래 명령어를 실행해 사용자를 추가한다. 추후 메일 클라이언트에서 해당 계정으로 로그인하게 된다.
1
./setup.sh email add {id}@{example.com} {pw}
필수는 아니지만 DKIM설정도 해준다. 보안 관련된 문제로 도메인 소유자가 메일을 보냈다는 걸 증명하게 해주는 내용으로, 뒷 내용인 DNS 설정
까지 완료해야 완벽하게 적용된다.
1
./setup.sh config dkim domain 'hopoduck.com'
mailserver.env
에서는 원하는 내용을 수정한다. 본인은 아래 내용정도만 수정했다. SSL설정은 필수는 아니나 실제로 외부에 메일을 보내려면 인증이 거의 필수(설정하지 않으면 스팸으로 차단될 확률이 높다)다. 본인은 이미 사용중인 와일드카드 인증서가 있어서 그걸 적용했다.
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
설정이다.
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를 사용했다. 이쪽은 큰 설정없이 잘 작동했다.
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
내용을 지웠다.
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 사이트에 접속해 테스트 메일을 보내봤다.
PTR
은 찾아보니 도메인이 아닌 IP로 도메인을 확인하는 것으로 리버스 도메인
이라고도 한다는데, 개인 설정이 아닌 ISP(SKT, KT, LG U+)에 문의하여 등록해야 하고, 특정 ISP는 사업자만 신청할 수 있는 등 제약이 있어서 설정하지 못했다.
이렇게 네이버, 구글에 메일 보내기를 성공했다!