[HomeLab] 홈 서버에 엔터프라이즈급 메일 서버 구축하기 (Postfix + Gmail Relay)

[HomeLab] 홈 서버에 엔터프라이즈급 메일 서버 구축하기 (Postfix + Gmail Relay)

요약 (Abstract) Beelink 미니 PC와 VMware Workstation을 활용한 홈랩(Home Lab) 환경에서, ISP의 포트 차단을 우회하여 안정적인 메일 서버를 구축한 과정을 기록합니다. RHEL 9 호환 OS인 Rocky Linux 9 위에 Postfix와 Dovecot을 구성하고, Gmail SMTP Relay를 연동하여 네이버, 다음, 아웃룩 등 주요 포털로 스팸 분류 없이 메일을 발송하는 데 성공했습니다.

1. 시작하며: 왜 하필 메일 서버인가?

17년 차 인프라 엔지니어로서 수많은 엔터프라이즈 시스템을 구축해왔지만, **"내 집에서 돌아가는 온전한 리눅스 서버"**를 갖는 것은 언제나 로망이자 새로운 기술을 테스트하기 위한 전초기지입니다.

최근 쿠버네티스(K8s)와 DevOps 환경으로의 전환을 준비하며 홈랩(Home Lab)을 재정비하던 중, 가장 기본적이면서도 네트워크/보안/DNS 지식이 총망라된 **메일 서버(Mail Server)**를 직접 구축해보기로 결심했습니다. 단순히 메일을 보내는 것을 넘어, 가정용 유동 IP와 포트 차단(Port 25 block) 환경을 어떻게 극복했는지 기술적으로 공유하고자 합니다.


2. 인프라 아키텍처 (Infrastructure Architecture)

2.1. 하드웨어 및 기반 환경

서버는 공간 효율성과 전성비를 고려하여 고성능 미니 PC를 선택했습니다.

  • Server: Beelink SER8 (Ryzen 7 8745HS, 8C/16T)
  • Memory: 64GB DDR5 (넉넉한 VM/Container 수용량 확보)
  • Virtualization: VMware Workstation 17 Pro
  • OS: Windows 11 Pro (Host) / Rocky Linux 9.4 (Guest VM)

2.2. 논리 아키텍처

가정용 인터넷(ISP)은 스팸 방지를 위해 메일 발송 포트인 TCP 25번을 원천 차단합니다. 이를 우회하기 위해 Gmail SMTP Relay를 스마트 호스트(Smart Host)로 활용하는 아키텍처를 설계했습니다.

코드 스니펫

graph LR
    User[Client (Outlook/Mobile)] -- IMAP/SMTP (587) --> Router((Home Router))
    Router -- Port Forwarding --> VM[Mail Server VM]
    
    subgraph "Home Lab (Rocky Linux 9)"
        VM --> Postfix[Postfix (MTA)]
        VM --> Dovecot[Dovecot (MDA)]
    end
    
    Postfix -- "Relay (Port 587)" --> Gmail[Gmail SMTP Server]
    Gmail -- "Delivery" --> Internet[Target (Naver, Daum, etc.)]

3. 핵심 구축 과정 (Configuration)

3.1. 베이스 시스템 구성

CentOS의 후계자인 Rocky Linux 9을 최소 설치(Minimal Install)로 VM에 구성했습니다. 메일 서버는 리소스 소모가 적어 2 vCPU, 4GB RAM으로도 차고 넘치는 성능을 보여줍니다.

3.2. Postfix 설정 (main.cf)

가장 중요한 설정 파일인 /etc/postfix/main.cf의 핵심 설정입니다. Gmail Relay를 태우기 위한 SASL 인증과 TLS 설정이 필수적입니다.

Bash

# /etc/postfix/main.cf 핵심 발췌

# 1. 기본 도메인 및 네트워크 설정
myhostname = mail.kagent.kr
mydomain = kagent.kr
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all

# 2. 메일 저장소 (Maildir 방식 사용)
home_mailbox = Maildir/

# 3. Gmail Relay 설정 (핵심)
relayhost = [smtp.gmail.com]:587

# 4. SASL 인증 및 TLS 보안 설정
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes
smtp_tls_security_level = encrypt
Tip: Gmail 앱 비밀번호(App Password)를 발급받아 /etc/postfix/sasl_passwd에 등록하고 postmap 명령어로 해시 DB를 만들어줘야 합니다.

4. 트러블슈팅 (Troubleshooting)

구축 과정에서 겪었던 주요 이슈와 해결 방법을 정리합니다.

4.1. IPv6 "Network is unreachable" 오류

로그(tail -f /var/log/maillog) 확인 중 Gmail 서버로 접속 시 IPv6 주소로 시도하다 실패하는 현상이 발견되었습니다.

코드 스니펫

connect to smtp.gmail.com[2404:6800...]:587: Network is unreachable

분석: 가정용 네트워크가 IPv6를 완벽히 지원하지 않아 발생한 현상입니다. 해결: Postfix는 똑똑하게도 IPv6 실패 후 즉시 IPv4로 재접속하여 성공(status=sent)시켰으므로, 서비스에는 영향이 없는 경고성 로그임을 확인했습니다. (inet_protocols = ipv4로 강제하여 로그를 깔끔하게 만들 수도 있습니다.)

4.2. Daum/Kakao 메일 수신 불가 (SPF 레코드 이슈)

Gmail, Naver는 수신이 잘 되는데 유독 Daum(Kakao)에서만 메일이 증발하는 현상이 발생했습니다.

원인: SPF 레코드가 v=spf1 ip4:58.120.xx.xx -all로 설정되어 있었습니다. 즉, "내 집 IP가 아니면 다 차단해!"라고 선언해놓고, 정작 메일은 **Google 서버(Relay)**가 배달하니 Daum 서버가 "사칭 메일"로 판단하여 드랍(Drop)시킨 것입니다.

해결: 가비아 DNS 설정에서 SPF 레코드를 수정하여 Google을 발송자로 인정해 주었습니다.

Plaintext

# 변경 전 (Hard Fail)
v=spf1 ip4:58.120.30.110 -all

# 변경 후 (Google Include + Soft Fail)
v=spf1 ip4:58.120.30.110 include:_spf.google.com ~all

DNS 전파 후 Daum에서도 정상적으로 메일이 수신됨을 확인했습니다.


5. 결과 및 향후 계획

5.1. 최종 테스트 결과

  • 발송: Outlook, Mobile에서 admin@kagent.kr 계정으로 메일 발송 성공.
  • 수신: Naver, Gmail, Outlook, Daum 모두 **"받은 편지함"**에 정상 도착 (스팸함 X).
  • 보안: SSL/TLS 암호화 통신 적용 완료.

5.2. 마치며

이로써 kagent.kr 도메인을 가진 나만의 메일 서버가 완성되었습니다. 단순한 구축을 넘어, SMTP 프로토콜의 흐름과 DNS(SPF/DKIM)의 중요성을 다시 한번 체감하는 계기가 되었습니다.

다음 포스팅에서는 이 홈랩 환경 위에 **Docker 기반의 기술 블로그(Ghost)**를 구축하고, Nginx Proxy Manager를 통해 SSL을 적용한 과정을 다뤄보겠습니다.