Боремся со спамом! Reverse DNS Lookup.

Сегодня, после жалоб очередных жалоб сотрудников на SPAM в одном из офисов я обнаружил, что приходят спамовые письма с неправильным именем домена. То есть не совпадение DNS имени сервера и его ip-адреса. Таким образом почему то не было не то что обратной проверки DNS-имени (reverse DNS lookup) но и даже прямой проверки DNS имени (forward DNS lookup) которая включена по умолчанию в tcpserver

И так на сервере был установлен qmail+tcpserver+vpopmail+spamassassin и я начал изучать настройки.

И так, запуск tcpserver-а осуществлялся вроде бы правильно:

# cat /service/qmail-smtpd/run
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
#RBL="/usr/local/bin/rblsmtpd -b -r bl.spamcop.net -r relays.ordb.org"
RBL="/usr/local/bin/rblsmtpd -b -r bl.spamcop.net"
#QMAILQUEUE="/usr/local/bin/qmail-scanner-queue.pl"
#export QMAILQUEUE
#export MFDNSCHECK=""
if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
echo /var/qmail/supervise/qmail-smtpd/run
exit 1
fi
if [ ! -f /var/qmail/control/rcpthosts ]; then
echo "No /var/qmail/control/rcpthosts!"
echo "Refusing to start SMTP listener because it'll create an open relay"
exit 1
fi
exec /usr/local/bin/softlimit -m 20000000 \
/usr/local/bin/tcpserver -v -R -D -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp $RBL /var/qmail/bin/qmail-smtpd 2>&1

Видно, что ключа -H нет, а ключ -h, это режим по умолчанию, который устанавливает переменную $TCPREMOTEHOST при удачном преобразовании имени удаленного почтового сервера. (Ключ -H отменяет ключ -h)

Если мы параноики (а мы параноики) как и написано в man-е:
-p Paranoid. After looking up the remote host name in DNS, look up
the IP addresses in DNS for that host name, and remove the envi-
ronment variable $TCPREMOTEHOST if none of the addresses match
the client’s IP address.

То для обратного преобразования DNS-имени (reverse DNS lookup) добавим ключ -p чтобы получилось следующее:

....................
exec /usr/local/bin/softlimit -m 20000000 \
/usr/local/bin/tcpserver -v -p -R -D -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp $RBL /var/qmail/bin/qmail-smtpd 2>&1

Так с этим разобрались, но по чему же не работает….
Смотрим файл /etc/tcp.smtp

#cat tcp.smtp
127.:allow,RELAYCLIENT="",RBLSMTPD="",LOCALMFCHECK="",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/qmail-queue'
127.0.0.:allow,RELAYCLIENT="",RBLSMTPD="",LOCALMFCHECK="",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/qmail-queue'
81.XXX.XXX.10:allow,RELAYCLIENT="",RBLSMTPD="",LOCALMFCHECK="",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/qmail-queue'
192.168.10.2:allow,RELAYCLIENT="",RBLSMTPD="",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/qmail-queue'
192.168.0.:allow,RELAYCLIENT="",RBLSMTPD="",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/qmail-queue'
172.22.0.:allow,RELAYCLIENT="",RBLSMTPD="",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/qmail-queue'
=:allow,MFDNSCHECK="",HELOCHECK="=",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/simscan',SIMSCAN_DEBUG="2"

И все становится понятно! Администратор забыл добавить запрещающее правило. Должно было быть так:

 ...............
=:allow,MFDNSCHECK="",HELOCHECK="=",QHPSI='clamdscan',QHPSIARG1='--disable-summary',QMAILQUEUE='/var/qmail/bin/simscan',SIMSCAN_DEBUG="2"
:deny

И так разберем:
= означает переменная $TCPREMOTEHOST определена, остальных блокируем.

Осталось пересобрать базу /etc/tcp.smtp.cdb :

# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

Описание ключей tcpserver можно почитать здесь: tcpserver.

One Response to “Боремся со спамом! Reverse DNS Lookup.”

  1. Денис:

    А позвольте вопрос по предпоследней строке. Там где =:allow,MFDNSCHECK=»» …. Не могу понять смысла того, что после запятой, например, MFDNSCHECK=»» и т. д. Как я понимаю tcpserver-у достаточно в конце 2-х строк
    =:allow — разрешает соединение для случая когда переменная $TCPREMOTEHOST определена
    :deny — запрещает соединение для остальных случаев
    Или я не прав?

Leave a Reply