메일 서버 · 4 min read · Nov 12, 2025

Postfix 설정을 사용하여 스팸과 싸우는 방법

Postfix 설정을 사용하여 스팸과 싸우는 방법

이 가이드에서는 기본 Falko 메일 가이드를 조정하여 Postfix (+Auth SMTP + Quota), https://www.howtoforge.com/virtual_postfix_mysql_quota_courier, 스팸과 싸우고 이전 Qmail 시스템의 하위 호환성을 약간 허용하는 방법을 배웁니다.

자, 시작해 보겠습니다…

HowtoForge 가이드는 모든 것에 대해 훌륭하지만, 1분에 수천 개의 메시지를 처리하는 매우 바쁜 메일 서버에서 Spam Assasin을 실행하는 것은 CPU를 소모합니다. 가장 좋은 방법은 RBL(Realtime Blacklists) 및 RHBL(유사하지만 다름), 그레이리스트 및 Helo 체크를 통해 메일이 Spam Assasin에 도달하기 전에 차단하는 것입니다.

우선 기존 smtpd 제한을 변경하고 시스템이 수락하는 메일의 양을 줄이는 데 도움이 되는 새로운 체크를 추가하고자 합니다. /etc/postfix/main.cf

### 잘못 형성된 이메일 제거를 위한 체크  
smtpd_helo_required     = yes  
strict_rfc821_envelopes = yes  
disable_vrfy_command = yes  
  
unknown_address_reject_code  = 554  
  
unknown_hostname_reject_code = 554  
  
unknown_client_reject_code   = 554  
  
  
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, regexp:/etc/postfix/helo.regexp, permit  
  
  
  
### sender_checks를 변경할 때, 이 파일은 postmap 을 사용하여 재생성해야 하며, Berkeley DB를 생성합니다.  
  
smtpd_recipient_restrictions =   
   check_client_access hash:/etc/postfix/helo_client_exceptions  
   check_sender_access    hash:/etc/postfix/sender_checks,  
   reject_invalid_hostname,  
### Auth SMTP에 문제가 발생할 수 있으므로 주의하세요!  
   reject_non_fqdn_hostname,  
##################################  
   reject_non_fqdn_sender,  
  
   reject_non_fqdn_recipient,  
  
   reject_unknown_sender_domain,  
  
   reject_unknown_recipient_domain,  
  
   permit_mynetworks,  
  
   reject_unauth_destination,  
  
  
# RBL 예외를 여기에 추가합니다. rbl_client_exceptions를 변경할 때, 이  
파일은 postmap 을 사용하여 재생성해야 하며,  
Berkeley DB를 생성합니다.  
  
          check_client_access hash:/etc/postfix/rbl_client_exceptions,  
          reject_rbl_client cbl.abuseat.org,  
          reject_rbl_client sbl-xbl.spamhaus.org,  
          reject_rbl_client bl.spamcop.net,   
  
          reject_rhsbl_sender    dsn.rfc-ignorant.org,  
  
         check_policy_service inet:127.0.0.1:60000  
         permit 

이제 설명하겠습니다. 하지만 먼저 몇 개의 파일을 생성해야 합니다:

우리가 생성하고자 하는 첫 번째 파일은 /etc/postfix/helo.regexp이며, 다음 내용을 포함합니다:

/^subdomain\.host\.com$/           550 내 호스트 이름을 사용하지 마세요  
/^xxx\.yyy\.zzz\.xxx$/             550 내 IP 주소를 사용하지 마세요  
/^\[xxx\.yyy\.zzz\.xxx\]$/         550 내 IP 주소를 사용하지 마세요  
/^[0-9.]+$/                        550 귀하의 소프트웨어는 RFC 2821 준수하지 않습니다  
/^[0-9]+(\.[0-9]+){3}$/            550 귀하의 소프트웨어는 RFC 2821 준수하지 않습니다

이것만으로도 HELO 명령을 보내고 IP 또는 호스트 이름으로 메일을 수신하는 서버를 가장하려는 스패머를 차단하고, RFC 2821 준수를 충족하지 않는 일부 메일을 차단할 수 있습니다.

다음으로, /etc/postfix/helo_client_exceptions를 생성해야 합니다:

# 이 클라이언트 IP 주소는 fqdn 체크를 우회할 수 있습니다  
# 아래 IP 주소를 식별하기 위한 주석  
www.xxx.yyy.zzz OK  

이 파일은 잘못된 동작을 하는 메일 서버가 올바른 HELO를 보낼 수 없을 때 해당 소스에서 메일을 수락할 수 있도록 허용해야 합니다. 제 경험상, 독립형 장치나 CCTV 카메라는 표준을 준수하는 데 미흡하므로 예외를 만들어야 할 수도 있습니다.

이 파일의 변경 사항이 사용 가능해지기 전에 다음을 실행해야 합니다:

postmap /etc/postfix/helo_client_exceptions

이렇게 하면 /etc/postfix/helo_client_exceptions.db라는 파일이 생성됩니다.

아래로 내려가면 /etc/postfix/sender_checks가 있으며, 이를 통해 다양한 FQDN 체크를 우회하고 특정 발신자를 허용할 수 있습니다. 이는 회사가 domain.com과 같은 내부 메일 네트워크를 운영하지만 이메일이 int.domain.com에서 실행되고 int.domain.com에 대한 DNS가 설정되지 않은 경우 특히 유용합니다. 이는 보안에는 좋지만 외부 DNS가 내부 구조를 알지 못하므로 Postfix가 int.domain.com을 거부하게 됩니다.

[email protected]      REJECT   
[email protected]   OK 

다시 말하지만, 이 파일이 수정되면 Berkeley DB 파일을 생성해야 하므로 다음을 사용하여 생성합니다:

postmap /etc/postfix/sender_checks

다음은 RBL 체크입니다. RBL에 전념하는 많은 웹사이트가 있지만, 기사를 줄이기 위해 간단히 말하자면, 이 목록은 지속적으로 업데이트되며 스패머가 메일을 릴레이하는 데 사용하는 IP 및 호스트 이름을 제공합니다. 메일 서버로 메일을 보내려는 각 IP는 이러한 목록(위에서 사용된 4개)에 대해 확인되며, IP가 RBL에 나열되어 있지 않으면 메일 서버는 메일을 수락합니다. 물론 서버는 이러한 목록에 자주 실수로 올라가거나 스팸 발생 후 블랙리스트 IP를 제거하는 데 24시간이 걸리므로 이러한 체크를 우회할 수 있는 방법을 갖는 것이 항상 가장 좋습니다.

이를 위해 /etc/postfix/rbl_client_exceptions라는 파일을 생성합니다:

## 일부 무작위 주석  
www.xxx.yyy.zzz OK   

다시 한 번, Berkeley DB 파일을 생성하기 위해 postmap을 실행해야 합니다:

postmap /etc/postfix/rbl_client_exceptions

smtpd 제한의 마지막 줄은 그레이리스트 필터입니다. 이 부분에 대해서는 이미 howtoforge에 가이드가 존재하므로 자세히 설명하지 않겠습니다. https://www.howtoforge.com/greylisting_postfix_postgrey 그러나 그레이리스트를 사용하고 싶지 않다면, 다음 줄을 생략하면 됩니다:

check_policy_service inet:127.0.0.1:60000

smtpd 제한은 매우 쉽게 따라할 수 있으며, 체크 중 하나가 메시지가 Postfix 큐로 전달될 수 있도록 녹색 신호를 주기 전까지는 대부분의 응답이 확실하지 않으면 계속 진행하며, 명시적인 NO가 주어지지 않으면 메시지는 체크 목록을 아래로 이동합니다.

QMAIL 레거시

DJB(Dan Bernstein)는 QMQP라는 SMTP의 대안을 개발했습니다. 이는 더 빠르고 오버헤드가 적다고 합니다. 따라서 이전 Qmail MTA를 Postfix로 교체하는 경우 QMQP 지원을 활성화해야 할 수 있습니다.

다음 내용을 /etc/postfix/main.cf에 추가하여 이를 수행합니다:

qmqpd_authorized_clients = $mynetworks   
qmqpd_error_delay = 5s  
qmqpd_timeout = 300s   

실제로는 무엇이든 인증할 수 있지만, 저는 mynetworks에 대해 인증하기로 결정했습니다. 위 내용을 main.cf에 추가한 후, /etc/postfix/master.cf를 추가로 수정하고 다음 내용을 포함해야 합니다:

628      inet  n       -       -       -       100       qmqpd    

이제 Postfix를 재시작하면 됩니다:

/etc/init.d/postfix restart

다음 명령어를 입력하여 새로운 QMQP 인식 Postfix를 확인할 수 있습니다:

telnet localhost 628

IP를 통한 인증(MS Exchange 서버에서 Smarthost 릴레이에 이상적)

다음으로, 가이드를 약간 수정하여 mynetworks 설정을 평면 파일인 /etc/postfix/main.cf를 통해 보다 쉽게 설정할 수 있도록 하겠습니다.

다음 내용을 /etc/postfix/mysql-mynetworks.cf에 생성합니다:

user = mail_admin  
password = password  
dbname = mail  
table = allowed_hosts  
select_field = 'IP'  
where_field = IP  
hosts = 127.0.0.1  
additional_conditions = and active='yes'   

이 시점에서 다음 SQL이 필요합니다:

CREATE TABLE allowed_hosts (
active enum(‘yes’,’no’) NOT NULL default ‘1’,
IP varchar(15) NOT NULL default ‘’,
Client varchar(128) NOT NULL default ‘’,
Comments text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

마지막으로, Postfix의 main.cf에서 mynetworks 줄을 다음과 같이 변경하여 이를 활성화합니다:

mynetworks = 127.0.0.0/8, proxy:mysql:/etc/postfix/mysql-mynetworks.cf    

마지막으로 변경 사항이 적용되도록 Postfix를 재시작합니다:

chmod o= /etc/postfix/mysql-mynetworks.cf
chgrp postfix /etc/postfix/mysql-mynetworks.cf

/etc/init.d/postfix restart

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.