Основанный на GeoIP серый список с Exim?
Я использую Sendmail вместе с milter-greylist в течение многих лет на нескольких сайтах.
milter-greylist поддерживает определение правил серого списка на основе поиска в базе данных GeoIP. Это очень удобно для компаний, которые не ведут бизнес на международном уровне. Почти весь спам рассылается с иностранных IP-адресов. Не имеет значения, если легальная (хам) электронная почта с иностранных адресов слегка задерживается. Локальная электронная почта должна поступать без задержек, поэтому для нескольких кодов стран серый список пропускается. Также, если запись SPF совпадает или IP находится в белом списке, серый список пропускается. Это очень просто реализовать в greylist.conf с помощью ловушки milter в sendmail.cf. Это также хорошо для ресурсов почтового сервера, потому что большая часть спама удаляется до того, как он попадет на сервер, и, следовательно, нагрузка на систему, вызванная решениями для фильтрации на основе spamassassin и / или dspam, расположенными ниже по пути доставки, значительно ниже.
Теперь к реальному вопросу:
Как я могу реализовать похожий (т.е. основанный на GeoIP) серый список с Exim?
На меня лежит новая ответственность позаботиться о еще одном почтовом сервере, который запускает Exim и получает большое количество спама. Мне не хочется заново внедрять их систему доставки электронной почты с нуля, но мне определенно нужно что-то делать с нагрузкой, вызванной их объемами спама. К сожалению, exim, похоже, не имеет более милого интерфейса. Также мне не удалось найти решения для серых списков с поддержкой GeoIP для Exim. Я полный нуб с Exim (я могу сделать все с помощью макросов sendmail.cf и sendmail m4).
Я был бы счастлив, если бы реализация этой возможности была возможна с использованием только синтаксиса файла конфигурации exim. В этом случае я бы потратил усилия на его изучение и, возможно, начал бы использовать exim и на других сайтах.
3 ответа
Я отвечаю на свой вопрос сейчас, когда у меня есть решение, которое мне нравится.
Сам Greylisting может быть реализован исключительно с помощью списков контроля доступа Exim, или внешний ACL-помощник может быть подключен к ACL. Есть несколько подходов к этому, которые описаны в другом месте.
Серые списки обычно реализуются в списках контроля доступа, и поэтому в ACL легко добавить внешний поиск IP-адресов для управления поведением серых списков (например, чтобы пропустить серые списки в соответствии с поиском кода страны).
Есть несколько альтернатив для получения кода страны:
- DNSBL поиск с использованием, например, http://countries.nerd.dk/ (как в ответе mailq).
- Импортируйте некоторую базу данных GeoIP в базу данных SQL и сделайте запрос SQL из ACL.
- Реализуйте поиск GeoIP, используя один из нескольких модулей Perl GeoIP, и подключите его в ACL Exim с помощью интерфейса Perl.
- Использовать
dlfunc
библиотека, которая реализует поиск GeoIP в ACL.
Я лично выбрал последний вариант, так как он наиболее эффективен и не зависит от внешних ресурсов. Я реализовал новый dlfunc
библиотека для этой цели, так как ни один из нескольких существующих не имел поддержки IPv6. Моя реализация с простыми примерами доступна по адресу: http://dist.epipe.com/exim/. При реализации этого я узнал о ACL-файлах exim и обнаружил, что они чрезвычайно эффективны для реализации любых политик приема почты.
Теперь можно легко пропустить серый список для определенных стран, добавив правило ACL перед правилами серый список:
warn set acl_c_geoip_country_code = \
${dlfunc{/usr/local/lib/exim4/exim-geoipv6-dlfunc.so}\
{geoip_country_code}{$sender_host_address}}
accept condition = ${if inlist{$acl_c_geoip_country_code}{FI:SE:EE}}
Версии exim старше 4.77 не имеют inlist{
синтаксис. То же самое может быть достигнуто путем изменения второго правила следующим образом:
accept condition = ${if forany{FI:SE:EE}{eq{$item}{$acl_c_geoip_country_code}}}
Это только немного помогает, но есть сервисы GeoIP, которые можно запрашивать через DNS (например, DNSBL). Может быть, вы можете использовать его в качестве основы для принятия решений на основе результата.
Смотрите, например, http://www.netop.org/services/ip-geolocation
Безусловно, лучший способ борьбы со спамом - байесовская фильтрация. Хотя вы можете получить кратковременные преимущества применения других подходов до применения байесовских фильтров, успех байесовской фильтрации зависит от большого количества спама и нежелательной модели, поэтому если вы начнете отказывать в электронных письмах на основе IP-адреса, вы потеряете в обнаружении в долгосрочной перспективе. OTOH должна быть возможность пометить сообщение, а не просто отрицать его.
SPF и RBL также являются проверенными способами предотвращения спама. И поддерживается spamassassin (наряду с байесовской фильтрацией и другими).
Вы смоделировали свои данные, чтобы увидеть, улучшит ли добавление поиска по стране обнаружение спама? По сравнению с хорошо настроенной установкой spamassassin?
Если вы должны идти по этому пути....
Написание milter легко - но IIRC, Exim не поддерживает milters.
Попытка отобразить все допустимые IP-адреса как ACL Exim будет очень трудной.
Таким образом, наиболее практичным способом реализации этого было бы использование MDA, который поддерживает фильтры ввода заголовков (например, procmail), которые затем поступают в spamassassin.