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