SpamSnake · 12 min read · Dec 25, 2025
완벽한 SpamSnake - Ubuntu Jeos 10.10 매버릭 미어캣 - 페이지 4
14. KAM
vi /etc/cron.daily/kam.sh다음 내용을 추가하고
chmod +x /etc/cron.daily/kam.sh#!/bin/bash
# Andrew MacLachlan에 의해 수정된 원본 버전
# 초기 재시작 실패 시 추가 MailScanner 재시작 추가
# 정상(성공) 작동을 위해 스크립트를 조용히 실행하도록 설정
# UPDATEMAXDELAY를 600에서 900으로 증가시킴
# 이 값까지의 랜덤 지연을 삽입하여 바이러스 업데이트를 분산시킴
# 1800초 = 30분.
# 이를 0으로 설정하면 비활성화됨.
UPDATEMAXDELAY=0
if [ -f /opt/MailScanner/var/MailScanner ] ; then
. /opt/MailScanner/var/MailScanner
fi
export UPDATEMAXDELAY
if [ "x$UPDATEMAXDELAY" = "x0" ]; then
:
else
logger -p mail.info -t KAM.cf.sh Delaying cron job up to $UPDATEMAXDELAY seconds
perl -e "sleep int(rand($UPDATEMAXDELAY));"
fi
# JKF Fetch KAM.cf
#echo Fetching KAM.cf...
cd /etc/mail/spamassassin
rm -f KAM.cf
wget -O KAM.cf http://www.peregrinehw.com/downloads/SpamAssassin/contrib/KAM.cf > /dev/null 2>&1
if [ "$?" = "0" ]; then
#echo It completed and fetched something
if ( tail -10 KAM.cf | grep -q '^#.*EOF' ); then
# echo It succeeded so make a backup
cp -f KAM.cf KAM.cf.backup
else
echo ERROR: Could not find EOF marker
cp -f KAM.cf.backup KAM.cf
fi
else
echo It failed to complete properly
cp -f KAM.cf.backup KAM.cf
fi
#echo Reloading MailScanner and SpamAssassin configuration rules
/etc/init.d/mailscanner reload > /dev/null 2>&1
if [ $? != 0 ] ; then
echo "MailScanner reload failed - Retrying..."
/etc/init.d/mailscanner force-reload
if [ $? = 0 ] ; then
echo "MailScanner reload succeeded."
else
echo "Stopping MailScanner..."
/etc/init.d/mailscanner stop
echo "Waiting for a minute..."
perl -e "sleep 60;"
echo "Attemping to start MailScanner..."
/etc/init.d/mailscanner start
fi
fi 15. ScamNailer
vi /usr/sbin/update_scamnailer
그리고
chmod +x /usr/sbin/update_scamnailer
참고: *내용은 scamnailer.doc에 있습니다.)
크론에 추가:
@daily /usr/sbin/update_scamnailer &> /dev/null #Update Scamnailer16. Firehol로 SpamSnake 방화벽 설정하기
소개
Firehol은 상태 기반 iptables 패킷 필터링 방화벽 구성기입니다. 추상화되어 있으며, 확장 가능하고, 쉽고 강력합니다. 어떤 종류의 방화벽도 처리할 수 있지만, 가장 중요한 것은 당신이 생각하는 방식으로 구성할 수 있는 수단을 제공합니다.
Firehol 설치
apt-get install fireholFirehol 설정:
vi /etc/default/firehol그리고 다음을 변경:
START_FIREHOL=YESvi /etc/firehol/firehol.conf그리고 다음을 추가:
version 5
# 모든 인터페이스에서 모든 클라이언트 트래픽 수락
interface any internet
protection strong
server "icmp ping ICMP ssh http https telnet webmin dns dcc echo smtp" accept
client all accept이것은 위의 서비스와 관련이 없는 모든 수신 연결을 필터링합니다. 더 무례하게 행동하고 싶다면, ‘protection strong’ 뒤에 다음을 추가하여 차단할 수 있습니다: policy drop
vi /usr/sbin/get-iana다음과 같이 작성하고
chmod +x /usr/sbin/get-iana#!/bin/bash
# $Id: get-iana.sh,v 1.13 2010/09/12 13:55:00 jcb Exp $
#
# $Log: get-iana.sh,v $
# Revision 1.13 2010/09/12 13:55:00 jcb
# 최신 IANA 예약 형식에 맞게 업데이트됨.
#
# Revision 1.12 2008/03/17 22:08:43 ktsaou
# 최신 IANA 예약 형식에 맞게 업데이트됨.
#
# Revision 1.11 2007/06/13 14:40:04 ktsaou
# * 빈 로그 메시지 *
#
# Revision 1.10 2007/05/05 23:38:31 ktsaou
# 외부 정의 지원 추가:
#
# RESERVED_IPS
# PRIVATE_IPS
# MULTICAST_IPS
# UNROUTABLE_IPS
#
# /etc/firehol/의 동일한 이름을 가진 파일에 정의되어 있습니다.
# RESERVED_IPS는 필수입니다(없으면 firehol이 불평합니다,
# 그러나 여전히 작동합니다), 또한 firehol이 얼마나 오래되었는지 확인하는 유일한 파일입니다.
# 90일 이상 오래된 경우 firehol이 다시 불평합니다.
#
# 제공된 get-iana.sh 스크립트를 변경하여 RESERVED_IPS 파일을 생성합니다.
# FireHOL은 이 파일이 없거나 너무 오래된 경우 이 스크립트를 사용하라고 사용자에게 지시합니다.
#
# Revision 1.9 2007/04/29 19:34:11 ktsaou
# * 빈 로그 메시지 *
#
# Revision 1.8 2005/06/02 15:48:52 ktsaou
# 127.0.0.1을 RESERVED_IPS에 포함할 수 있도록 허용
#
# Revision 1.7 2005/05/08 23:27:23 ktsaou
# 현재 IANA 예약에 맞게 RESERVED_IPS 업데이트.
#
# Revision 1.6 2004/01/10 18:44:39 ktsaou
# http://www.vergenet.net/linux/aggregate/를 사용하여 PRIVATE_IPS를 추가로 최적화하고 줄임
#
# 제공된 get-iana.sh는 경로에 .aggregate가 있는 경우 이를 사용합니다.
# (aggregate는 Gentoo에 설치된 이 프로그램의 이름입니다)
#
# Revision 1.5 2003/08/23 23:26:50 ktsaou
# 버그 #793889:
# #!/bin/sh를 #!/bin/bash로 변경하여 FireHOL이
# bash가 /bin/sh에 연결되지 않은 시스템에서 실행될 수 있도록 합니다.
#
# Revision 1.4 2002/10/27 12:44:42 ktsaou
# CVS 테스트
#
#
# IANA에 의해 IPv4 주소 공간 할당을 다운로드하고
# 모든 예약된 주소 공간의 목록을 생성하는 프로그램입니다.
#
IPV4_ADDRESS_SPACE_URL="http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.txt"
# 프로그램은 숫자로 시작하고 슬래시가 있는 모든 행을 일치시킵니다.
# 그 뒤에 또 다른 숫자가 있으며, 다음 패턴도 일치합니다.
# 같은 행에서
IANA_RESERVED="(RESERVED|UNALLOCATED)"
# 위에서 일치하는 행은 무시합니다.
# (즉, RESERVED_IPS에 포함하지 않음)?
#IANA_IGNORE="(Multicast|Private use|Loopback|Local Identification)"
IANA_IGNORE="Multicast"
tempfile="/tmp/iana.$$.$RANDOM"
AGGREGATE="`which aggregate 2>/dev/null`"
if [ -z "${AGGREGATE}" ]
then
AGGREGATE="`which aggregate 2>/dev/null`"
fi
if [ -z "${AGGREGATE}" ]
then
echo >&2
echo >&2
echo >&2 "경고"
echo >&2 "IP 목록을 줄이기 위해 'aggregate'를 설치하십시오."
echo >&2
echo >&2
fi
echo >&2
echo >&2 "IANA IPv4 주소 공간을 가져오는 중:
echo >&2 "${IPV4_ADDRESS_SPACE_URL}"
echo >&2
wget -O - -proxy=off "${IPV4_ADDRESS_SPACE_URL}" |\
egrep " *[0-9]+/[0-9]+.*${IANA_RESERVED}" |\
egrep -vi "${IANA_IGNORE}" |\
sed -e 's:^ *\([0-9]*/[0-9]*\).*:\1:' |\
(
while IFS="/" read range net
do
if [ ! $net -eq 8 ]
then
echo >&2 "Cannot handle network masks of $net bits ($range/$net)"
continue
fi
first=`echo $range | cut -d '-' -f 1`
first=`expr $first + 0`
last=`echo $range | cut -d '-' -f 2`
last=`expr $last + 0`
x=$first
while [ ! $x -gt $last ]
do
# test $x -ne 127 && echo "$x.0.0.0/$net"
echo "$x.0.0.0/$net"
x=$[x + 1]
done
done
) | \
(
if [ ! -z "${AGGREGATE}" -a -x "${AGGREGATE}" ]
then
"${AGGREGATE}"
else
cat
fi
) >"${tempfile}"
echo >&2
echo >&2
echo >&2 "다음 예약된 IP 범위를 찾았습니다:"
printf "RESERVED_IPS=\""
i=0
for x in `cat ${tempfile}`
do
i=$[i + 1]
printf "${x} "
done
printf "\"\n"
if [ $i -eq 0 ]
then
echo >&2
echo >&2
echo >&2 "예약된 IP를 찾지 못했습니다."
echo >&2 "파일 형식이 변경되었거나 URL을 가져올 수 없습니다."
echo >&2
rm -f ${tempfile}
exit 1
fi
echo >&2
echo >&2
echo >&2 "가져온 목록과 /etc/firehol/RESERVED_IPS에 설치된 목록 간의 차이:"
echo >&2 "# diff /etc/firehol/RESERVED_IPS ${tempfile}"
diff /etc/firehol/RESERVED_IPS ${tempfile}
if [ $? -eq 0 ]
then
echo >&2
echo >&2 "차이가 발견되지 않았습니다."
echo >&2
rm -f ${tempfile}
exit 0
fi
echo >&2
echo >&2
echo >&2 "이 목록을 /etc/firehol/RESERVED_IPS에 저장하시겠습니까?"
echo >&2 "그래서 FireHOL이 이제부터 자동으로 사용할 수 있습니다?"
echo >&2
while [ 1 = 1 ]
do
printf >&2 "예 또는 아니오 > "
read x
case "${x}" in
yes) cp -f /etc/firehol/RESERVED_IPS /etc/firehol/RESERVED_IPS.old 2>/dev/null
cat "${tempfile}" >/etc/firehol/RESERVED_IPS || exit 1
echo >&2 "새로운 RESERVED_IPS가 '/etc/firehol/RESERVED_IPS'에 기록되었습니다."
echo "Firehol이 이제 재시작됩니다."
sleep 3
/etc/init.d/firehol restart
break
;;
no)
echo >&2 "아무것도 저장하지 않았습니다."
break
;;
*) echo >&2 "'${x}'를 이해할 수 없습니다."
;;
esac
done
rm -f ${tempfile}vi /usr/sbin/update-iana다음 내용을 작성하고
chmod +x /usr/sbin/update-iana#!/bin/sh
/usr/sbin/get-iana < /etc/firehol/get-iana-answerfilevi /etc/firehol/get-iana-answerfile다음 내용을 작성:
yesRESERVED_IPS를 업데이트하기 위해 스크립트를 실행:
/usr/sbin/update-iana이제 서버가 허용한 서비스에 대해서만 연결을 수락하도록 설정되었습니다.
크론에 추가:
@monthly /usr/sbin/update-iana &> /dev/null #Update firehol reserved ips17. 릴레이 수신자 적용
다음 지침은 Microsoft Exchange 2000 또는 Microsoft Exchange 2003을 사용하는 사람들을 위한 것입니다.
이 페이지에서는 메일 게이트웨이를 구성하여 Exchange 시스템에서 유효한 수신자 이메일 주소 목록을 주기적으로 가져오는 방법을 설명합니다. 이렇게 하면 서버가 잘못된 주소로 발송된 이메일을 자동으로 거부하도록 구성할 수 있습니다. 이는 Exchange 서버의 부하를 줄이고, Postfix 서버의 스팸 및 바이러스 스캔을 수행할 필요가 없으므로 부하를 줄입니다.
종속성 설치
perl 모듈 Net::LDAP 설치:
perl -MCPAN -e shell
install Net::LDAPvi /usr/bin/getadsmtp.pl다음과 같이 작성:
#!/usr/bin/perl -T -w
# 이 스크립트는 Active Directory에서 모든 사용자의 SMTP 주소를 가져옵니다.
# (기본 및 보조 이메일 주소 포함) 그리고 이를
# Postfix가 relay_recipient_maps와 함께 사용하는 형식인 "[email protected] OK"로 나열합니다.
# 위의 perl 경로를 다시 확인하십시오.
# Net::LDAP가 설치되어 있어야 합니다. 설치하려면 셸에서
# "perl -MCPAN -e shell"을 입력한 다음 "install Net::LDAP"을 입력하십시오.
use Net::LDAP;
use Net::LDAP::Control::Paged;
use Net::LDAP::Constant ( "LDAP_CONTROL_PAGED" );
# 출력 파일의 경로/이름을 입력하십시오.
$VALID = "/etc/postfix/relay_recipients";
open VALID, "> $VALID" or die "CANNOT OPEN $VALID $!";
# Active Directory 도메인 컨트롤러의 FQDN을 아래에 입력하십시오.
$dc1="domaincontroller1.example.com";
$dc2="domaincontroller2.example.com";
# 사용자 기반의 LDAP 컨테이너를 입력하십시오.
# 구문은 CN=Users,dc=example,dc=com입니다.
# 이는 Windows 2000 지원 도구를 설치한 후
# ADSI 편집기를 실행하여 찾을 수 있습니다.
# ADSI 편집기에서 "Domain NC [domaincontroller1.example.com]"를 확장하면
# 예를 들어 DC=example,DC=com을 볼 수 있습니다(이것이 기본입니다).
# 사용자 컨테이너는 오른쪽 창에
# CN=Users로 지정됩니다. 이는 스키마에 따라 다릅니다(이것이 컨테이너입니다).
# ADSI 편집기에서 사용자 폴더의 "속성"을 클릭하고
# "경로" 값을 검사하여 다시 확인할 수 있습니다. 예를 들어:
# LDAP://domaincontroller1.example.com/CN=Users,DC=example,DC=com
# 이는 $hqbase="cn=Users,dc=example,dc=com"이 됩니다.
# 참고: $hqbase="dc=example,dc=com"만 사용할 수도 있습니다.
$hqbase="cn=Users,dc=example,dc=com";
# Active Directory에서 유효한 사용자의 사용자 이름 및 비밀번호를 입력하십시오.
# 사용자 이름은 cn=username,cn=Users,dc=example,dc=com 형식이어야 합니다.
# 사용자의 비밀번호가 만료되지 않도록 하십시오. 이 사용자는
# 특별한 권한이 필요하지 않습니다.
# ADSI 편집기에서 사용자의 "속성"을 클릭하고
# "경로" 값을 검사하여 다시 확인할 수 있습니다. 예를 들어:
# LDAP://domaincontroller1.example.com/CN=user,CN=Users,DC=example,DC=com
# 이는 $user="cn=user,cn=Users,dc=example,dc=com"이 됩니다.
# 참고: UPN 로그인도 사용할 수 있습니다: "user\@example.com"
$user="cn=user,cn=Users,dc=example,dc=com";
$passwd="password";
# Active Directory 도메인 컨트롤러에 연결
$noldapserver=0;
$ldap = Net::LDAP->new($dc1) or
$noldapserver=1;
if ($noldapserver == 1) {
$ldap = Net::LDAP->new($dc2) or
die "지정된 도메인 컨트롤러에 연결하는 중 오류 발생 $@ \n";
}
$mesg = $ldap->bind ( dn => $user,
password =>$passwd);
if ( $mesg->code()) {
die ("오류:", $mesg->error_text((),"\n"));
}
# 각 페이지 라운드에서 가져올 LDAP 쿼리 결과 수
# Active Directory에 대해 1000 미만으로 설정
$page = Net::LDAP::Control::Paged->new( size => 990 );
@args = ( base => $hqbase,
# 연락처, 공용 폴더 등과 같은 객체를 가져오기 위해 조정하십시오.
# 이메일이 있는 사용자에 대한 최소 필터는 다음과 같습니다:
# filter => "(&(sAMAccountName=*)(mail=*))"
filter => "(& (mailnickname=*) (| (&(objectCategory=person)
(objectClass=user)(!(homeMDB=*))(!(msExchHomeServerName=*)))
(&(objectCategory=person)(objectClass=user)(|(homeMDB=*)
(msExchHomeServerName=*)))(&(objectCategory=person)(objectClass=contact))
(objectCategory=group)(objectCategory=publicFolder) ))",
control => [ $page ],
attrs => "proxyAddresses",
);
my $cookie;
while(1) {
# 검색 수행
my $mesg = $ldap->search( @args );
# proxyAddresses 속성에 대한 결과 필터링
foreach my $entry ( $mesg->entries ) {
my $name = $entry->get_value( "cn" );
# LDAP 속성은 다중 값이므로 각 값을 인쇄해야 합니다.
foreach my $mail ( $entry->get_value( "proxyAddresses" ) ) {
# 행이 다음 행 중 하나로 시작하는지 테스트:
# proxyAddresses: [smtp|SMTP]:
# 그리고 이 시작 문자열을 버려서 $mail이 다른 문자 없이 주소만 포함하도록 합니다...
if ( $mail =~ s/^(smtp|SMTP)://gs ) {
print VALID $mail." OK\n";
}
}
}
# LDAP_SUCCESS인 경우에만 계속 진행
$mesg->code and last;
# 페이지 제어에서 쿠키 가져오기
my($resp) = $mesg->control( LDAP_CONTROL_PAGED ) or last;
$cookie = $resp->cookie or last;
# 페이지 제어에서 쿠키 설정
$page->cookie($cookie);
}
if ($cookie) {
# 비정상 종료가 발생했으므로 서버에 더 이상 원하지 않음을 알립니다.
$page->cookie($cookie);
$page->size(0);
$ldap->search( @args );
# 이 시점에서 불행하게 죽는 것도 좋은 생각입니다.
die("LDAP 쿼리 실패");
}
# 아래 출력 파일에 추가 제한, 사용자 등을 추가하십시오.
#print VALID "user\@domain1.com OK\n";
#print VALID "user\@domain2.com 550 사용자 알 수 없음.\n";
#print VALID "domain3.com 550 사용자 존재하지 않음.\n";
close VALID;다음으로 파일의 권한을 설정하여 실행할 수 있도록 합니다:
chmod +x /usr/bin/getadsmtp.pl파일을 편집하여 특정 도메인에 맞게 사용자 정의합니다. 파일이 읽기 전용이므로 vi에서 파일을 저장하려면 :w!를 사용해야 합니다.
- $dc1 및 $dc2를 도메인 컨트롤러 2개의 완전한 도메인 이름 또는 IP 주소로 설정하십시오.
- $hqbase를 이메일 주소를 가져오고자 하는 컨테이너 또는 조직 단위의 LDAP 경로로 설정하십시오.
- $user 및 $passwd를 사용하여 이 정보를 액세스하는 데 사용할 사용자 계정을 지정하십시오. 이 계정은 도메인의 구성원만 필요하므로, 이를 위해 특별히 계정을 설정하는 것이 좋습니다.
스크립트를 실행해 보십시오. 올바르게 작동하면 /etc/postfix/relay_recipients를 생성합니다.
Postfix 서버가 Active Directory 컨트롤러와 방화벽으로 분리되어 있는 경우, Postfix 서버에서 ADC로 TCP 포트 389를 열어야 합니다.
getadsmtp.pl이 시점에서 /etc/postfix/relay_recipients를 편집하여 이 스크립트가 모든 것을 가져오기 때문에 원치 않는 이메일 주소를 삭제할 수 있습니다.
해시 DB를 생성하기 위해 파일을 Postmap합니다.
postmap /etc/postfix/relay_recipients
postfix reload마지막으로, /etc/postfix/relay_recipients.db 파일을 주기적으로 업데이트하고 빌드하기 위해 크론 작업을 설정할 수 있습니다. /usr/bin/update-relay-recipients.sh라는 스크립트를 설정할 수 있습니다: (선택 사항)
vi /usr/bin/update-relay-recipients.sh다음과 같이 작성하고
chmod +x /usr/bin/update-relay_recipients.sh#!/bin/sh
/usr/bin/getadsmtp.pl
postmap /etc/postfix/relay_recipients
postfix reload다음이 /etc/postfix/main.cf 파일에 포함되어 있는지 확인하는 것을 잊지 마십시오:
relay_recipient_maps = hash:/etc/postfix/relay_recipients크론에 추가:
30 2 * * * /usr/bin/update-relay-recipients.sh #Active Directory 주소로 relay_recipients 동기화: 이 크론 작업은 매일 오전 2시 30분에 데이터베이스 파일을 업데이트합니다. 시스템에 새로운 이메일 사용자를 얼마나 자주 추가하는지에 따라 더 자주 실행하거나 실행하지 않을 수 있습니다.
18. Webmin 설치 (선택 사항):
apt-get install perl libnet-ssleay-perl libauthen-pam-perl libio-pty-perl apt-show-versions
cd /tmp && wget http://mirrors.kernel.org/ubuntu/pool/universe/libm/libmd5-perl/libmd5-perl_2.03-1_all.deb
dpkg -i libmd5-perl_2.03-1_all.deb
wget http://downloads.sourceforge.net/project/webadmin/webmin/1.520/webmin_1.520_all.deb
dpkg --install webmin_1.520_all.deb19. alterMIME로 발신 이메일에 자동으로 면책 조항 추가 (선택 사항)
이 튜토리얼에서는 alterMIME을 설치하고 사용하는 방법을 보여줍니다. alterMIME은 이메일에 자동으로 면책 조항을 추가할 수 있는 도구입니다. 이 기사에서는 Ubuntu에서 Postfix 필터로 설치하는 방법을 설명합니다.
alterMIME 설치:
apt-get install altermime다음으로 홈 디렉토리가 /var/spool/filter인 사용자 필터를 생성합니다 - alterMIME은 해당 사용자로 실행됩니다:
useradd -r -c "Postfix Filters" -d /var/spool/filter filter
mkdir /var/spool/filter
chown filter:filter /var/spool/filter
chmod 750 /var/spool/filter그 후, alterMIME을 실행하는 /etc/postfix/disclaimer 스크립트를 생성합니다. Ubuntu의 alterMIME 패키지에는 /etc/postfix/disclaimer로 간단히 복사할 수 있는 샘플 스크립트가 포함되어 있습니다:
cp /usr/share/doc/altermime/examples/postfix_filter.sh /etc/postfix/disclaimer
chgrp filter /etc/postfix/disclaimer
chmod 750 /etc/postfix/disclaimer이 스크립트의 문제는 수신 이메일과 발신 이메일을 구분하지 않으며, 모든 메일에 면책 조항을 추가한다는 것입니다. 일반적으로 면책 조항은 발신 이메일에만 필요하며, 모든 발신자 주소에 대해 필요하지 않습니다. 따라서 /etc/postfix/disclaimer 스크립트를 약간 수정했습니다 - 잠시 후에 다룰 것입니다.
현재 /etc/postfix/disclaimer_addresses 파일을 생성하여 alterMIME이 면책 조항을 추가해야 하는 모든 발신자 이메일 주소(한 줄에 하나)를 보관합니다:
vi /etc/postfix/disclaimer_addresses[email protected]
[email protected]
[email protected]이제 /etc/postfix/disclaimer를 열고 다음과 같이 수정합니다(변경한 부분을 표시했습니다):
vi /etc/postfix/disclaimer#!/bin/sh
# 이들을 지역화하십시오.
INSPECT_DIR=/var/spool/filter
SENDMAIL=/usr/sbin/sendmail
####### 원본 스크립트에서 변경 #######
DISCLAIMER_ADDRESSES=/etc/postfix/disclaimer_addresses
####### 원본 스크립트에서 변경 끝 #######
# 의 종료 코드
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
# 완료되거나 중단할 때 정리합니다.
trap "rm -f in.$$" 0 1 2 3 15
# 처리 시작.
cd $INSPECT_DIR || { echo $INSPECT_DIR 존재하지 않음; exit
$EX_TEMPFAIL; }
cat >in.$$ || { echo 파일에 메일을 저장할 수 없음; exit $EX_TEMPFAIL; }
####### 원본 스크립트에서 변경 #######
# From 주소를 얻습니다.
from_address=`grep -m 1 "From:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1`
if [ `grep -wi ^${from_address}$ ${DISCLAIMER_ADDRESSES}` ]; then
/usr/bin/altermime --input=in.$$ \
--disclaimer=/etc/postfix/disclaimer.txt \
--disclaimer-html=/etc/postfix/disclaimer.txt \
--xheader="X-Copyrighted-Material: Please visit http://www.company.com/privacy.htm" || \
{ echo 메시지 내용이 거부됨; exit $EX_UNAVAILABLE; }
fi
####### 원본 스크립트에서 변경 끝 #######
$SENDMAIL "$@" 다음으로 /etc/postfix/disclaimer.txt라는 텍스트 파일을 생성하여 면책 조항 텍스트를 보관합니다. Ubuntu의 alterMIME 패키지에는 현재 사용할 수 있는 샘플 텍스트가 포함되어 있습니다(물론 원하신다면 수정할 수 있습니다):
cp /usr/share/doc/altermime/examples/disclaimer.txt /etc/postfix/disclaimer.txt마지막으로 Postfix에 /etc/postfix/disclaimer 스크립트를 사용하여 발신 이메일에 면책 조항을 추가하도록 지시해야 합니다. /etc/postfix/master.cf를 열고 smtp 줄에 -o content_filter=dfilt:를 추가합니다:
vi /etc/postfix/master.cf#
# Postfix 마스터 프로세스 구성 파일. 파일 형식에 대한 자세한 내용은
# master(5) 매뉴얼 페이지를 참조하십시오(명령: "man 5 master").
#
# ==========================================================================
# 서비스 유형 개인 비공식 chroot 깨우기 최대 프로세스 명령 + 인수
# (예) (예) (예) (결코) (100)
# ==========================================================================
smtp inet n - - - - smtpd
-o content_filter=dfilt:
[...]같은 파일의 끝에 다음 두 줄을 추가합니다:
[...]
dfilt unix - n n - - pipe
flags=Rq user=filter argv=/etc/postfix/disclaimer -f ${sender} -- ${recipient} 그 후 Postfix를 재시작합니다:
/etc/init.d/postfix restart그게 다입니다! 이제 /etc/postfix/disclaimer_addresses에 나열된 주소에서 발신 이메일에 면책 조항이 추가되어야 합니다.
20. 스크린샷



축하합니다
이제 모든 기능이 포함된 완벽한 SpamSnake를 갖추게 되었습니다 :-)
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.