홈페이지 제작할땐!

비버팩토리

it 인프라 노트/우분투

postfix + opendkim + Dovecot 설치하기

윤비버 2025. 6. 20. 13:34
728x90

 

Postfix는 이메일 전송을 담당하는 오픈 소스 메일 전송 에이전트(MTA)입니다. Wietse Venema가 IBM 연구소에서 처음 개발했으며, Sendmail의 대안으로 설계되었습니다. Postfix는 빠르고, 관리하기 쉽고, 안전하며, 유닉스 계열 시스템에서 널리 사용됩니다. 

 

설치하는데 도움의 손길 선생님은 챗지피티 무료 버전으로도 가능합니다.

 

시스템 준비 하기 

sudo apt update && sudo apt upgrade
sudo hostnamectl set-hostname mail.yourdomain.com

 

자체 도메인이 필요합니다. 저는 support.beaverfactory.kr 으로 설정 했습니다. 

 

/etc/hosts 파일에 아래 내용 추가:

127.0.0.1 mail.yourdomain.com mail

 

📬 2단계: Postfix 설치 및 설정

sudo apt install postfix

 

기본 설정 확인:

sudo postconf -n

 

대표 설정 파일 /etc/postfix/main.cf 예시:

myhostname = mail.yourdomain.com
mydomain = yourdomain.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/

 

이라고 하는데 제가 설정한것은 아래 내용 그대로 따라하면됩니다.

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6

# TLS parameters
smtpd_tls_cert_file = /etc/letsencrypt/live/support.beaverfactory.kr/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/support.beaverfactory.kr/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_CApath = /etc/ssl/certs

# 인증 관련
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_tls_auth_only = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_unauth_destination


# 별칭 설정
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# 기본 정보
myhostname = support.beaverfactory.kr
mydomain = beaverfactory.kr

myorigin = support.beaverfactory.kr
mydestination = $myhostname, localhost.localdomain, localhost
relayhost =

# 네트워크 허용 범위 (로컬만 허용)
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

# 메일박스 제한
mailbox_size_limit = 0
recipient_delimiter = +


# 포트 바인딩 및 프로토콜
inet_interfaces = all
inet_protocols = all

smtputf8_enable = no
smtp_generic_maps = hash:/etc/postfix/generic
sender_canonical_maps = hash:/etc/postfix/sender_canonical

smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
milter_default_action = accept


virtual_alias_domains = beaverfactory.kr

 

여기 내용 그대로 따라하면되는데 설정은 지피티가 대답한 대로 따라한겁니다.

ssl은 필요하다고 해서 nginx로 세팅 미리 해놨습니다. 이 부분은 넘어가겠습니다. (지피티나 ai 한테 물어보면 금방 설치 가능합니다.)

 

변경 후 재시작:

sudo systemctl restart postfix

 

여기까지는 되든 안되든 그대로 단계를 넘어가야됩니다.

 

 

📨 3단계: Dovecot 설치 (메일 수신용)

sudo apt install dovecot-core dovecot-imapd

 

설정 변경:

/etc/dovecot/conf.d/10-mail.conf:

mail_location = maildir:~/Maildir

 

vi 편집기든 nana 편집기든 열어서 위치 따라 수정하면됩니다.

 

/etc/dovecot/conf.d/10-auth.conf:

disable_plaintext_auth = no
auth_mechanisms = plain login

 

/etc/dovecot/conf.d/10-master.conf에서 service imap-login 아래에:

inet_listener imap {
  port = 143
}

 

서비스 재시작:

sudo systemctl restart dovecot

 

 

🧪 4단계: 테스트

새 사용자 추가:

sudo adduser testuser

 

저는 서포트로 했는데 문제가 생겨서... 이럴땐 아래 명령어 대로

 

계정 삭제:

sudo userdel support # 사용자 계정만 삭제

 

또는 (홈 디렉터리와 메일 스풀까지 함께 삭제)

sudo userdel -r support # 경고: 데이터 삭제! 반드시 백업!

 

계정 재생성: 삭제가 완료된 후 다시 support 계정을 생성합니다.

sudo useradd support # 또는 sudo adduser support (배포판에 따라 다름)
sudo passwd support # 비밀번호 설정

 

메일 전송 테스트:

echo "Hello Mail" | mail -s "Test Email" testuser@yourdomain.com

 

메일 디렉터리 확인:

ls /home/testuser/Maildir/

 

웹 메일은 다음에 설치때 포스팅 남기도록 하겠습니다. 내용이 너무 길어서... 

 

 

✅ 5. SSL 인증서 (Let's Encrypt 사용 예시)

 

ssl은 너무 길어서 이것도 패스

 

✅ 6. 보안 (필수)

포트: 25 (SMTP), 143 (IMAP), 587 (SMTP Submission), 993 (IMAPS), 465 (SMTPS)

ufw 방화벽 설정:

sudo ufw allow 22
sudo ufw allow 25
sudo ufw allow 143
sudo ufw allow 587
sudo ufw allow 993
sudo ufw enable

 

방화벽은 외부로부터 25는 일단 열어놨는데 메일 발송이 되야해서 이것부터 문제 해결 후에 다시 차례대로 하면됩니다.

 

 

🔐 보안 강화 도구 (선택)

  • SpamAssassin – 스팸 필터링
  • ClamAV – 바이러스 스캔
  • Fail2Ban – 브루트포스 방어

📝 추가로 필요한 경우

  • DKIM, SPF, DMARC 설정법
  • 여러 사용자 계정 관리 방법 (ex. Virtual users)
  • 메일 큐 확인 / 로그 디버깅 등

✅ 원하시면:

  • 스팸 방지 세팅
  • DKIM 키 생성과 설정
  • 웹메일 접속 세팅
  • 가상 사용자(virtual mailbox) 구성
    등도 단계별로 알려드릴게요. 필요하신 항목 말씀 주세요.

 

하는 도중에 우분투 특유한곳에서 나는 패키지 에러 문제가 있습니다.

여기서 mysql 서버가 자꾸 걸리는 바람에... 뭣 모르고 삭제해서 재설치했는데 

디비 백업을 안해놔서 몇개가 날라갔습니다. 주의 하세요 ㅠㅠ

 

🔄 Postfix 재시작

sudo systemctl restart postfix
sudo systemctl enable postfix

 

 

🧪 포트 확인

  • 포트 25, 587, 465 열려 있어야 합니다:
sudo ss -tuln | grep -E ':25|:587|:465'

 

 

이번에는 dns 관리에서 설정이 필요합니다.

저는 스마일서브에서 사용되어서 설정을 해놓으면됩니다.

 

유형 이름 값

TXT support.beaverfactory.kr v=spf1 ip4:아이피주소 a mx ~all

 

 

✅ 1. Postfix 상태 확인

 

sudo systemctl status postfix

 

active (running) 상태여야 정상입니다.

 

✅ 2. 로컬 테스트: mail 명령어로 메일 보내기

설치 (필요시):

sudo apt install mailutils

 

테스트 메일 발송:

echo "이것은 Postfix 테스트입니다." | mail -s "Postfix 테스트 메일" your_email@example.com

 

 

  • 위 your_email@example.com은 외부 이메일 주소 (예: Gmail) 로 입력해도 됩니다.
  • 이때 메일이 도착하면 Postfix → 외부 메일 전송이 정상입니다.

✅ 3. 로그 확인으로 상태 점검

Postfix는 로그를 /var/log/mail.log 또는 /var/log/syslog 에 남깁니다.

tail -f /var/log/mail.log

 

 

메일 전송 시도, 성공, 실패 사유를 실시간으로 확인할 수 있습니다.

 

여기서 계속 에러나거나 실패할 경우 챗지피티 도움이 필요합니다.

 

✅ 4. SMTP 포트 확인 (25, 587 열렸는지)

sudo ss -tulnp | grep postfix

 

또는:

telnet localhost 25

정상 출력 예:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 support.beaverfactory.kr ESMTP Postfix

 

telnet이 안 되면 sudo apt install telnet 으로 설치

 

부가 팁: Gmail 같은 외부에서 수신 안 될 때

DNS에 MX 레코드, SPF, DKIM, PTR 확인 필수

포트 25, 587 서버 방화벽에서 허용 필요

ufw 사용 시 : 

sudo ufw allow 25,587/tcp

 

 

 

로그를 보면 현재 Postfix 메일 서버에서 몇 가지 심각한 오류가 발생 중입니다. 이를 해결하지 않으면 메일 발송/수신 모두 안 됩니다. 아래에 에러 분석해결 방법을 단계별로 안내드립니다.


❌ 주요 문제 요약

  1. 루프백 메일 오류 (mail loops back to myself)
  2. aliases DB 누락 (/etc/aliases.db: No such file or directory)
  3. SASL 인증 실패 (no SASL authentication mechanisms)
  4. Dovecot 연동 실패 (Connect to Dovecot auth socket failed)

✅ 1. 루프백 메일 오류

status=bounced (mail for 아이디-256881 loops back to myself)

🔧 해결법:

Postfix가 해당 도메인을 mydestination에 포함하고 있어서 메일을 내부로 돌리고 있습니다.

sudo nano /etc/postfix/main.cf

아래 설정에서 아이디-256881을 mydestination에서 제거하거나 FQDN 도메인으로 교체하세요:

mydestination = $myhostname, localhost.localdomain, localhost
myhostname = support.beaverfactory.kr

그리고 Postfix 재시작:

sudo systemctl restart postfix

✅ 2. aliases.db 파일 누락

error: open database /etc/aliases.db: No such file or directory

🔧 해결법:

sudo newaliases

이 명령은 /etc/aliases 파일을 기반으로 aliases.db를 생성합니다.


✅ 3. SASL 인증 실패

fatal: no SASL authentication mechanisms

Postfix에서 인증을 위해 Dovecot과 연동하려 하는데, 인증 메커니즘이 설정되지 않았습니다.


✅ 4. Dovecot 소켓 연결 실패

warning: SASL: Connect to Dovecot auth socket 'private/auth' failed

Postfix가 Dovecot 인증을 사용하도록 설정되어 있는데, Dovecot이 실행 중이 아니거나 잘못 설정되어 있음.

🔧 해결법:

1. Dovecot 설치:

sudo apt install dovecot-core dovecot-imapd

2. Dovecot 시작:

sudo systemctl enable dovecot
sudo systemctl start dovecot

3. Postfix에 Dovecot 인증 경로 설정:

/etc/postfix/main.cf에 아래 줄 추가 또는 수정:

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

그리고 Postfix 재시작:

sudo systemctl restart postfix

✉️ 이후 테스트 방법

  1. 메일 발송 테스트:
echo "Test mail from Postfix" | mail -s "Test Email" your_email@example.com
  1. 메일 수신 테스트:
  • DNS MX 레코드가 서버로 설정되어 있어야 함
  • 외부 계정에서 수신 메일 주소로 테스트

💬 원하시면

  • Dovecot 설정 (/etc/dovecot/conf.d/)
  • SPF/DKIM DNS 예시
  • SSL 인증서 연동 (Let's Encrypt + Postfix/Dovecot)

 

 

Dovecot이 시작에 실패한 상황입니다. 원인을 정확히 파악하려면 에러 로그를 확인해야 하지만, 우선 일반적인 문제들과 해결 방법부터 안내드릴게요.


🧭 1단계: Dovecot 서비스 상태 확인

sudo systemctl status dovecot

여기에서 오류 메시지의 핵심 이유가 나옵니다. 예: 설정 에러, 포트 충돌 등.


🧾 2단계: Dovecot 로그 확인

sudo journalctl -xeu dovecot

혹은:

sudo tail -n 50 /var/log/mail.log

실제 에러 메시지 확인이 중요합니다. 가장 흔한 원인은 아래와 같습니다.


🚑 자주 발생하는 에러 원인 및 해결법

❌ 1. 설정 파일 에러

파일 오타, 잘못된 경로, 미존재 디렉토리 등이 많습니다.

sudo dovecot -n

이 명령어는 dovecot.conf에 문법 오류가 있는지 점검해줍니다.

에러 메시지 예시:

Fatal: Error in configuration file /etc/dovecot/conf.d/10-ssl.conf line 12: ssl_cert: No such file or directory

이럴 경우 인증서 경로가 없거나 잘못되었으므로 수정해줘야 합니다.


❌ 2. 인증서 경로 문제 (10-ssl.conf)

sudo nano /etc/dovecot/conf.d/10-ssl.conf

SSL 인증서 경로가 실제 존재하는지 확인:

ssl = yes
ssl_cert = </etc/letsencrypt/live/support.beaverfactory.kr/fullchain.pem
ssl_key = </etc/letsencrypt/live/support.beaverfactory.kr/privkey.pem

파일이 없다면 certbot으로 SSL부터 새로 받아야 합니다.


❌ 3. 포트 충돌 (특히 143, 993, 110, 995)

netstat 또는 ss로 확인:

sudo ss -tuln | grep :143

이미 다른 데몬이 쓰고 있으면 Dovecot이 시작되지 않습니다.


❌ 4. /var/run/dovecot/ 폴더 권한 문제

sudo mkdir -p /var/run/dovecot/
sudo chown dovecot:dovecot /var/run/dovecot

🔁 최종 복구 시도 순서

sudo dovecot -n           # 설정 확인
sudo dovecot -F           # 포그라운드 실행으로 에러 출력 확인
sudo systemctl restart dovecot
sudo journalctl -xeu dovecot

📩 다음 단계?

에러 로그 출력 주시면 원인 정확히 분석해드립니다. 예: ssl_cert 에러인지, auth socket인지.

또한 Postfix와의 연동, SASL 인증 완성도 도와드릴 수 있어요.
필요하시면 Dovecot + Postfix 연동 설정 전체 예제도 제공해드릴게요.

 

 

Postfix에서 발생하는 다음과 같은 에러:

status=bounced (mail for 아이디-256881 loops back to myself)

이건 Postfix가 수신한 메일을 다시 자기 자신에게 보내려다가 무한 루프를 감지해서 메일을 거부한 것입니다. 원인은 mydestination 또는 virtual_alias_domains, virtual_mailbox_domains 등의 설정 문제입니다.


🔍 원인 분석 요약

mydestination에 지정된 도메인은 Postfix가 직접 수신 처리합니다. 그런데:

  • relayhost가 비어 있어서 로컬 처리되는데,
  • mydestination에 아이디-256881이 설정돼 있고,
  • Postfix는 이 호스트에 직접 전달하려고 하다가 루프 발생으로 간주.

✅ 해결 방법

1. /etc/postfix/main.cf 설정 확인 및 수정

# 현재 설정
myorigin = /etc/mailname
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

👉 수정 제안:

myorigin = support.beaverfactory.kr
myhostname = support.beaverfactory.kr
mydestination = localhost, localhost.localdomain

즉, mydestination에서 $myhostname, $mydomain 등을 제거합니다.
mydestination에 메일 목적지가 포함되면, 그건 "내가 처리할 메일"이라고 간주해서 루프가 납니다.


2. 설정 저장 후 Postfix 재시작

sudo postfix reload

3. /etc/mailname도 일치시켜야 함

echo "support.beaverfactory.kr" | sudo tee /etc/mailname

4. 테스트 메일 발송 (예시)

echo "테스트 메일입니다." | mail -s "Postfix 루프 테스트" youremail@domain.com

📌 참고

  • mail for XXX loops back to myself → Postfix가 받은 메일을 다시 mydestination으로 라우팅하려 해서 발생.
  • mydestination은 Postfix가 직접 배달할 도메인만 포함시켜야 함.
  • virtual_alias_domains와 virtual_mailbox_domains를 쓸 경우, 이쪽 설정도 확인 필요.

 

 

이 로그에서 Postfix가 여전히 루프 오류와 SASL 인증 실패로 인해 메일 발송/수신이 되지 않고 있는 상태입니다. 아래에서 문제를 나눠서 정리하고, 정확한 해결 방법을 제시할게요.


🔧 문제 1: loops back to myself

🔍 원인 요약

status=bounced (mail for judith6290-256881 loops back to myself)

Postfix가 root@judith6290-256881에게 메일을 보내려다, 자기 자신에게 보내는 것으로 간주해 루프 오류 발생.

✅ 해결 방법

  1. /etc/postfix/main.cf 열기
sudo nano /etc/postfix/main.cf
  1. 아래 항목 수정 확인 또는 추가:
myhostname = support.beaverfactory.kr
mydestination = localhost

mydestination에서 아이디-256881 이 포함되어 있으면 안 됩니다.
myhostname은 메일 주소 도메인과 일치해야 합니다.

  1. /etc/mailname 도 수정:
echo "support.beaverfactory.kr" | sudo tee /etc/mailname
  1. Postfix 재시작:
sudo systemctl restart postfix

🔧 문제 2: no SASL authentication mechanisms (SASL 인증 실패)

fatal: no SASL authentication mechanisms
warning: SASL: Connect to Dovecot auth socket 'private/auth' failed: No such file or directory

🔍 원인

  • Postfix가 메일 발송 시 SMTP 인증을 시도했는데, Dovecot에서 SASL 인증 소켓이 없어서 실패.
  • 즉, Dovecot이 제대로 설치되지 않았거나 설정파일 누락된 상태.

✅ 해결 방법

  1. Dovecot이 설치되어 있는지 확인:
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d
  1. /etc/dovecot/dovecot.conf가 없을 경우 복원:
sudo cp /usr/share/dovecot/example-config/dovecot.conf /etc/dovecot/
  1. Dovecot 설정 테스트:
sudo dovecot -n
  1. Dovecot 재시작:
sudo systemctl restart dovecot
  1. Postfix와 Dovecot 연동 확인:
  • /etc/postfix/main.cf 에 아래 추가:
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = 
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_unauth_destination
  • /etc/dovecot/conf.d/10-master.conf에 아래 내용 확인:
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
  1. Postfix 다시 시작:
sudo systemctl restart postfix

🔄 마무리 체크

  • mail -s "제목" you@example.com 으로 메일 전송 후 /var/log/mail.log 확인
  • postqueue -p 로 메일 큐 확인
  • dig support.beaverfactory.kr MX 로 MX 레코드 점검

 

/usr/share/dovecot/example-config/dovecot.conf가 없다는 메시지는 Dovecot이 제대로 설치되지 않았거나 설치가 꼬였다는 신호입니다. 현재 시스템에 dovecot-core 등의 패키지가 부분적으로 설치되었거나 누락된 상태일 가능성이 높습니다.


✅ 해결 순서

1. 📦 dovecot 패키지 정리 및 재설치

sudo apt purge dovecot-core dovecot-imapd dovecot-pop3d dovecot-common -y
sudo apt autoremove -y
sudo apt update
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d -y

이렇게 하면 Dovecot이 깨끗하게 재설치되며 /etc/dovecot/ 디렉토리와 기본 설정들이 복원됩니다.


2. 📁 기본 설정 파일 확인

재설치 후, 아래 파일이 존재하는지 확인하세요:

ls /etc/dovecot/dovecot.conf
ls /etc/dovecot/conf.d/

3. ✅ 기본 설정 적용 및 서비스 재시작

sudo systemctl restart dovecot
sudo systemctl status dovecot

정상 동작하면 active (running) 상태로 보여야 합니다.


4. Postfix와 연동 설정 확인

다시 알려드릴게요:

/etc/postfix/main.cf (추가 또는 수정)

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_tls_auth_only = yes

smtpd_recipient_restrictions = 
    permit_sasl_authenticated,
    permit_mynetworks,
    reject_unauth_destination

/etc/dovecot/conf.d/10-master.conf에서 아래 블럭 주석 해제 또는 추가

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

5. 💡 마지막 점검

sudo systemctl restart postfix dovecot
sudo tail -f /var/log/mail.log


이번엔 Postfix 로그에서 새로운 반송 사유가 발생했습니다:


❌ 에러 요약

553 5.1.7 MADDR 49.247.47.213: Invalid mail address: <root@아이디-256881>

🧨 원인

  • 메일의 발신자 주소가 root@아이디-256881로 되어 있는데,
  • 이 주소는 공인 도메인 포맷이 아니며, 한메일(daum.net)의 스팸 차단 정책에 의해 잘못된 발신자 주소로 간주되어 차단된 것입니다.

✅ 해결 방법

1. Postfix의 발신 주소를 올바른 도메인 기반 주소로 수정해야 합니다.

sudo nano /etc/postfix/main.cf

아래 항목들을 확인하고, 설정합니다:

myhostname = support.beaverfactory.kr
mydomain = beaverfactory.kr
myorigin = $myhostname

즉, 메일의 발신 주소는 root@support.beaverfactory.kr로 바뀌게 됩니다.


2. /etc/aliases 파일도 수정

메일 전송 시 사용하는 유저 root를 실제 이메일 주소로 매핑해줘야 합니다:

sudo nano /etc/aliases

마지막에 추가:

root: support@beaverfactory.kr

그다음 다음 명령어로 DB를 갱신합니다:

sudo newaliases

3. Postfix 재시작

sudo systemctl restart postfix

📬 이후 테스트

다시 다음 명령으로 테스트하세요:

echo "Postfix 테스트입니다." | mail -s "제목: 테스트 메일" 이메일주소

🔒 추가 권장 사항

  • support.beaverfactory.kr 도메인이 실제로 존재하고, DNS에 SPF 레코드A 레코드가 설정되어 있어야 합니다.
  • 필요한 경우 support TXT "v=spf1 mx a ~all" 을 DNS에 추가해 주세요.

필요하면 DNS 쪽 점검 도와드릴게요. dig, nslookup 등도 활용 가능합니다.

 

좋습니다! root: support@beaverfactory.kr 가 이미 설정되어 있다면 기본 발신자(root)가 support@beaverfactory.kr로 리디렉션되도록 되어 있습니다. 아주 잘 되어 있어요.

하지만 이게 실제 메일 발신 주소(MAIL FROM) 을 바꿔주진 않아요. 수신 서버(Daum, Naver 등)는 메일 envelope 상의 실제 발신자 주소를 검사합니다. 그 주소가 여전히 root@아이디-256881이면 거부됩니다.


✅ 추가로 해야 할 작업 (핵심)

Postfix가 메일을 보낼 때 사용하는 발신 주소 자체를 support@beaverfactory.kr 로 바꾸려면 다음을 꼭 해야 합니다:


① /etc/postfix/generic 파일 생성 및 설정

sudo nano /etc/postfix/generic

내용:

root@아이디-256881    support@beaverfactory.kr

→ 즉, 시스템 유저 root@서버이름 → 원하는 도메인 주소로 바꿔줌.


② 매핑 적용 명령어

sudo postmap /etc/postfix/generic

③ Postfix 설정에 매핑 적용

sudo postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic'

④ Postfix 재시작

sudo systemctl restart postfix

⑤ 테스트

echo "Postfix 주소 변환 테스트입니다." | mail -s "발신자 주소 변경 테스트" 이메일주소

✨ 정리

설정 항목 역할

/etc/aliases 메일 수신 시 root → 다른 메일로 리디렉션
/etc/postfix/generic 메일 발신 시 root@서버이름 → 지정 주소로 변환

이제 설정 완료되었습니다.
메일이 support@beaverfactory.kr로 정상 발신되는지 확인해보세요.
실패하면 다시 로그 (/var/log/mail.log) 붙여주세요!

 

 

 

오류 메시지를 보면 핵심 문제는 아래와 같습니다:

error: open database /etc/postfix/generic.db: No such file or directory
warning: hash:/etc/postfix/generic is unavailable.
fatal: smtp_generic_maps map lookup problem for root@아이디-256881

즉, generic 매핑 파일은 설정했지만 .db 파일이 존재하지 않아 Postfix가 오류를 일으킨 것입니다.


✅ 해결 방법

1. generic.db 생성

sudo postmap /etc/postfix/generic

이 명령어를 실행하면 /etc/postfix/generic.db 라는 파일이 생성됩니다.

❗이 작업을 하지 않으면 hash:/etc/postfix/generic 설정이 실패해서 메일 발신도 실패합니다.


2. Postfix 다시 시작

sudo systemctl restart postfix

3. 테스트 메일 다시 발송

echo "Postfix 발신자 주소 테스트입니다." | mail -s "주소 변경 확인" 이메일 주소

💡 확인 팁

메일 로그를 다시 확인하려면:

sudo tail -f /var/log/mail.log

추가 점검사항

  • /etc/postfix/main.cf 안에 다음 줄이 꼭 있어야 합니다:
smtp_generic_maps = hash:/etc/postfix/generic

이제 .db 파일까지 제대로 생성하면 root@아이디-256881 발신 주소가 support@beaverfactory.kr 로 변경되어, Daum/Naver 등에서 더 이상 거부되지 않을 겁니다.
성공 로그나 실패 로그 보여주시면 바로 이어서 도와드릴게요!

 

 

알겠습니다! 메일 발송이 잘 되도록 하기 위한 기본적인 설정들, 순서대로 쉽게 설명할게요.


1. SPF 레코드 설정하기 (스팸 방지용)

  • DNS 관리하는 곳(스마일서브, 카페24 등)에서
  • 도메인 TXT 레코드에 다음과 같은 SPF 설정을 추가하세요:
v=spf1 mx a ~all
  • 의미는
    • mx = 도메인의 MX 서버에서 보내는 메일 허용
    • a = 도메인의 A 레코드 IP에서 보내는 메일 허용
    • ~all = 그 외는 소프트 실패 처리

예시:

종류 이름(호스트) 값 (TXT 데이터)

TXT @ v=spf1 mx a ~all

DNS 적용 후에는 반영까지 보통 수분~수시간 걸릴 수 있어요.

 

여기 spf는 미리 설정 해놔서 안하셔도 됩니다.

 

2. DKIM 설정하기 (메일 서명)

  • DKIM은 메일이 위변조되지 않았음을 증명해 줍니다.
  • Dovecot/Postfix에 DKIM을 적용하거나, opendkim 패키지를 사용합니다.

간단한 opendkim 설정 순서 (우분투 기준)

  1. 설치
sudo apt install opendkim opendkim-tools
  1. 키 생성
sudo mkdir -p /etc/opendkim/keys/yourdomain.com
cd /etc/opendkim/keys/yourdomain.com
sudo opendkim-genkey -s mail -d yourdomain.com
sudo chown opendkim:opendkim mail.private
  1. /etc/opendkim.conf 파일 수정 (예시)
AutoRestart             Yes
AutoRestartRate         10/1h
Syslog                  yes
UMask                   002
Domain                  yourdomain.com
KeyFile                 /etc/opendkim/keys/yourdomain.com/mail.private
Selector                mail
Socket                  inet:12345@localhost
PidFile                 /var/run/opendkim/opendkim.pid
UserID                  opendkim:opendkim

 

 

여기서 중요한게 아래 설정 그대로 따라하면되는데 소켓 문제가 있다보니 8891 포트 열어주고 외부는 안해도 될것 같습니다.

# This is a basic configuration for signing and verifying. It can easily be
# adapted to suit a basic installation. See opendkim.conf(5) and
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for complete
# documentation of available configuration parameters.
AutoRestart             Yes
AutoRestartRate         10/1h
Syslog                  yes
SyslogSuccess           yes
#LogWhy                 no

# Common signing and verification parameters. In Debian, the "From" header is
# oversigned, because it is often the identity key used by reputation systems
# and thus somewhat security sensitive.
Canonicalization        relaxed/simple
#Mode                   sv
#SubDomains             no
OversignHeaders         From

# Signing domain, selector, and key (required). For example, perform signing
# for domain "example.com" with selector "2020" (2020._domainkey.example.com),
# using the private key stored in /etc/dkimkeys/example.private. More granular
# setup options can be found in /usr/share/doc/opendkim/README.opendkim.
Domain                  beaverfactory.kr
Selector                mail
KeyFile          /etc/opendkim/keys/beaverfactory.kr/mail.private

# In Debian, opendkim runs as user "opendkim". A umask of 007 is required when
# using a local socket with MTAs that access the socket as a non-privileged
# user (for example, Postfix). You may need to add user "postfix" to group
# "opendkim" in that case.
UserID                  opendkim:opendkim
UMask                   002

# Socket for the MTA connection (required). If the MTA is inside a chroot jail,
# it must be ensured that the socket is accessible. In Debian, Postfix runs in
# a chroot in /var/spool/postfix, therefore a Unix socket would have to be
# configured as shown on the last line below.
#Socket                 local:/run/opendkim/opendkim.sock
#Socket                 inet:8891@localhost
#Socket                 inet:8891
#Socket                 local:/var/spool/postfix/opendkim/opendkim.sock
Socket                  inet:8891@localhost


PidFile                 /run/opendkim/opendkim.pid

# Hosts for which to sign rather than verify, default is 127.0.0.1. See the
# OPERATION section of opendkim(8) for more information.
#InternalHosts          192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12

# The trust anchor enables DNSSEC. In Debian, the trust anchor file is provided
# by the package dns-root-data.
TrustAnchorFile         /usr/share/dns/root.key
#Nameservers            127.0.0.1

 

 

  1. Postfix와 연동 (main.cf 에 아래 추가)
smtpd_milters = inet:localhost:12345
non_smtpd_milters = inet:localhost:12345
milter_default_action = accept
  1. DNS에 공개키 TXT 등록
  • mail._domainkey.yourdomain.com 이름으로 TXT 레코드 생성
  • 값은 /etc/opendkim/keys/yourdomain.com/mail.txt 파일 내용 복사

3. PTR 레코드 (역방향 DNS) 설정

  • IP 주소 → 도메인 이름 매핑 설정
  • 이건 DNS 제공자(호스팅/ISP)에 요청해야 합니다.

예) IP 49.247.47.213 → support.beaverfactory.kr

PTR 설정 없으면 많은 메일 서버에서 차단합니다.


4. Postfix에서 발신자 주소 변환 설정

  • /etc/postfix/generic 파일 만들기
root@아이디-256881  아이디@yourdomain.com
  • 메일 발신자 root@아이디-256881 를 실제 사용하는 이메일 주소로 변환
  • 다음 명령어 실행 (맵 파일 생성)
sudo postmap /etc/postfix/generic
  • main.cf에 다음 추가
smtp_generic_maps = hash:/etc/postfix/generic
  • Postfix 재시작
sudo systemctl restart postfix

5. 메일 서버 점검 및 테스트

  • 모든 설정 후에 다음 명령어로 Postfix 설정 확인
postfix check
  • 테스트 메일 보내기
echo "테스트 메일 내용" | mail -s "테스트 메일 제목" your_email@example.com
  • 로그 모니터링
sudo tail -f /var/log/mail.log

요약

작업 목적 방법/파일 위치

SPF 레코드 메일 발송 허가 도메인 확인 DNS TXT 설정
DKIM 메일 무결성 서명 opendkim 설치 및 DNS TXT
PTR 레코드 IP → 도메인 매핑 ISP/호스팅사 요청
발신자 변환 실제 메일주소로 변환 /etc/postfix/generic + postmap
Postfix 점검 문제점 사전 발견 postfix check

 

 

 

Socket inet:12345@localhost 이 설정은 OpenDKIM이나 다른 Milter 서비스가 Postfix와 통신하기 위해 수신 대기할 소켓 위치를 지정하는 것입니다.


🔍 의미 분석

Socket inet:12345@localhost
  • Socket: OpenDKIM이 **어디에서 수신 대기(listen)**할지를 지정함
  • inet:: TCP/IP 네트워크 소켓을 의미 (inet = internet)
  • 12345: 사용할 포트 번호
  • @localhost: 127.0.0.1, 즉 이 서버 자신만 접속 허용

즉,

OpenDKIM이 localhost:12345에서 Postfix의 요청을 기다린다.


🔄 연동 구조

  1. Postfix는 이메일을 처리하면서설정에 따라 OpenDKIM에 연결 시도
  2. smtpd_milters = inet:localhost:12345
  3. OpenDKIM이 /etc/opendkim.conf에서설정으로 12345 포트에서 수신 대기 중이면 연결됨
  4. Socket inet:12345@localhost
  5. 메일 내용에 DKIM 서명 추가하여 외부로 발송함

✅ 다른 Socket 타입 비교

설정 설명

inet:12345@localhost TCP 12345포트에서 수신 대기 (네트워크 기반)
local:/var/run/opendkim/opendkim.sock 유닉스 도메인 소켓으로 통신 (보안 ↑ 성능 ↑)

※ 보통 유닉스 소켓을 많이 쓰지만, 설정이 복잡하면 inet으로 먼저 테스트하는 게 쉽습니다.


✅ 실전 팁

  • Postfix와 OpenDKIM이 정확히 같은 Socket을 사용하고 있어야 함
  • netstat이나 ss로 포트 확인:
sudo ss -ltnp | grep 12345

🔧 요약

항목 설명

Socket inet:12345@localhost OpenDKIM이 TCP 12345 포트를 열고 Postfix 요청 대기
Postfix 설정 smtpd_milters Postfix가 DKIM 필터로 요청 보낼 위치

필요하면 local: 방식으로도 바꿔드릴 수 있어요.
지금은 기본 테스트용으로 inet 방식 쓰시는 게 빠릅니다.

 

 

Postfix에서 사용하려는 포트(12345)를 열기 위해서는 두 가지가 필요합니다:


✅ 1. OpenDKIM이나 Milter 서비스가 포트를 열도록 설정

즉, 단순히 "방화벽만 여는 것"이 아니라 서버에서 포트 수신 대기하도록 해야 합니다.

예를 들어 OpenDKIM에서 포트 12345를 열려면 /etc/opendkim.conf에 다음 줄이 있어야 합니다:

Socket inet:12345@localhost

그리고 서비스를 재시작합니다:

sudo systemctl restart opendkim

그 후 다음 명령으로 확인:

sudo ss -ltnp | grep 12345

✅ 2. 방화벽에서 포트 12345 열기

로컬에서만 사용할 포트이므로 일반적으로 방화벽 설정 필요 없음. 하지만 만약 외부 접속 허용을 원한다면:

🔹 UFW 사용 시 (Ubuntu 기본)

sudo ufw allow 12345/tcp

적용 확인:

sudo ufw status

✅ 확인 방법

sudo ss -ltnp | grep 12345

출력이 이런 식이면 성공입니다:

LISTEN 0      5        127.0.0.1:12345       0.0.0.0:*     users:(("opendkim",pid=...,fd=...))

📌 정리

목적 명령

OpenDKIM에서 포트 열기 Socket inet:12345@localhost 설정 후 서비스 재시작
포트 열려 있는지 확인 `sudo ss -ltnp
UFW로 방화벽 허용 (옵션) sudo ufw allow 12345/tcp

OpenDKIM 설정파일 내용 보내주시면, 맞게 고쳐드릴 수도 있어요. 원하시나요?

 

저 같은 경우 8891 포트로 설정 했습니다.

 

 

 

네, Postfix에서 보내는 사람 주소를 support@beaverfactory.kr로 설정하는 것은 가능합니다. 아래는 설정 방법입니다:


✅ 1. generic 매핑 파일 설정 (보내는 이메일 주소 변경)

Postfix는 내부 유저(예: root@hostname)를 외부 이메일 주소(예: support@beaverfactory.kr)로 바꾸기 위해 generic 매핑을 사용합니다.

🔹 /etc/postfix/generic 파일 생성 또는 편집:

sudo nano /etc/postfix/generic

내용:

root@아이디-256881 support@beaverfactory.kr

시스템 유저 root가 메일을 보낼 때 support@beaverfactory.kr로 변경되도록 지정합니다.


✅ 2. 매핑 DB 파일 생성:

sudo postmap /etc/postfix/generic

이 명령은 generic.db라는 Postfix가 사용하는 실제 DB를 생성합니다.


✅ 3. main.cf에 설정 추가:

sudo nano /etc/postfix/main.cf

아래 항목을 추가하거나 수정:

smtp_generic_maps = hash:/etc/postfix/generic

✅ 4. Postfix 재시작:

sudo systemctl restart postfix

✅ 5. 테스트 메일 전송:

echo "테스트 본문" | mail -s "제목 테스트" 이메일주소

메일 헤더에서 From이 support@beaverfactory.kr로 나와야 합니다.


✅ 추가 팁: 메일이 차단되지 않도록 SPF, DKIM, DMARC도 함께 설정하세요.

필요하시면 해당 DNS 설정도 도와드릴게요.


필요한 경우 아래 정보 주시면 더 정확히 도와드릴 수 있어요:

  • hostname (출력값: hostname)
  • main.cf 일부 (myhostname, myorigin, mydestination, smtp_generic_maps 항목 등)

도움 드릴까요?

 

 

 

네, 가능합니다! root 대신 원하는 이름(예: support@beaverfactory.kr)으로 보낸 사람 주소를 바꿀 수 있습니다. 방법은 두 가지입니다:


✅ 1. Postfix에서 보낸 사람 주소 변경 (Generic Mapping 사용)

/etc/postfix/generic 파일을 만들어 아래처럼 설정하세요:

root@아이디-256881   support@beaverfactory.kr

그런 다음 아래 명령어 실행:

sudo postmap /etc/postfix/generic

generic.db 파일이 생성되어야 합니다. (이거 없어서 아까 오류났던 거예요!)

Postfix 설정에 매핑 파일 추가:

/etc/postfix/main.cf에서 아래 줄이 있는지 확인하거나 추가:

smtp_generic_maps = hash:/etc/postfix/generic

그 다음 Postfix 재시작:

sudo systemctl restart postfix

✅ 2. mail 명령어에서 직접 From: 지정

만약 수동으로 메일 보낼 때 직접 지정하고 싶다면 mail 명령어에 -a 옵션으로 헤더 추가할 수 있어요:

echo "테스트 메시지입니다." | mail -s "제목입니다" -a "From: support@beaverfactory.kr" 이메일주소

이 방법은 간단하게 수동 테스트할 때 유용해요. 하지만 Postfix가 system이나 앱에서 자동 메일 보낼 땐 위 generic mapping 설정이 더 좋습니다.


💡 주의사항: 수신자 스팸 필터

support@beaverfactory.kr 같은 주소를 사용하면:

  • ✅ 보낸 사람 도메인과 서버 호스트명이 일치해야 신뢰도 ↑
  • ✅ SPF, DKIM, DMARC 레코드도 설정되어야 수신 필터에서 안 걸려요

📌 도메인 설정도 필요해요 (필수)

  • DNS에 다음 설정들이 되어 있어야 함:
    • SPF: v=spf1 mx a ip4:49.247.47.213 ~all
    • DKIM: (opendkim 사용 중이면 공개키 등록)
    • DMARC: (_dmarc에 v=DMARC1; p=none; rua=...)

필요하시면 DNS 설정 예시까지 전부 만들어드릴게요.
또는 Postfix 설정 파일 열어서 직접 수정해도 돼요. 원하시면 도와드릴게요!

 

 

로그 메시지를 보면 아래와 같은 두 가지 문제가 발생하고 있습니다:


🚨 1. "Mail for beaverfactory.kr loops back to myself"

🔍 원인:

Postfix가 support@beaverfactory.kr 메일을 자기 자신으로 보내고 있는데, 이 도메인이 Postfix의 로컬 도메인으로 잘못 인식되었기 때문에 루프(반복 전송) 오류가 납니다.


✅ 해결 방법:

/etc/postfix/main.cf 파일에서 다음 항목들을 확인/수정하세요.

① mydestination 항목 수정

beaverfactory.kr이 여기에 들어 있으면 안 됩니다.

# 잘못된 예시 ❌ (루프 유발)
mydestination = $myhostname, beaverfactory.kr, localhost.localdomain, localhost

# 수정된 예시 ✅
mydestination = $myhostname, localhost.localdomain, localhost

② virtual_alias_domains 또는 relay_domains에 beaverfactory.kr 명시

virtual_alias_domains = beaverfactory.kr
virtual_alias_maps = hash:/etc/postfix/virtual

그리고 /etc/postfix/virtual 파일에 매핑 추가:

support@beaverfactory.kr   이메일주소

그 다음 아래 명령어로 DB 생성:

sudo postmap /etc/postfix/virtual

🚨 2. "hostname runnerx.xyz does not resolve to address 49.247.47.213"

🔍 원인:

서버의 호스트명(hostname)이 runnerx.xyz인데, 이 도메인이 현재 IP(49.247.47.213)와 DNS에서 매칭되지 않습니다. 이건 수신자 측 스팸 필터에 영향 줍니다.


✅ 해결 방법:

① 호스트 이름 확인 및 변경

hostnamectl set-hostname support.beaverfactory.kr

② /etc/hosts 수정

49.247.47.213    support.beaverfactory.kr
127.0.0.1        localhost

③ 외부 DNS(A 레코드)도 수정

support.beaverfactory.kr → 49.247.47.213으로 설정되어 있어야 합니다.


✉️ 정리 – 정상 전송되게 하려면:

  1. mydestination에서 도메인 제거
  2. virtual_alias_maps 사용해 외부 주소로 라우팅
  3. DNS의 A 레코드/호스트명/IP 정합성 유지
  4. SPF/DKIM/DMARC 설정하면 스팸 확률 ↓

필요하시면 전체 main.cf 샘플도 만들어드릴게요.
DNS 설정도 확인 도와드릴 수 있습니다.
지금 어떤 메일 흐름을 만들고 싶은지 알려주시면 정확히 맞춰드릴게요!

 

 

virtual_alias_domains 또는 relay_domains에 beaverfactory.kr을 명시하는 방법은 Postfix 설정 파일인 /etc/postfix/main.cf를 편집해서 도메인을 등록하는 거예요.

아래 단계별로 쉽게 설명할게요:


1. /etc/postfix/main.cf 열기

터미널에서 아래 명령어로 편집기(예: nano)로 엽니다:

sudo nano /etc/postfix/main.cf

2. virtual_alias_domains 또는 relay_domains 항목 찾기 또는 추가하기

virtual_alias_domains가 없으면 추가해 주세요.

virtual_alias_domains = beaverfactory.kr

만약 이미 다른 도메인이 있다면 쉼표(,)로 구분해서 추가하세요:

virtual_alias_domains = example.com, beaverfactory.kr

3. virtual_alias_maps 설정 추가

가상 별칭 매핑 파일을 사용하려면 아래 줄도 확인/추가하세요:

virtual_alias_maps = hash:/etc/postfix/virtual

4. /etc/postfix/virtual 파일 생성 및 수정

이제 /etc/postfix/virtual 파일을 만들어서 특정 이메일을 외부 주소로 연결할 수 있어요.

예를 들어, support@beaverfactory.kr 메일을 아이디@naver.com으로 보내려면:

sudo nano /etc/postfix/virtual

내용을 아래처럼 작성:

support@beaverfactory.kr   본인 이메일주소

5. virtual 파일 DB 생성

Postfix는 DB 파일이 필요해서 다음 명령어로 변환해 주세요:

sudo postmap /etc/postfix/virtual

6. Postfix 재시작

설정을 반영하려면 Postfix를 재시작합니다:

sudo systemctl restart postfix

7. 테스트

이제 support@beaverfactory.kr으로 보내진 메일은 이메일주소 으로 전달됩니다.


필요하면 내가 직접 설정 예시를 만들어 드릴 수도 있어요!
궁금한 부분 있으면 편하게 물어보세요 :)

 

 

보낸 사람 이메일이 root@support.beaverfactory.kr가 아니라 support@beaverfactory.kr로 나오게 하려면, Postfix에서 발신자 주소 변환(sender canonical mapping) 설정을 해줘야 해요.

방법은 다음과 같습니다.


1. /etc/postfix/sender_canonical 파일 생성 또는 수정

sudo nano /etc/postfix/sender_canonical

내용 예시 (root 사용자 이메일을 support@beaverfactory.kr로 변경):

root    support@beaverfactory.kr

2. sender_canonical 맵 파일 데이터베이스 생성

sudo postmap /etc/postfix/sender_canonical

3. main.cf에 sender_canonical_maps 설정 추가 또는 수정

sudo nano /etc/postfix/main.cf

아래 줄을 찾아서 없으면 추가하거나 수정하세요:

sender_canonical_maps = hash:/etc/postfix/sender_canonical

4. Postfix 재시작

sudo systemctl restart postfix

5. 테스트

이제 root 계정에서 보내는 메일의 발신자 주소가 support@beaverfactory.kr로 바뀝니다.


필요하면 보낸 사람 주소 변경하는 다른 방법(예: generic maps)도 안내해드릴 수 있어요.
더 궁금하면 편하게 질문 주세요!

 

 

아래 센드 메일 로 이메일 테스트 혹은 php 메일러로 테스트하면 됩니다.

(
  echo "From: 비버팩토리 <support@beaverfactory.kr>"
  echo "To: 아이디@naver.com"
  echo "Subject: =?UTF-8?B?$(echo -n "한글제목" | base64)?="
  echo "MIME-Version: 1.0"
  echo "Content-Type: text/plain; charset=UTF-8"
  echo "Content-Transfer-Encoding: 8bit"
  echo
  echo "본문 내용입니다."
) | sendmail -t

 

 

 

전반적인 내용은 챗지피티 도움으로 설치 완료 하였고 에러 나면 지피티한테 물어보면됩니다.

필자 본인은 이 흐름을 단지 기록 한거라서 경험을 토대로 그대로 재현 한겁니다.

다음은 웹메일을 설치 해보겠습니다.

 

 

728x90