Ubuntu24.04에서 Postfix,OpenDKIM,Dovecot 연동
목차
Linux와 Ai #
그동안 Ai를 이용해 vmware에 우분투2404를 설치하고 1개서버에 8개도메인 가상계정 세팅을 완료하고 Outlook,Thunderbird,Nine mail,roundcube에서 구글,마소,네이버 모두 dkim,spf,dmarc=pass, ptr=ok, Let’s Encrypt인증서90일 자동갱신 까지 완료하고, 보안은 ssh key로그인(패스워드 필요) 패스워드 로그인 차단, root로그인 차단 fail2ban설치 후 jail세팅 완료. 그리고 hugo로 블로그세팅 운영 까지 ai의 도움을 받았습니다. 그동안 느낀 점은 ai는 신기술 구기술을 망라한 모든 답을 나열한다는 것입니다. 결국 사용자가 원하는 답을 얻기 위해서는 나의 환경을 ai에게 인지시키고 문맥을 유지시키고 질문의 범위를 최대한 좁혀야 원하는 답을 얻을 수 있다는 것입니다. ChatGPT와 Gemini(둘다 무료버전 사용) 둘을 상호검증 해가며 진행 했습니다. 중급 이상의 엔지니어들은 보다 쉽게 ai로부터 답을 얻을 수 있겠죠. 제 글은 초보자가 ai와 무한 루프에 빠지는 것을 조금이나마 피할 수 있기를 바라는 마음으로 작성한 것입니다. 초보자 분들께 많은 도움이 되길 바랍니다.
함께 보면 좋은 글
도메인 등록/DNS/네트워크 기초부터 차근차근 보고 싶으시다면 초보자를 위한 자체 메일서버 구축 기초 지식을 먼저 보시는 걸 추천합니다. 이 글은 그 이후 단계, 즉 postfix/dovecot이 설치된 서버에 DKIM/SPF/DMARC를 실제로 붙이는 과정을 다룹니다.
여러 도메인을 한 서버에서 같이 운영하고 싶으시면, 이 글 다음으로 Multi-Domain 글로 이어집니다.
Mail-tester 10점을 위한 조건 #
- SPF 통과
- DKIM 통과
- DMARC 적용
- PTR 설정 완료
- HELO = PTR 동일
- TLS 적용
- 서버 IP 블랙리스트 제거
Ubuntu24.04, Postfix, OpenDKIM, Dovecot #
Ubuntu 24.04는 보안 정책이 강화되면서 Postfix, OpenDKIM 소켓 권한 문제가 자주 발생합니다. 이 가이드는 다음을 목표로 합니다.
- DKIM 정상 서명
- Mail-tester 10점
- Gmail / Outlook 정상 수신
- SPF / DMARC 완전 적용
- PTR + HELO 일치
- Dovecot SASL 인증
- TLS 보안 강화
패키지 설치 #
sudo apt update
sudo apt install postfix dovecot-core dovecot-imapd opendkim opendkim-tools -y
OpenDKIM 권한 및 소켓 설정 (Ubuntu 24.04 핵심) #
Postfix의 milter(메일 검사 플러그인) 연결 설정에서 unix: 뒤에
슬래시(/) 없는 상대경로를 쓰면, Postfix는 이걸 항상 큐
디렉터리(/var/spool/postfix) 기준 상대경로로 해석합니다. 그래서
opendkim 소켓도 이 경로 아래에 만들어야 Postfix가 정상적으로
찾습니다.
sudo mkdir -p /var/spool/postfix/opendkim
sudo mkdir -p /etc/opendkim/keys
sudo gpasswd -a postfix opendkim
sudo chown -R opendkim:postfix /var/spool/postfix/opendkim
sudo chmod 750 /var/spool/postfix/opendkim
이 단계를 안 하면 Permission denied가 발생합니다.
OpenDKIM 설정 #
sudo nano /etc/opendkim.conf
아래 내용 추가/수정:
Syslog yes
UMask 002
UserID opendkim
Socket local:/var/spool/postfix/opendkim/opendkim.sock
Canonicalization relaxed/simple
Mode sv
SubDomains no
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
ExternalIgnoreList refile:/etc/opendkim/trusted.hosts
InternalHosts refile:/etc/opendkim/trusted.hosts
Mode sv는 서명(s)과 검증(v)을 동시에 켜는 값입니다. 서명만
필요하면 s만 둬도 되지만, 수신 메일의 DKIM 검증까지 이 서버가
직접 하게 하려면 sv로 둬야 합니다.
DKIM 키 생성(example.com) #
sudo opendkim-genkey -b 2048 -d example.com -s mail -D /etc/opendkim/keys/
sudo chown -R opendkim:opendkim /etc/opendkim/keys
sudo chmod 700 /etc/opendkim/keys
sudo chmod 600 /etc/opendkim/keys/mail.private
테이블 등록 #
KeyTable
echo "mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/mail.private" | sudo tee /etc/opendkim/key.table
SigningTable
echo "*@example.com mail._domainkey.example.com" | sudo tee /etc/opendkim/signing.table
TrustedHosts
echo -e "127.0.0.1\nlocalhost\nexample.com" | sudo tee /etc/opendkim/trusted.hosts
Postfix 필수 설정 #
sudo postconf -e "myhostname = mail.example.com"
sudo postconf -e "smtp_helo_name = mail.example.com"
sudo postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem"
sudo postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/example.com/privkey.pem"
sudo postconf -e "smtpd_sasl_auth_enable = yes"
sudo postconf -e "smtpd_sasl_type = dovecot"
sudo postconf -e "smtpd_sasl_path = private/auth"
sudo postconf -e "smtpd_sasl_security_options = noanonymous"
sudo postconf -e "smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination"
sudo postconf -e "disable_vrfy_command = yes"
sudo postconf -e "smtpd_helo_required = yes"
sudo postconf -e "milter_protocol = 6"
sudo postconf -e "milter_default_action = accept"
sudo postconf -e "smtpd_milters = unix:opendkim/opendkim.sock"
sudo postconf -e "non_smtpd_milters = unix:opendkim/opendkim.sock"
milter_default_action = accept는 opendkim이 갑자기 죽었을 때
메일을 막지 않고 그냥 통과시키겠다는 뜻입니다. “검증 없이도 메일은
계속 받는 게 우선"이라는 선택이고, 반대로 “검증 안 되면 차라리
지연시키는 게 낫다"는 판단이면 이 줄을 빼고 기본값(tempfail)을
쓰시면 됩니다.
Dovecot SASL 소켓 설정 #
파일 수정:
sudo nano /etc/dovecot/conf.d/10-master.conf
아래 부분 확인/수정:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
재시작:
sudo systemctl restart dovecot
SPF / DKIM / DMARC DNS 설정 (10점 필수) #
SPF (TXT)
v=spf1 mx ip4:서버IP -all
DKIM
sudo cat /etc/opendkim/keys/mail.txt
mail.txt 파일에 생성된 공개키를 “v=” 부터 끝까지 복사해서
메모장에 옮긴 후, 줄 바꿈을 끄고 p= 뒤에 있는 "와 공백을
제거하고 DNS TXT 레코드에 그대로 추가합니다. (복붙 과정에서 노이즈
문자가 섞이기 쉬우니, 붙여넣은 뒤 맨 끝/맨 앞에서 delete·backspace를
한 번씩 눌러 혹시 모를 여분 문자를 제거해두면 안전합니다.)
mail._domainkey.example.com
값 = 공개키
DMARC (TXT 레코드) 추가
_dmarc.example.com
값 = v=DMARC1; p=quarantine; adkim=s; aspf=s; rua=mailto:postmaster@example.com;
처음 메일서버를 구축하시는 분이라면: 위 예시는 이미 SPF/DKIM이 안정적으로 통과하는 걸 확인한 뒤의 값입니다. 새로 시작하시는 거라면
p=quarantine으로 바로 가지 말고, 먼저p=none(격리/거부 없이 통과, 결과만 리포트로 수집)으로 며칠 지켜본 뒤 문제없으면quarantine→reject순으로 단계적으로 올리는 걸 권장합니다.p=none상태로 두면 이 조건에서 10점이 잘 안 나올 수 있으니, 점수 확인은 안정화된 뒤에 하시면 됩니다.
PTR (Reverse DNS) 설정 #
PTR은 고정IP인 경우에만 해당됩니다. 유동IP인 경우 A 레코드만 세팅하시면 됩니다.
DNS 관리자 페이지에서:
- 정방향:
mail.example.com → 서버IP(A 레코드) - 역방향:
서버IP → mail.example.com(PTR, 고정IP 임대업체에 요청)
(Gmail, Outlook이 매우 중요하게 봅니다.)
서비스 재시작:
sudo systemctl restart opendkim
sudo systemctl restart postfix
검증 방법 #
DKIM 확인:
sudo opendkim-testkey -d example.com -s mail -vvv
key OK 확인.
DNS 확인:
dig +short TXT mail._domainkey.example.com
로그 실시간 확인 #
journalctl -u opendkim -f
journalctl -u postfix -f
Ubuntu 24.04에서 가장 많이 발생하는 오류 #
Permission denied (DKIM)
원인:
- postfix가 opendkim 그룹에 없음
- 소켓 경로를 절대경로로 설정
해결:
sudo gpasswd -a postfix opendkim
Socket local:/var/spool/postfix/opendkim/opendkim.sock