Борьба со спамом средствами IPFW
Пришла мне тут идея отправлять все левые, по мнению мэйлера,
айпишнеги прямиком в IPFW, чтобы как-то
уменьшить (платный) трафик почтового канала. То есть, файрвол получает списаг леваков и режет их уже
на первом пакете, не подпуская к мэйлеру и вообще никуда.
Решение:
# touch /usr/local/etc/postfix/bad-smtp.sh
# chmod 777 /usr/local/etc/postfix/bad-smtp.sh
# ee /usr/local/etc/postfix/bad-smtp.sh
#!/bin/sh
#
/bin/rm /tmp/bad-smtp
/usr/bin/touch /tmp/bad-smtp
nn=$(/sbin/ipfw table 20 list | /usr/bin/grep -c ".*")
dt=$(date "+%d/%m/%Y %H:%M:%S")
/usr/bin/touch /var/log/bad-ipfw.log
/bin/echo $dt $nn >>/var/log/bad-ipfw.log # это просто лог, для первичного анализа
if (/bin/test $nn -gt 16384) # не знаю, каков лимит таблицы IPFW, но думаю так нормально
then # если превысили 16384 то чистим таблицу и юзаем плюсом вчерашний лог
/sbin/ipfw table 20 flush
/usr/bin/grep -J -o -s "NOQUEUE: reject:.*\[...*\]:" /var/log/maillog.0.bz2 |
/usr/bin/grep -o -s -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" >>/tmp/bad-smtp
fi # выделяем отброшенные мейлером IP из его лога
/usr/bin/grep -o -s "NOQUEUE: reject:.*\[...*\]:" /var/log/maillog |
/usr/bin/grep -o -s -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" >>/tmp/bad-smtp
/usr/bin/sort -u /tmp/bad-smtp >/tmp/bad-smtp-sorted # исключаем дубликаты
/bin/echo "#!/bin/sh" >/usr/local/etc/postfix/bad-ipfw.sh # создаем временный командный файл
/bin/echo "#" >>/usr/local/etc/postfix/bad-ipfw.sh
/bin/echo "" >>/usr/local/etc/postfix/bad-ipfw.sh
/usr/bin/sed '/192\.168\.0\.*/d' /tmp/bad-smtp-sorted >/tmp/bad-smtp-sorted2 # локальных не трогаем
/usr/bin/sed 's/^/\/sbin\/ipfw table 20 add /' /tmp/bad-smtp-sorted2
>>/usr/local/etc/postfix/bad-ipfw.sh
/bin/chmod 777 /usr/local/etc/postfix/bad-ipfw.sh
/bin/sh /usr/local/etc/postfix/bad-ipfw.sh # и запускаем его. IPFW сам отсеит дубликаты
Поставил это дело в крон.
# ee /etc/crontab
...
#minute hour mday month wday who command
*/10 * * * * root /usr/local/etc/postfix/bad-smtp.sh
...