소개
mix-space에 답장 메일 구독과 알림 기능을 추가하기 위해, 메일 서버를 직접 구축하기로 했습니다.
인터넷을 이것저것 찾아보니 iRedMail은 기능도 강력하고 사용법도 간단하며, 구축도 그리 복잡하지 않더군요. 바로 진행합니다!
여러분도 구축하려면 다음이 필요합니다:
- VPS 한 대 (가능하면 Reverse DNS를 지원하는 것이 좋습니다).
- 도메인 하나 (당연하죠)
이 글은 Ubuntu 22.04 LTS 기준이며, 도메인으로 xxu.do를 사용합니다. 참고하세요.
본격적인 설치
시스템 준비 및 설치
- 패키지를 업데이트하고 필요한 패키지를 설치합니다:
sudo apt update
sudo apt upgrade
sudo apt install wget curl sudo tar socat bind9-utils -y
- mail.xxu.do를 메일 서버 도메인으로 사용할 계획이므로 VPS 호스트명을 설정합니다:
vim /etc/hosts
127.0.0.1 mail.xxu.do mail # 한 줄 추가: mail.xxu.do는 전체 호스트명(FQDN), mail은 짧은 호스트명
x.x.x.x mail.xxu.do mail # 여기에 공인 IP가 있다면 뒤를 호스트명으로 바꿔도 됨. 저장 후 종료
vim /etc/hostname
mail # 내용을 mail로 변경한 뒤 저장하고 종료
reboot # 재부팅하여 적용
hostname # 실행 후 짧은 호스트명 mail이 보여야 함. 전체 호스트명이 보이면 설정이 잘못된 것
hostname -f # 실행 후 전체 호스트명 mail.xxu.do가 보여야 함. 짧은 호스트명이 보이면 설정이 잘못된 것
- iRedMail을 다운로드하여 설치합니다:
wget https://github.com/iredmail/iRedMail/archive/refs/tags/1.6.8.tar.gz # 2024-04-01 기준 최신 버전은 1.6.8
tar -xf iRedMail.tar.gz
cd iRedMail-1.6.8 && bash iRedMail.sh
이제 그래픽 설치 화면이 나옵니다. 「스페이스바」로 항목을 선택하고 「Enter」로 다음 단계로 이동합니다. 설치를 중단하려면 「Ctrl+C」를 누르면 됩니다.
1. 설치 선택 후 Enter
2. 설치 디렉터리는 기본값을 유지하고 Enter
3. 웹 서버 선택 – nginx에 더 익숙하므로 nginx 선택 후 Enter
4. 데이터베이스 선택 – 두 번째 항목인 MariaDB 선택 후 Enter
5. 데이터베이스 비밀번호 설정 – 반드시 기억
6. 도메인 설정 – hostname과 동일하면 안 됨. 이 글에서는 xxu.do
7. 관리자 비밀번호 설정 – 반드시 기억
8. 이후에는 계속 y를 입력하면 됩니다. 설치가 끝나면 `reboot`으로 시스템을 재시작하여 적용합니다.
도메인 레코드 설정
- 메일 서버 도메인을 VPS에 연결한 뒤, 인증서를 발급받아 설치합니다:
curl https://get.acme.sh | sh; apt install socat -y || yum install socat -y; ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
~/.acme.sh/acme.sh --issue -d mail.xxu.do --standalone -k ec-256 --force --insecure
~/.acme.sh/acme.sh --issue -d mail.xxu.do --webroot /var/www/html
~/.acme.sh/acme.sh --installcert -d mail.xxu.do --key-file /etc/ssl/private/iRedMail.key --fullchain-file /etc/ssl/certs/iRedMail.crt
service postfix reload;service dovecot reload;service nginx reload # 서비스 리로드
- iRedMail 그레이리스트를 비활성화합니다(영향이 무엇인지는 아직 잘 모르겠지만, 튜토리얼대로 진행합니다):
vi /opt/iredapd/settings.py
# 'greylisting'을 삭제합니다. 나머지 형식은 그대로 유지하세요. 또는 해당 줄 전체를 삭제하고 아래 줄로 대체합니다.
plugins = ["reject_null_sender", "wblist_rdns", "reject_sender_login_mismatch", "greylisting", "throttle", "amavisd_wblist", "sql_alias_access_policy"]
PTR 역방향 조회(reverse DNS)를 설정합니다. VPS 관리 콘솔에서 PTR 레코드를 메일 서버 도메인(이 글에서는 mail.xxu.do)으로 지정합니다.
nslookup x.x.x.x(서버 IP)로 확인합니다.레코드를 설정합니다:
vi /root/iRedMail-1.6.8/iRedMail.tips
# 아래 그림과 같은 부분을 찾아 복사한 뒤, 모든 따옴표와 공백을 제거하고 앞뒤를 이어붙입니다.

그러면 아래와 같은 형식의 코드가 나옵니다. dkim._domainkey의 Content에 입력합니다:
v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
| 유형 | 이름 | 내용 |
|---|---|---|
| MX | xxu.do | mail.xxu.do |
| TXT | xxu.do | v=spf1 mx ~all |
| TXT | dkim._domainkey | 위와 같은 형식: v=DKIM1;p=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
| TXT | _dmarc | v=DMARC1; p=none; pct=100; rua=mailto:dmarc@xxu.do |
iRedMail 설정
이제 다음 페이지에 접속할 수 있습니다:
https://mail.xxu.do/mail —— 메일 로그인 주소
https://mail.xxu.do/netdata —— 서버 상태 모니터링
https://mail.xxu.do/iredadmin —— 메일 서버 관리자 페이지
계정: postmaster@내 도메인, 이 글에서는 postmaster@xxu.do
비밀번호: 설치 시 설정한 비밀번호
위 정보는 /root/iRedMail-1.6.8/iRedMail.tips 파일에서 확인할 수 있습니다.
사용자를 추가하려면 메일 서버 관리자 페이지에 로그인한 뒤, 아래 그림과 같은 위치에서 추가합니다.

사용자 추가
메일 서버 테스트
mail-tester
- https://www.mail-tester.com에 접속해 테스트용 이메일 주소를 받습니다.
- 관리자 계정(postmaster@xxu.do)으로 메일함에 로그인한 뒤, 시스템이 보낸 세 통의 메일 중 하나를 골라 테스트용 이메일 주소로 보냅니다.
- https://www.mail-tester.com으로 돌아가 테스트를 클릭합니다.
예상대로 10점 만점을 받았습니다.
Gmail 테스트
내 Gmail 주소로 메일을 보내 보았는데 스팸 폴더로 들어갔습니다. 「스팸 아님」으로 직접 표시한 뒤에는 다른 사람에게 보낸 메일도 정상적으로 수신되었습니다.
메일 클라이언트 지원
| 프로토콜 | 주소 | 포트/암호화 포트 |
|---|---|---|
| IMAP | xxu.do | 143,993 |
| POP3 | xxu.do | 110,995 |
| SMTP | xxu.do | 25(포트 개방 필요),587 |
마무리
iRedMail을 설치한 뒤 다른 서비스를 배포할 수 없는 문제가 있었습니다. 원인을 찾아보니 nftables가 기본 설치되어 있어서였던 것 같습니다. vi etc/nftables.conf 로 규칙을 수정한 후 systemctl restart nftables로 서비스를 재시작하니 해결되었습니다.