exim file-whitelist

Обсуждаем сайт и форум.

Модератор: f0s

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35271
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

exim file-whitelist

Непрочитанное сообщение Alex Keda » 2020-10-16 16:24:59

было у меня такое: http://www.lissyara.su/articles/freebsd ... +exchange/
и exim самособранный. надоело, поставил из пакетов:

Код: Выделить всё

mail# pkg info | grep exim
exim-ldap2-4.94_2              High performance MTA for Unix systems on the Internet
mail# 
соответсвенно mysql больше нет, а автоматические белые списки хочется

для начала добавляем в транспорты

Код: Выделить всё

# Доставка на удалённые хосты - по SMTP
remote_smtp:
        driver  = smtp
        #connection_max_messages = 1
        transport_filter = /usr/local/etc/exim/scripts/transport.save.to.sh $sender_address $domain $local_part
и пишем скрипт:

Код: Выделить всё

mail# cat /usr/local/etc/exim/scripts/transport.save.to.sh
#!/bin/sh

from=`echo -n $1 | tr "[:upper:]" "[:lower:]"`
user=`echo -n $3 | tr "[:upper:]" "[:lower:]"`
domain=`echo -n $2 | tr "[:upper:]" "[:lower:]"`

base_dir=/var/spool/exim/spam.check.db

# рикошеты, пропускаем
if [ "x$from" = "x" ]
then
	# письмо пришло на STDIN, надо на STDOUT отдать
        cat
        exit 0;
fi

# то что идёт снаружи нашим юзерам - пропускаем
if [ $domain = "my-current-work.ru" -o $domain = "backup1.my-current-work.local" ]
then
	# письмо пришло на STDIN, надо на STDOUT отдать
        cat
        exit 0;
fi

# создаём директорию - кому отпарвлено было
dir=$base_dir/$domain/$user@$domain
mkdir -p $dir

# создаём файл со счётчиками - от кого, еси файл есть - докидываем счётчик на 1
count=1 
if test -s $dir/$from.txt
then
        # считываем текущий счётчик
        count=`cat $dir/$from.txt`
        # докидываем счётчик
        echo `expr $count + 1` > $dir/$from.txt
else
        echo $count > $dir/$from.txt
fi

echo "`date +%Y-%m-%d\ %H:%M:%S` $from  -> $user@$domain, count = $count" >> /tmp/`basename $0`.txt

	# письмо пришло на STDIN, надо на STDOUT отдать
cat

mail# 
и права на него даём

Код: Выделить всё

chmod 755 /usr/local/etc/exim/scripts/transport.save.to.sh
перезапускаем, смотрим что всё хорошо, файлы/директории создаются.

сразу же пишем скрипт очистки:

Код: Выделить всё

mail# cat /usr/local/etc/exim/scripts/clean.db.sh
#!/bin/sh

days=60
base_dir=/var/spool/exim/spam.check.db


find $base_dir -mtime +${days}d -type f -print -delete >>/tmp/`basename $0`.`date +%Y-%m-%d`.txt 2>&1
find $base_dir -type d -exec rmdir "{}" \; >/dev/null 2>&1


mail# 
и делаем исполняемым

также, рисуем скрипт по высасываюнию домено высшего уровня, он у меня тоже используется для проверки:

Код: Выделить всё

mail# cat /usr/local/etc/exim/scripts/fetch.top.levels.domains.sh
#!/bin/sh

cd /tmp || exit 1;
out=/usr/local/etc/exim/db/tlds.list.txt

fetch -o /tmp/$$ https://data.iana.org/TLD/tlds-alpha-by-domain.txt >/dev/null 2>&1
if test -s /tmp/$$
then
        # удаляем файл
        rm -f $out
        # обнуляем файл
        echo "# auto created `date +%Y-%m-%d`" > $out
        # перебираем зоны, составляем файл
        cat /tmp/$$ | tr "[:upper:]" "[:lower:]" |
        {
        while read zone
        do
                if [ "`echo $zone | cut -c 1`" != "#" ]
                then
                        echo '*.'$zone >> $out
                else
                        echo $zone >> $out
                fi
        done
        }
fi

rm -f /tmp/$$

mail# 
делаем mialnull владельцем директории - от него будет планирвщик работать

Код: Выделить всё

chown mailnull /usr/local/etc/exim/db

в acl_check_rcpt меняем места где была база на файлы

Код: Выделить всё

# Проверяем существование зоны из HELO (на этом правиле огребают очков все
# уродцы с HELO типа 'friends' или 'localhost.localdomain')
  warn  condition       = ${lookup{$sender_helo_name}wildlsearch{/usr/local/etc/exim/db/tlds.list.txt}{no}{yes}}
        add_header      = X-spam-stage: non-existence domain in HELO ($sender_helo_name)
        set acl_m0      = ${eval:$acl_m0+150}
        logwrite        = non-existent gTLD domain in HELO: '$sender_helo_name' setting acl_m0 = $acl_m0
и

Код: Выделить всё

# Вводим acl_m2 с нулевым значением
  warn  set acl_m2      = 0
# Проверяем - не было ли писем НА домен отправителя от наших юзеров за 
# последние два месяца (оптимальное, на мой взгляд, число)
# Если были - то потом, в фильтре, обнулим количество насчитанных очков.
  warn  condition       = ${run{/usr/local/etc/exim/scripts/acl.check.rcpt.sh $sender_address_domain $sender_address_local_part $domain $local_part}{yes}{no}}
        set acl_m2      = 1
        logwrite        = STAGE12: $sender_address ==> $local_part@$domain; setting acl_m2 = $acl_m2; WHITELIST for this addresses

# Переменная изменилась лишь если это были те же самые получатели,что и общались
# при внесении данных в транспорте. Для остальных этот домен так и остался
# без изменений. Соответственно надо сделать его и для остальных белым.
  warn  condition       = ${if exists{/var/spool/exim/spam.check.db/$sender_address_domain/whitelited.txt}{yes}{no}}
        set acl_m2      = 1
        logwrite        = STAGE13: $sender_address ==> $local_part@$domain; setting acl_m2 = $acl_m2; WHITELIST for ALL domains
и пишем скрипт

Код: Выделить всё

mail# cat /usr/local/etc/exim/scripts/acl.check.rcpt.sh
#!/bin/sh

sender_address_domain=`echo -n $1 | tr "[:upper:]" "[:lower:]"`
sender_address_local_part=`echo -n $2 | tr "[:upper:]" "[:lower:]"`
domain=`echo -n $3 | tr "[:upper:]" "[:lower:]"`
user=`echo -n $4 | tr "[:upper:]" "[:lower:]"`

base_dir=/var/spool/exim/spam.check.db

# проверяем, писали ли на такой адрес наши юзеры
if test -d $base_dir/$sender_address_domain/$sender_address_local_part@$sender_address_domain
then
        echo "`date +%Y-%m-%d\ %H:%M:%S` $sender_address_local_part@$sender_address_domain  -> $user@$domain, была отправка с нашего адреса на этот" >> /tmp/`basename $0`.txt
        echo "`date +%Y-%m-%d\ %H:%M:%S` $sender_address_local_part@$sender_address_domain  -> $user@$domain" >> $base_dir/$sender_address_domain/whitelited.txt
else
        echo "`date +%Y-%m-%d\ %H:%M:%S` $sender_address_local_part@$sender_address_domain  -> $user@$domain, НЕ было отправок с нашего адреса на этот" >> /tmp/`basename $0`.txt
        exit 1;
fi

mail# 
добавляем скрипты юзеру mailnull в планировщик

Код: Выделить всё

mail# crontab -l -u mailnull

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MAILTO=root

@daily          /usr/local/etc/exim/scripts/clean.db.sh
@daily          /usr/local/etc/exim/scripts/fetch.top.levels.domains.sh



mail# 
делаем все скрипты исполяемыми, я какой-то забыл

Код: Выделить всё

chmod 755 /usr/local/etc/exim/scripts/*

ну как-то так... пока тестирую, сегодня написал

как вариант - базу в tmpfs расположить, но тогда на ребуте будет теряться. если аптаймы большие - то это не особо критично
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/