Postfix 설정 · 9 min read · Nov 14, 2025

Postfix 스팸 필터 설정하기 - 페이지 2

2 Postfix 설정하기

Postfix 소스 코드에서 몇 가지 샘플 파일이 필요합니다. 여기서 가져오는 소스 코드는 원본 소스 코드이며, Ubuntu/Debian 패키지 유지 관리자가 수정하기 전의 것입니다:

cd /usr/local/src  

wget http://us.archive.ubuntu.com/ubuntu/pool/main/p/postfix/postfix_2.3.3.orig.tar.gz  

tar xzvf postfix_2.3.3.orig.tar.gz

Postfix를 중지합니다:

postfix stop

“덮어쓰시겠습니까?”에 “n”이라고 대답해야 합니다. 각 섹션을 별도로 수행합니다:

cp -i /usr/share/postfix/main.cf.debian /etc/postfix/main.cf  
  
cp -i /usr/local/src/postfix-2.3.3/conf/* /etc/postfix  
  
cp -i /etc/postfix/header_checks /etc/postfix/body_checks  
  
cp -i /etc/postfix/access /etc/postfix/sender_access

2.1 master.cf 편집하기

참고로, /etc/postfix 폴더에 위치한 두 개의 Postfix 구성 파일을 주의하세요. 여러 관리자가 master.cf와 main.cf를 혼동한 적이 있습니다!

현재 master.cf를 백업합니다:

cp /etc/postfix/master.cf /etc/postfix/master.cf-orig

master.cf를 편집합니다:

vi /etc/postfix/master.cf

pickup 서비스 유형 아래에 두 개의 항목을 추가해야 합니다. pickup 서비스는 로컬 메일(로컬은 “이 머신에서”)을 “픽업”하여 전달합니다. 나중에 이 박스가 우리에게 메일할 일일/주간 보고서를 생성할 것이며, 보고서에는 보고서를 스팸으로 분류할 수 있는 내용이 포함될 것이므로, 이는 이 머신에서 생성된 메일에 대한 콘텐츠 필터링을 우회하는 방법입니다.

‘pickup’ 서비스 유형 바로 아래에 다음을 추가합니다:

         -o content_filter=
         -o receive_override_options=no_header_body_checks

완료되면 다음과 같이 보여야 합니다:

pickup    fifo  n       -       -       60      1       pickup
         -o content_filter=
         -o receive_override_options=no_header_body_checks

2.2 main.cf 편집하기

이것은 Postfix의 주요 구성 파일입니다. 자세한 내용은 main.cf 파일의 주석, /usr/local/src/postfix-2.3.3/README_FILES의 문서 또는 Postfix 웹사이트 http://www.postfix.org/documentation.html을 참조하십시오.

먼저 main.cf 파일을 백업해야 합니다.

cp /etc/postfix/main.cf /etc/postfix/main.cf-orig

스팸 필터를 설정하여 모든 메일을 다른 서버로 중계할 것이므로, Postfix가 “중계 도메인 주소 클래스”로 간주하는 것을 사용할 것입니다. 이는 본질적으로 Postfix의 300개 이상의 구성 가능한 매개변수 중에서 우리의 목적에 가장 적합한 소규모 매개변수 그룹을 사용할 것임을 의미합니다. 이 주소 클래스에 대한 설명은 여기에서 확인할 수 있습니다: http://www.postfix.org/ADDRESS_CLASS_README.html#relay_domain_class. 우리는 또한 다른 서버의 주요 MX 역할을 하고 있으므로 이 적절한 섹션을 읽어보십시오: http://www.postfix.org/STANDARD_CONFIGURATION_README.html#backup.

Postfix에서 항목을 조회 테이블에 저장하는 것은 일반적입니다. 우리는 Postfix가 사용할 데이터를 저장하기 위해 여러 해시 테이블을 사용할 것입니다. 이러한 테이블에 일반 텍스트 데이터가 있으면 postmap 명령을 사용하여 Postfix가 궁극적으로 데이터를 검색하는 데 사용할 이진 파일(Berkeley DB 형식)을 생성합니다. 예를 들어, “sampletext”라는 파일이 있고 sampletext를 postmap하면 “sampletext.db”라는 새 파일이 생성됩니다. Postfix는 “sampletext”가 아닌 “sampletext.db”에서 데이터를 검색합니다. Postfix가 데이터를 저장하는 데 사용할 수 있는 다른 유형의 데이터 파일이 1개 이상 있습니다. 해시 테이블은 우리가 사용할 여러 테이블에 적합한 선택이며, pcre(Perl 호환 정규 표현식)는 콘텐츠 필터링 데이터를 보유하기 위해 사용할 몇 개의 테이블에 적합합니다. 가장 간단한 형태의 해시 테이블은 두 개의 데이터 조각, 즉 키와 값으로 구성됩니다. 일반적으로 키/값 쌍이라고 합니다. 키와 값은 공백(일반적으로 공백 또는 탭)으로 구분됩니다. Postfix에서 사용하는 일반 테이블의 데이터는 다음과 같이 보일 것입니다:

[email protected] OK
[email protected] OK
[email protected] OK

추천 읽기: http://www.postfix.org/DATABASE_README.html.

우리는 vi로 파일에 매개변수를 입력하는 대신 postconf를 사용하여 main.cf를 편집할 것입니다. “” 기호는 명령 상자에 표시되는 대로 필요합니다.

2.2.1 alias_maps

여기에서 기본 설정을 수정해야 합니다:

postconf -e "alias_maps = hash:/etc/aliases"

별칭 파일을 생성합니다:

newaliases

이제 /etc/ 디렉토리에 aliases.db 파일이 생성된 것을 볼 수 있습니다. Postfix는 일반적으로 이를 읽습니다. 이제 적절한 별칭 파일이 있으므로 모든 메일을 중계하도록 시스템을 구성할 것이기 때문에 별칭 파일은 Postfix에 의해 무시됩니다. 대신 주소 리디렉션을 위해 virtual_alias_maps를 설정할 것입니다. /etc/aliases 파일이 없으면 다른 프로그램이 제대로 작동하지 않을 수 있으므로 제거하지 마십시오.

2.2.2 myorigin

이 머신에서 생성된 메일의 도메인 이름입니다. 예를 들어, cron이 “[email protected]”로 메일을 보낼 경우 “[email protected]”에서 온 것처럼 보입니다.

postconf -e "myorigin = example.com"

위의 모든 명령에서 “example.com”과 같은 예제 매개변수를 자신의 특정 값으로 바꾸십시오.

2.2.3 myhostname

Postfix 시스템을 실행하는 머신의 완전한 도메인 이름(FQDN)입니다.

postconf -e "myhostname = sfa.example.com"

2.2.4 mynetworks

신뢰하는 머신이며, 모든 목적지로 메일을 중계할 것입니다. 일반적으로 이는 내 LAN 또는 하나 또는 몇 개의 신뢰할 수 있는 내부 메일 서버로 설정됩니다. relay_domains와 함께, 이는 “오픈 릴레이”가 되는 가능성을 피하기 위해 올바르게 설정해야 하는 중요한 것입니다. 즉, 귀하의 박스는 비즈니스와 관련이 없는 도메인으로 메일을 수락하고 전달할 수 있습니다. 오픈 릴레이가 되는 것은 심각한 문제이며, 다양한 인터넷 스팸 방지 목록에 의해 블랙리스트에 올라갈 수 있습니다. 단일 컴퓨터, 여러 개별 컴퓨터 또는 지정된 네트워크의 모든 컴퓨터를 지정할 수 있습니다. IP 주소 앞에 느낌표를 붙여 특정 호스트를 제외할 수도 있습니다. 여러 내부 메일 서버를 처리하거나 여러 머신 및/또는 서브넷이 이 서버를 통해 릴레이하도록 허용하려면 CIDR 형식으로 이 매개변수에 추가하고 네트워크를 다음과 같이 구분하십시오:

postconf -e "mynetworks = 127.0.0.0/8, 222.222.222.222/24, 10.10.10.10/24"

위의 명령은 222.222.222.222/24 및 10.10.10.10/24 네트워크의 머신이 이 박스를 통해 smtp 메일을 릴레이할 수 있도록 허용합니다. 127.0.0.0/8은 로컬 서버가 메일을 보내도록 허용하기 위해 존재합니다. 최소한 이 하나는 포함해야 합니다. 단일 컴퓨터의 IP 주소를 지정할 수도 있습니다. 점선 십진수 넷마스크(예: 255.255.255.240)만 알고 CIDR 형식으로 변환해야 하는 경우 http://www.wildpackets.com/products/free_utilities/ipsubnetcalc/overview를 시도하십시오. (네트워크의 IP 주소를 입력하고 서브넷 정보 탭을 선택한 다음 서브넷 마스크를 선택하면 네트워크는 Subnet ID/Mask Bits가 됩니다.) 또는 http://www.belchfire.net/webtools/cidr_conversion_table.html를 참조하십시오.

이 서버를 통해 릴레이할 네트워크나 컴퓨터가 없다면, 127.0.0.0/8 주소로만 이 명령을 실행하십시오.

2.2.5 message_size_limit

Postfix가 “앞문”으로 수용할 최대 크기 이메일입니다.

postconf -e "message_size_limit = 10485760"

위의 명령은 최대 10MB의 이메일을 허용하며, 값은 바이트 단위입니다(1010241024). 이보다 큰 메일은 안티바이러스 스캐너(ClamAV)에 의해 우회될 수 있습니다. 10MB보다 큰 메시지를 허용하면 RAM을 주의 깊게 살펴보십시오.

2.2.6 local_transport

로컬 배달 시도에 대한 오류 메시지를 반환합니다.

postconf -e "local_transport = error:No local mail delivery"

2.2.7 mydestination

빈 mydestination은 Postfix에 이 머신이 최종 목적지가 아님을 알려줍니다.

postconf -e "mydestination = "

2.2.8 local_recipient_maps

빈 local_recipient_maps는 Postfix에 로컬 메일박스가 없음을 알려줍니다.

postconf -e "local_recipient_maps = "

2.2.9 virtual_alias_maps

우리의 스팸 필터는 postmaster@yourIP의 메일을 수신할 수 있어야 합니다. 보고서에 따르면, 일부 항목은 실제로 이 기능이 존재할 것으로 기대합니다. 우리는 abuse@yourIP의 메일도 허용할 것입니다. 로컬 메일 배달을 허용하지 않기 때문에, 스팸 필터의 IP 주소로 주소가 지정된 메일은 오류 메시지와 함께 거부됩니다. virtual_alias_maps를 설정하면 이 두 계정으로의 이메일이 내부 주소로 전달될 수 있습니다. Exchange 서버가 “root”, “postmaster” 및 “abuse”로 주소가 지정된 메시지를 수신하도록 설정되어 있는지 확인하십시오.

가상 파일에 대한 참조를 설정합니다:

postconf -e "virtual_alias_maps = hash:/etc/postfix/virtual"

그런 다음 가상 파일을 편집합니다:

vi /etc/postfix/virtual

가상 파일의 맨 위에 다음 두 줄을 추가합니다:

postmaster [email protected]
abuse [email protected]

파일을 저장하고 종료한 다음 Postfix가 사용할 이진 파일을 생성합니다:

postmap /etc/postfix/virtual

2.2.10 relayhost

/etc/postfix/relayhost는 스팸 필터가 아웃바운드 이메일을 어떻게 전송해야 하는지를 알려줍니다. relayhost는 아웃바운드 이메일을 보내기 위해 사용하려는 이메일 서버의 IP 또는 FQDN을 포함합니다. 즉, 비로컬 메일, 즉 우리의 도메인이 아닌 도메인으로 향하는 메일입니다. /etc/postfix/transport 파일과 혼동하지 마십시오. transport는 우리의 로컬 도메인 중 하나로 향하는 수신 메일을 라우팅하는 데 사용됩니다. 잠시 후 transport에 대해 설명하겠습니다.

relayhost가 비어 있거나 구성되지 않은 경우, 우리의 스팸 필터가 그 목적에 사용됩니다.

참고: 대괄호 []는 이 명령에서 필요합니다.
postconf -e "relayhost = [mymailserver.example.com]"

선택적으로 스팸 필터를 아웃바운드 SMTP 서버로 설정할 수 있지만, 먼저 역 DNS 레코드가 설정되어 있어야 하며, 물론 “A” 레코드와 “MX” 레코드도 있어야 다른 서버가 귀하의 메일을 수락합니다. 클라이언트와 다른 SMTP 서버를 스팸 필터를 아웃바운드 메일로 사용하도록 재구성하면 해당 메일은 수신 메일과 동일한 스캔 프로세스를 거치게 됩니다(이를 방지하는 멋진 조정을 찾지 않는 한). 이러한 것이 아직 설정되지 않았다면, 현재 작동 중인 아웃바운드 메일 서버로 relayhost를 임시로 구성하는 것이 매우 유용합니다.

또한 지정한 relayhost가 이 머신에서 이메일을 수락하도록 구성되어 있는지 확인하고, 그 머신이 이 머신을 아웃바운드 메일로 사용하고 있지 않은지 확인하십시오(루프가 발생할 수 있습니다!).

2.2.11 relay_recipient_maps

우리는 수신할 모든 도메인에서 모든 사용자의 테이블을 구축할 것입니다. 이 테이블은 우리 도메인에서 존재하지 않는 사용자에게 주소가 지정된 메일을 거부하는 데 사용됩니다. 지금은 테이블의 구조만 설정할 것입니다. Exchange를 사용하는 경우 relay_recipients 테이블을 구축하는 프로세스를 자동화하는 방법이 설명된 HOWTO가 있습니다. 최근 스패머들이 허수 사용자 이름을 사용하여 도메인에 수천 개의 메시지를 보내는 사전 공격을 시작하는 것이 매우 일반적입니다. 스팸 필터는 이러한 모든 메시지를 처리해야 하므로, relay_recipients 테이블에 유효한 사용자를 입력하지 않으면 안 됩니다. 이 파일을 변경하는 방법을 아는 사람이 조직 내에 자신뿐만 아니라 다른 사람도 있다는 것을 확실히 하십시오. 스팸 필터가 작동하게 되면 자동화하는 방법으로 돌아올 것입니다. 관리 가능한 수의 사용자가 있는 경우 수동으로 입력하십시오.

데이터를 저장할 파일에 대한 참조를 설정합니다:

postconf -e "relay_recipient_maps = hash:/etc/postfix/relay_recipients"

그런 다음 relay_recipients를 편집합니다:

vi /etc/postfix/relay_recipients

현재로서는 우리 도메인에서 모든 사용자의 메일을 수신할 것이므로, 다음 형식으로 수신할 도메인을 입력합니다:

@example.com OK
@example2.com OK
@example3.com OK

그런 다음 Postfix가 사용할 이진 파일을 생성합니다:

postmap /etc/postfix/relay_recipients

위의 항목은 임시입니다. 이는 귀하의 도메인으로 메일을 허용하는 와일드카드입니다. 가까운 미래에 위의 항목을 제거하고 유효한 수신자의 이메일 주소로 교체해야 합니다. relay_recipients 파일에 각 사용자를 개별적으로 입력할 준비가 되면, 먼저 도메인 내 모든 사용자에게 메일을 허용하는 데이터를 제거(또는 주석 처리)한 다음, 각 사용자를 다음 형식으로 개별적으로 나열합니다:

[email protected] OK
[email protected] OK
[email protected] OK

사실, 이 특정 파일에서 각 사용자 뒤에 나열된 값 “OK”는 아무것도 사용되지 않지만, 해시 테이블은 키 뒤에 값이 필요하므로 무엇인가 있어야 합니다. 이 파일에서 [email protected]를 제거하면 인터넷 사용자가 [email protected]로 메일을 보내는 것을 방지할 수 있지만, 귀하의 서버 중 일부가 이 머신을 사용하여 root에게 메일을 보내야 하는 경우에는 그렇게 하지 마십시오. Exchange를 사용하는 경우 HOWTO가 있습니다. Exchange를 사용하지 않더라도 파일 전송에 관한 정보가 유용하다고 생각했습니다. http://www2.origogeneris.com:4000/relay_recipients.html - http://www-personal.umich.edu/~malth/gaptuning/postfix/ - http://www.unixwiz.net/techtips/postfix-exchange-users.html - http://postfix.state-of-mind.de/patrick.koetter/mailrelay/ - http://doc.nettools.ru/Unix/Postfix&intserver/

2.2.12 transport_maps

Postfix가 transport 파일을 찾는 위치를 알려줍니다. transport 파일을 사용하여 Postfix가 우리 도메인에 대한 유효한 메일을 어디로 전달해야 하는지를 알려줍니다. transport 설정은 relay_recipients 설정과 유사합니다.

main.cf에서 이에 대한 참조를 생성합니다:

postconf -e "transport_maps = hash:/etc/postfix/transport"

그런 다음 transport를 편집합니다:

vi /etc/postfix/transport

메일을 처리할 각 도메인에 대해 1개의 새 줄을 추가합니다. 아래 예제와 유사합니다. IP 주소는 우리 도메인으로 주소가 지정된 메시지의 최종 목적지 서버의 IP 주소입니다(우리 Exchange 서버). 이 항목을 파일의 어디에 배치하든 상관없지만, 저는 맨 위에 두는 것을 좋아합니다.

example1.com smtp:[10.10.10.100]
example2.com smtp:[10.10.10.101]
example3.com smtp:[10.10.10.102]

이 줄에는 대괄호를 포함해야 합니다!). IP 주소 대신 FQDN 호스트 이름을 사용할 수도 있습니다(예: smtp:[exchange1.example.com]).

이제 Postfix가 사용할 이진 파일을 생성합니다:

postmap /etc/postfix/transport

2.2.13 relay_domains

이 시스템이 메일을 중계할 목적지 도메인(및 해당 하위 도메인)입니다. 여기에는 메일을 수신할 책임이 있는 도메인만 나열해야 합니다. 이러한 도메인으로 메일을 중계할 수 있도록 허용하는 것 외에도, 이 설정은 여기 나열되지 않은 도메인으로 메일을 중계하지 않음을 의미하므로, 스팸 필터가 오픈 릴레이가 되는 것을 방지하는 데 중요한 구성 요소입니다.

postconf -e "relay_domains = hash:/etc/postfix/relay_domains"

relay_domains를 편집합니다:

vi /etc/postfix/relay_domains

메일을 처리할 각 도메인에 대해 1개의 새 줄을 추가합니다. 아래 예제와 유사합니다:

example1.com OK
example2.com OK
example3.com OK

이 파일은 현재 relay_recipients와 매우 유사한 형식을 가지고 있으므로 두 파일을 혼동하지 마십시오. 이 파일에는 도메인 이름 앞에 ‘@’가 있을 수 없습니다. 이 점을 언급하고 싶었습니다. 매우 똑똑한 사람들이 이렇게 한 적이 있습니다…

그런 다음 Postfix가 사용할 이진 파일을 생성합니다:

postmap /etc/postfix/relay_domains
참고: relay_recipients, relay_domains 및 transport는 매우 친숙해질 파일입니다. 도메인에 사용자를 추가하거나 도메인을 추가하거나 목록에서 도메인을 제거해야 할 때마다 이 세 파일을 모두 편집해야 합니다. 편집 후 각 파일에 대해 postmap을 실행하고 'postfix reload'로 Postfix를 재시작하십시오. 마지막 페이지에는 일반 작업에 대한 빠른 참조로 스팸 필터에 복사할 수 있는 README가 포함된 '유지 관리' 부분이 있습니다.

2.2.14 recipient_delimiter

현재 SMTP/POP3/IMAP 서버가 주소 확장을 사용하도록 구성되어 있는 경우(예: [email protected]) recipient_delimiter는 현재 사용자 이름과 주소 확장을 구분하는 구분 기호와 일치하도록 설정해야 합니다. 이는 이메일 클라이언트(MUA)를 사용하여 여러 사람에게 이메일을 보낼 때 사용하는 쉼표와는 관련이 없습니다([email protected], [email protected], [email protected]). GMail을 사용하는 경우 익숙할 수 있습니다. GMail 계정이 있는 경우 이 형식으로 이메일을 보낼 수 있으며, 예를 들어 [email protected]로 이메일을 보내고 GMail에서 ‘testtag’로 태그를 지정하여 받은 편지를 건너뛰도록 필터를 설정할 수 있습니다. 최근에는 이 기능을 사용하여 웹 서비스에 가입할 때 태그를 사용하고 태그에 따라 필터링하는 것이 일반적입니다. 어쨌든, 이 기능이 있다면 알고 있을 것이고, 이 기능이 없다면 “수신자 구분 기호를 사용하지 않습니다” 지침을 따르십시오.

3 일반 설정 - 하나를 선택하십시오.

  1. 수신자 구분 기호를 사용하지 않습니다:
postconf -e "recipient_delimiter = "
  1. 현재 더하기 기호를 사용합니다:
postconf -e "recipient_delimiter = +"
  1. 현재 빼기 기호를 사용합니다:
postconf -e "recipient_delimiter = -"

2.2.15 NAT/프록시 설정 (선택 사항)

(그리고 오직) 귀하가 세상에 제시하는 IP 주소가 스팸 필터의 IP 주소가 아닌 경우(즉, NAT 방화벽이나 프록시 서버 뒤에서 실행되도록 구성된 경우) 다음 두 줄을 main.cf에 추가한 후 proxy_interfaces를 주석 해제하고 구성하십시오(60.50.40.30은 공용 IP 주소를 나타냅니다):

# 여기에 NAT/프록시 외부 주소를 지정하십시오.
#proxy_interfaces = 60.50.40.30
Share: X/Twitter LinkedIn

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

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