Немного теории


Публичные спам-базы или «черные списки» IP адресов содержат информацию об IP, которые по каким-либо причинам были признаны недружественными по отношению к пользователям. Не будем углубляться в технологические тонкости; важно, что почтовые программы и сервисы используют информацию из этих и собственных баз для того, чтобы защищать электронные ящики получателей от нежелательной рассылки, от спама.

Суть проблемы


Если ваш IP адрес попал в черный список – адресаты не будут получать ваши электронные письма.

Попадание IP в публичные спам-базы грозит наступлением корпоративного почтового коллапса. Это неприятно, даже если e-mail адресов на домене всего 5 и всех пользователей можно временно «пересадить» на «обычную» почту на Яндексе или Mail.ru. Но, когда к внутреннему почтовому серверу «приколочены» более 50 ящиков, интегрированных с CRM-системой, проблема приобретает катастрофический характер.

Решение


«Знать, чтобы предвидеть; предвидеть, чтобы управлять». О. Конт

Вычислить надвигающуюся угрозу можно и нужно до того, как клиент ощутит на себе карательные меры почтовых серверов, а отдел продаж в панике совершит коллективное линчевание местного админа. Для этого мы создали скрипт автоматического мониторинга IP, оповещающий пользователя о возможных проблемах. В качестве платформы мониторинга выбрали Powershell, а для оповещения использовали zabbix 2.4.

Немного о создании скрипта


Наиболее очевидным вариантом казался парсинг веб страниц известных поисковых систем IP в базах mxtoolbox и 2ip.ru. Для решения этой задачи – использовались технологии .NET и XPATH – наиболее эффективное средство для парсинга XML и WEB, особенно для ненавистников регулярных выражений. Первый блин, в некотором роде, получился комом и после долгого и изнурительного тестирования мы решили отказаться от этого решения. Причиной послужила, прежде всего, зависимость от стороннего сервиса: если создатели площадки поменяют структуру кода, то в лучшем случае нужно будет заново тестировать ПО, в худшем – переписывать код.

После тщательного анализа существующих в данной области технологий и наработок мы пришли к более интересному и практичному решению. Разработка ПО на базе powershell 3.0, которое будет самостоятельно проверять наличие IP в публичных спам-базах.

Как работает?


Проверка IP адреса на факт наличия в черном списке (DNSBL) проводится следующим образом: указывается проверяемый IP в нотации DNS PTR (то есть наоборот «спереди назад») и добавляется имя домена DNSBL сервера. Если ответ от сервера получен, то проверяемый адрес заблокирован: то есть IP замечен в одном или нескольких черных списках. Вне зависимости от специфики ответа (он может быть любым), сам его факт говорит о том, что IP находится в спам-базе.

Немного кода
Код скрипта:
<#
Функция zabbix для отправки данных. Данная функция принимает на вход параметры:
Key - имя ключа, который создается в элементе данных zabbix
Также необходимо задать переменные
$Zabbix_send = указать где находится утилита zabbix_sender
    $zabbix_port = порт zabbix сервера
    $zabbix_server = адрес zabbix сервера
    $zabbix_host = Имя созданого узла сети в zabbix (чувствителен к регистру)


#>
Function Send_Zabbix {


    param (
        [parameter(mandatory=$true)]
        $key,
        
        [parameter(mandatory=$true)]
        [int64]$value
    )
    $Zabbix_send = "C:\zabbix_sender.exe"
    $zabbix_port = "10051"
    $zabbix_server = "10.0.33.31"
    $zabbix_host = "Blacklistcheck"
    echo "$key : $value"
                $cmd = "$Zabbix_send -z $zabbix_server -p $zabbix_port -s $zabbix_host  -k `"$key`" -o $value"
                echo "$cmd"
    Invoke-Expression $cmd 
    
} 

# Место хранения списка адресов для проверки, в формате name,ip
$FilePath = "D:\powershell\blacklist.csv"
# импортируем список в текстовый массив
$iparr = Import-Csv $FilePath
foreach ($ipaddr in $iparr)
{
[string]$IP = $ipaddr.adress
[string]$organization = $ipaddr.organization
$reversedIP = ($IP -split '\.')[3..0] -join '.'

 # заготовленый список спамбаз, по которым будет проходить проверка

$blacklistServers = @(
    "b.barracudacentral.org";
"bl.deadbeef.com";
"bl.emailbasura.org";
"bl.spamcannibal.org";
"bl.spamcop.net";
"blackholes.five-ten-sg.com";
"blacklist.woody.ch";
"bogons.cymru.com";
"cbl.abuseat.org";
"cdl.anti-spam.org.cn";
"combined.abuse.ch";
"combined.rbl.msrbl.net";
"db.wpbl.info";
"dnsbl-1.uceprotect.net";
"dnsbl-2.uceprotect.net";
"dnsbl-3.uceprotect.net";
"dnsbl.cyberlogic.net";
"dnsbl.inps.de";
"dnsbl.njabl.org";
"dnsbl.sorbs.net";
"drone.abuse.ch";
"drone.abuse.ch";
"duinv.aupads.org";
"dul.dnsbl.sorbs.net";
"dul.ru";
"dyna.spamrats.com";
"dynip.rothen.com";
"http.dnsbl.sorbs.net";
"images.rbl.msrbl.net";
"ips.backscatterer.org";
"ix.dnsbl.manitu.net";
"korea.services.net";
"misc.dnsbl.sorbs.net";
"noptr.spamrats.com";
"ohps.dnsbl.net.au";
"omrs.dnsbl.net.au";
"orvedb.aupads.org";
"osps.dnsbl.net.au";
"osrs.dnsbl.net.au";
"owfs.dnsbl.net.au";
"owps.dnsbl.net.au";
"pbl.spamhaus.org";
"phishing.rbl.msrbl.net";
"probes.dnsbl.net.au";
"proxy.bl.gweep.ca";
"proxy.block.transip.nl";
"psbl.surriel.com";
"rbl.interserver.net";
"rdts.dnsbl.net.au";
"relays.bl.gweep.ca";
"relays.bl.kundenserver.de";
"relays.nether.net";
"residential.block.transip.nl";
"ricn.dnsbl.net.au";
"rmst.dnsbl.net.au";
"sbl.spamhaus.org";
"short.rbl.jp";
"smtp.dnsbl.sorbs.net";
"socks.dnsbl.sorbs.net";
"spam.abuse.ch";
"spam.dnsbl.sorbs.net";
"spam.rbl.msrbl.net";
"spam.spamrats.com";
"spamlist.or.kr";
"spamrbl.imp.ch";
"t3direct.dnsbl.net.au";
"tor.dnsbl.sectoor.de";
"torserver.tor.dnsbl.sectoor.de";
"ubl.lashback.com";
"ubl.unsubscore.com";
"virbl.bit.nl";
"virus.rbl.jp";
"virus.rbl.msrbl.net";
"web.dnsbl.sorbs.net";
"wormrbl.imp.ch";
"xbl.spamhaus.org";
"zen.spamhaus.org";
"zombie.dnsbl.sorbs.net"
)


$blacklistedOn = @()


foreach ($server in $blacklistServers)
{
    $fqdn = "$reversedIP.$server"

    try
    {
        $null = [System.Net.Dns]::GetHostEntry($fqdn)
        $blacklistedOn += $server
    }
    catch { }
    

}

if ($blacklistedOn.Count -gt 0)
{
   
    Write-Host "$organization is blacklisted on the following servers: $($blacklistedOn -join ', ')"
    send_zabbix -key $organization -value 1
}
else
{
    Write-Host "$organization is not currently blacklisted on any server."
    send_zabbix -key $organization -value 0
  
    }
  } 


В zabbix данные передаются через траппер. Для использования элемента данных траппера мы должны:

— иметь в Zabbix настроенный элемент данных траппер
— отправлять данные в Zabbix.

Создадим хост blacklistcheck:



Теперь необходимо настроить траппер:

Создаем элемент данных.

Имя – может быть любым
Ключ – основной элемент при создании траппера, данный элемент имеет зависимость от регистра. Ключ KEY и key это два разных ключа.
Тип информации: есть 3 варианта, подходящие под нашу задачу: число, символ или текст. Но, поскольку мы исключили регулярные выражения, то текстовым массивам предпочли целочисленное значение.
Тип данных – логический; нам важно 2 значения IP: присутствует (1), либо не присутствует в спам-листах (0).
Отображение значений можно оставить как есть, а можно создать свое преобразование, примерно следующего содержания: 1= ip is listing, 0 = ip isn`t listing – на работу скрипта данные значения не влияют, зато визуализация информации в zabbix получается интересной.



После этого элемент данных готов принимать значения. Можно выполнить проверку через программу zabbix_sender.

В случае корректной работы будет получен подобный результат:

Результат zabbix sender
C:\>zabbix_sender.exe -z 10.0.33.31 -p 10051 -s Blacklistcheck -k fn -o 1 -vv
zabbix_sender.exe [14276]: DEBUG: answer [{«response»:«success»,«info»:«processe
d: 1; failed: 0; total: 1; seconds spent: 0.000066»}]
info from server: «processed: 1; failed: 0; total: 1; seconds spent: 0.000066»
sent: 1; skipped: 0; total: 1

Для просмотра диагностических данных используется параметр –vv.
Скорость проверки одного IP составляет не более 3-х минут.
Далее необходимо настроить триггер для оповещения.



Имя можно задать любое. Выражение соответствует изменению состояния элемента данных с 0 на 1. В случае срабатывания триггера в основной панели zabbix появится оповещение.



Практика использования


Мы создали компактный, хорошо работающий скрипт, который автоматически оповещает клиента о возможных проблемах в работе почтовой системы. Согласитесь, что профилактика этого вопроса куда приятнее и спокойнее по сравнению с необходимостью решать задачу «отвалившейся» почты в условиях цейтнота.

Мы внедрили данное решение у наших клиентов, и оно хорошо себя показывает – особенно в компаниях, где отдел продаж работает через рассылку коммерческих. Данный скрипт позволяет быстро локализовать проблему, вызвавшую попадание IP в спам-базу, и без ущерба продолжить работу.

Желаем, чтобы количество взлётов электронных писем совпадало с количеством приземлений!

Комментарии (8)


  1. ToxoT
    19.09.2015 16:45

    dnsbl.ahbl.org, tor.ahbl.org
    вот эти два думаю можно убрать из списка спам листов т.к на любой ip они возвращают результат.


    1. socialfnby
      22.09.2015 15:02

      Спасибо, исправил.


  1. TaHKucT
    20.09.2015 04:50
    +3

    Почти тоже самое, но на bash
    #!/usr/bin/env bash
    
    if [ -z $1 ]; then echo -e "IP is unset\nrun \"$0 ip\""; exit 1 ; fi
    
    IFS='.' read -ra ADDR <<< $1
    
    Blacklist=("b.barracudacentral.org" "bl.deadbeef.com" "bl.emailbasura.org" "bl.spamcannibal.org" "bl.spamcop.net" "blackholes.five-ten-sg.com" "blacklist.woody.ch" "bogons.cymru.com" "cbl.abuseat.org" "cdl.anti-spam.org.cn" "combined.abuse.ch" "combined.rbl.msrbl.net" "db.wpbl.info" "dnsbl-1.uceprotect.net" "dnsbl-2.uceprotect.net" "dnsbl-3.uceprotect.net" "dnsbl.cyberlogic.net" "dnsbl.inps.de" "dnsbl.njabl.org" "dnsbl.sorbs.net" "drone.abuse.ch" "drone.abuse.ch" "duinv.aupads.org" "dul.dnsbl.sorbs.net" "dul.ru" "dyna.spamrats.com" "dynip.rothen.com" "http.dnsbl.sorbs.net" "images.rbl.msrbl.net" "ips.backscatterer.org" "ix.dnsbl.manitu.net" "korea.services.net" "misc.dnsbl.sorbs.net" "noptr.spamrats.com" "ohps.dnsbl.net.au" "omrs.dnsbl.net.au" "orvedb.aupads.org" "osps.dnsbl.net.au" "osrs.dnsbl.net.au" "owfs.dnsbl.net.au" "owps.dnsbl.net.au" "pbl.spamhaus.org" "phishing.rbl.msrbl.net" "probes.dnsbl.net.au" "proxy.bl.gweep.ca" "proxy.block.transip.nl" "psbl.surriel.com" "rbl.interserver.net" "rdts.dnsbl.net.au" "relays.bl.gweep.ca" "relays.bl.kundenserver.de" "relays.nether.net" "residential.block.transip.nl" "ricn.dnsbl.net.au" "rmst.dnsbl.net.au" "sbl.spamhaus.org" "short.rbl.jp" "smtp.dnsbl.sorbs.net" "socks.dnsbl.sorbs.net" "spam.abuse.ch" "spam.dnsbl.sorbs.net" "spam.rbl.msrbl.net" "spam.spamrats.com" "spamlist.or.kr" "spamrbl.imp.ch" "t3direct.dnsbl.net.au" "tor.dnsbl.sectoor.de" "torserver.tor.dnsbl.sectoor.de" "ubl.lashback.com" "ubl.unsubscore.com" "virbl.bit.nl" "virus.rbl.jp" "virus.rbl.msrbl.net" "web.dnsbl.sorbs.net" "wormrbl.imp.ch" "xbl.spamhaus.org" "zen.spamhaus.org" "zombie.dnsbl.sorbs.net")
    
    
    for i in "${Blacklist[@]}"; do echo ${ADDR[3]}.${ADDR[2]}.${ADDR[1]}.${ADDR[0]}.$i ; done | xargs -L1 -P${#Blacklist[@]}  host -W5 | grep -v 'not found\|connection timed out' | wc -l 
    


    1. TaHKucT
      20.09.2015 05:36
      +1

      Я вспомнил за что я не люблю баш, и почему я обычно не пишу на нем больше 5 строк. Вариант выше я тестировал на убунте, а zabbix-server у меня на centos6, и там все сломалось в районе 3тей строки кода.

      Исправленный вариант, проверенный на Centos6(bash 4.1.2) и mint17.1(bash 4.3.11)
      #!/usr/bin/env bash
      
      if [ -z $1 ]; then echo -e "IP is unset\nrun \"$0 ip\""; exit 1 ; fi
      
      IFS='.' ADDR=($1)
      IFS=' '
      Blacklist=("b.barracudacentral.org" "bl.deadbeef.com" "bl.emailbasura.org" "bl.spamcannibal.org" "bl.spamcop.net" "blackholes.five-ten-sg.com" "blacklist.woody.ch" "bogons.cymru.com" "cbl.abuseat.org" "cdl.anti-spam.org.cn" "combined.abuse.ch" "combined.rbl.msrbl.net" "db.wpbl.info" "dnsbl-1.uceprotect.net" "dnsbl-2.uceprotect.net" "dnsbl-3.uceprotect.net" "dnsbl.cyberlogic.net" "dnsbl.inps.de" "dnsbl.njabl.org" "dnsbl.sorbs.net" "drone.abuse.ch" "drone.abuse.ch" "duinv.aupads.org" "dul.dnsbl.sorbs.net" "dul.ru" "dyna.spamrats.com" "dynip.rothen.com" "http.dnsbl.sorbs.net" "images.rbl.msrbl.net" "ips.backscatterer.org" "ix.dnsbl.manitu.net" "korea.services.net" "misc.dnsbl.sorbs.net" "noptr.spamrats.com" "ohps.dnsbl.net.au" "omrs.dnsbl.net.au" "orvedb.aupads.org" "osps.dnsbl.net.au" "osrs.dnsbl.net.au" "owfs.dnsbl.net.au" "owps.dnsbl.net.au" "pbl.spamhaus.org" "phishing.rbl.msrbl.net" "probes.dnsbl.net.au" "proxy.bl.gweep.ca" "proxy.block.transip.nl" "psbl.surriel.com" "rbl.interserver.net" "rdts.dnsbl.net.au" "relays.bl.gweep.ca" "relays.bl.kundenserver.de" "relays.nether.net" "residential.block.transip.nl" "ricn.dnsbl.net.au" "rmst.dnsbl.net.au" "sbl.spamhaus.org" "short.rbl.jp" "smtp.dnsbl.sorbs.net" "socks.dnsbl.sorbs.net" "spam.abuse.ch" "spam.dnsbl.sorbs.net" "spam.rbl.msrbl.net" "spam.spamrats.com" "spamlist.or.kr" "spamrbl.imp.ch" "t3direct.dnsbl.net.au" "tor.dnsbl.sectoor.de" "torserver.tor.dnsbl.sectoor.de" "ubl.lashback.com" "ubl.unsubscore.com" "virbl.bit.nl" "virus.rbl.jp" "virus.rbl.msrbl.net" "web.dnsbl.sorbs.net" "wormrbl.imp.ch" "xbl.spamhaus.org" "zen.spamhaus.org" "zombie.dnsbl.sorbs.net")
      
      for i in "${Blacklist[@]}"; do echo ${ADDR[3]}.${ADDR[2]}.${ADDR[1]}.${ADDR[0]}.$i ; done | xargs -L1 -P${#Blacklist[@]}  host -W5 | grep -v 'not found\|connection timed out' | wc -l 


      1. ToxoT
        21.09.2015 00:57
        +2

        Не забывайте менять Timeout для Внешних проверок, по умолчанию 3 секунды.


    1. socialfnby
      22.09.2015 15:12

      Вариант написанный на bash так же есть, ваш метод немного элегантней. Почему оставили у себя на powershell есть несколько причин:

      1. Огромное количество ресурсов которые мониторятся в zabbix, дополнительной нагрузки решили по возможности избегать
      2. Есть пара компьютеров которые выполняют систематические работы и находятся под наблюдением, выполняют данный скрипт и отправляют данные в zabbix
      3. Банальная любовь к powershell.

      Так же опубликовали метод с PS для простого и понятного принципа работы трапера.


      1. TaHKucT
        22.09.2015 19:46

        1. Там 80 dns-запросов на 1 проверяемый ip. Допустим у нас стоит проверка каждого ip раз в час, а адресов у нас всего 1000, тогда это вызовет дополнительно ~22 dns-запроса в секунду, причем не рекурсивых, а к локальному резолверу. Если это создаст заметную нагрузку на zabbix-server, то где то раньше что то пошло не так и оптимизировать нужно «там», а не «тут»
        2. К сожалению не у всех владельцев zabbix'а есть дополнительный windows сервере, на который можно было бы повесить эту проверку.



  1. nefelim4ag
    24.09.2015 15:42
    +1

    Полноценный скрипт, с автодискавери и прочими плюшками, должно работать на всём где есть bash
    Опрашивает 100500 хостов, можно руками указывать у какого DNS спрашивать, встроенный balance RR по DNS серверам и т.п.
    Шаблон в заббиксе придумать можно самому

    Заголовок спойлера
    #!/bin/bash

    blacklist_servers_fast=(
    zen.spamhaus.org dnsbl-0.uceprotect.net
    dnsbl-1.uceprotect.net dnsbl-2.uceprotect.net
    dnsbl-3.uceprotect.net bl.blocklist.de
    )

    blacklist_servers_full=(
    ${blacklist_servers_fast[@]}
    0spam.fusionzero.com 0spam-killlist.fusionzero.com
    0spamtrust.fusionzero.com 0spamurl.fusionzero.com
    abuse.rfc-clueless.org access.redhawk.org
    accredit.habeas.com all.dnsbl.bit.nl
    all.rbl.jp all.s5h.net
    all.spamrats.com aspews.ext.sorbs.net
    backscatter.spameatingmonkey.net badconf.rhsbl.sorbs.net
    badhost.stopspam.org badnets.spameatingmonkey.net
    bad.psky.me b.barracudacentral.org bb.barracudacentral.org
    bitonly.dnsbl.bit.nl blacklist.sci.kun.nl
    bl.drmx.org bl.emailbasura.org
    bl.konstant.no bl.mailspike.net
    bl.mav.com.br bl.nszones.com
    block.dnsbl.sorbs.net block.stopspam.org
    bl.scientificspam.net bl.score.senderscore.com
    bl.spamcannibal.org bl.spamcop.net
    bl.spameatingmonkey.net bl.spamstinks.com
    bl.suomispam.net bogons.cymru.com
    bogusmx.rfc-clueless.org bsb.empty.us
    bsb.spamlookup.net cbl.abuseat.org
    cbl.anti-spam.org.cn cblless.anti-spam.org.cn
    cblplus.anti-spam.org.cn cdl.anti-spam.org.cn
    cidr.bl.mcafee.com cml.anti-spam.org.cn
    combined.rbl.msrbl.net contacts.abuse.net
    dnsbl.anticaptcha.net dnsbl.aspnet.hu
    dnsblchile.org dnsbl.cobion.com
    dnsbl.dronebl.org dnsbl.inps.de
    dnsbl.justspam.org dnsbl.kempt.net
    dnsbl.madavi.de dnsbl.net.ua
    dnsbl.openresolvers.org dnsbl.othello.ch
    dnsbl.proxybl.org dnsbl.rizon.net
    dnsbl.rv-soft.info dnsbl.rymsho.ru
    dnsbl.sorbs.net dnsbl.spam-champuru.livedoor.com
    dnsbl.stopspam.org dnsbl.tornevall.org
    dnsbl.webequipped.com dnsbl.zapbl.net
    dnsrbl.org dnsrbl.swinog.ch
    dnswl.inps.de dob.sibl.support-intelligence.net
    dsn.rfc-clueless.org dul.dnsbl.sorbs.net
    dul.pacifier.net dyna.spamrats.com
    dyndns.rbl.jp dynip.rothen.com
    dyn.nszones.com elitist.rfc-clueless.org
    escalations.dnsbl.sorbs.net eswlrev.dnsbl.rediris.es
    ex.dnsbl.org exitnodes.tor.dnsbl.sectoor.de
    feb.spamlab.com fnrbl.fast.net forbidden.icm.edu.pl
    free.v4bl.org fresh10.spameatingmonkey.net
    fresh15.spameatingmonkey.net fresh.spameatingmonkey.net
    fulldom.rfc-clueless.org gl.suomispam.net
    hil.habeas.com blacklist.woody.ch
    http.dnsbl.sorbs.net hul.habeas.com
    iadb2.isipp.com iadb.isipp.com
    iddb.isipp.com images.rbl.msrbl.net
    in.dnsbl.org ipbl.zeustracker.abuse.ch
    ips.backscatterer.org ips.whitelisted.org
    ip.v4bl.org ispmx.pofon.foobar.hu
    ix.dnsbl.manitu.net korea.services.net
    l1.apews.org l1.bbfh.ext.sorbs.net
    l2.bbfh.ext.sorbs.net l3.bbfh.ext.sorbs.net
    l4.bbfh.ext.sorbs.net list.anonwhois.net list.bbfh.org
    list.blogspambl.com list.dnswl.org list.quorum.to
    lookup.dnsbl.iip.lu mail-abuse.blacklist.jippg.org
    misc.dnsbl.sorbs.net mtawlrev.dnsbl.rediris.es
    netblockbl.spamgrouper.to netbl.spameatingmonkey.net
    netscan.rbl.blockedservers.com new.spam.dnsbl.sorbs.net
    nobl.junkemailfilter.com nomail.rhsbl.sorbs.net
    no-more-funn.moensted.dk noptr.spamrats.com
    old.spam.dnsbl.sorbs.net orvedb.aupads.org
    phishing.rbl.msrbl.net db.wpbl.info
    plus.bondedsender.org pofon.foobar.hu
    postmaster.rfc-clueless.org problems.dnsbl.sorbs.net
    proxies.dnsbl.sorbs.net psbl.surriel.com
    public.sarbl.org query.bondedsender.org
    rbl2.triumf.ca rbl.abuse.ro rbl.blockedservers.com
    rbl.dns-servicios.com rbl.efnet.org rbl.efnetrbl.org
    rbl.fasthosts.co.uk rbl.interserver.net
    rbl.iprange.net rbl.lugh.ch
    rbl.megarbl.net rbl.rbldns.ru
    rbl.schulte.org rbl.spamlab.com
    rbl.talkactive.net recent.spam.dnsbl.sorbs.net
    relays.bl.kundenserver.de multi.surbl.org
    relays.dnsbl.sorbs.net relays.nether.net
    rep.mailspike.net reputation-domain.rbl.scrolloutf1.com
    reputation-ip.rbl.scrolloutf1.com reputation-ns.rbl.scrolloutf1.com
    rhsbl.rymsho.ru rhsbl.scientificspam.net
    rhsbl.sorbs.net rhsbl.zapbl.net
    rsbl.aupads.org sa-accredit.habeas.com
    safe.dnsbl.sorbs.net sbl.nszones.com
    service.mailblacklist.com whitelist.surriel.com
    service.mailwhitelist.com short.rbl.jp singlebl.spamgrouper.com
    singular.ttk.pte.hu smtp.dnsbl.sorbs.net
    socks.dnsbl.sorbs.net sohul.habeas.com
    spam.dnsbl.anonmails.de spam.dnsbl.sorbs.net
    spamguard.leadmon.net spamlist.or.kr
    spam.pedantic.org spam.rbl.blockedservers.com
    spamrbl.imp.ch spam.rbl.msrbl.net
    spamsources.fabel.dk spam.spamrats.com
    srn.surgate.net st.technovision.dk
    tor.dan.me.uk tor.dnsbl.sectoor.de
    tor.efnet.org torexit.dan.me.uk
    truncate.gbudb.net trusted.nether.net
    ubl.nszones.com ubl.unsubscore.com
    unsure.nether.net uribl.abuse.ro
    uri.blacklist.woody.ch uribl.pofon.foobar.hu
    uribl.spameatingmonkey.net uribl.swinog.ch
    uribl.zeustracker.abuse.ch urired.spameatingmonkey.net
    url.rbl.jp v4.fullbogons.cymru.com
    virbl.dnsbl.bit.nl virus.rbl.jp
    virus.rbl.msrbl.net vote.drbl.caravan.ru
    vote.drbldf.dsbl.ru vote.drbl.gremlin.ru
    wadb.isipp.com wbl.triumf.ca
    web.dnsbl.sorbs.net zombie.dnsbl.sorbs.net
    web.rbl.msrbl.net whitelist.sci.kun.nl
    whois.rfc-clueless.org wl.mailspike.net
    wl.nszones.com work.drbl.caravan.ru
    work.drbldf.dsbl.ru work.drbl.gremlin.ru
    wormrbl.imp.ch z.mailspike.net
    )
    # Initialization
    export action=$1
    export ip=$2
    # Use random DNS server, or use 4th arg as dns
    DNS=(8.8.8.8 8.8.4.4)
    num=$[$RANDOM%${#DNS[@]}]
    export DNS=${4:-${DNS[$num]}}
    a=$(echo $ip | cut -d'.' -f4) b=$(echo $ip | cut -d'.' -f3)
    c=$(echo $ip | cut -d'.' -f2) d=$(echo $ip | cut -d'.' -f1)
    export rev_ip="$a.$b.$c.$d"

    WORK_DIR=/tmp/.zabbix.$(basename $0)/$ip/

    mkdir -p $WORK_DIR

    # 0 — server not in blacklist, 1 — if listened
    in_blacklist(){
    rev_ip=$1
    blacklist_server=$2
    ns_answer=$WORK_DIR/$rev_ip.$blacklist_server
    host -W1 $rev_ip.$blacklist_server $DNS &> $ns_answer
    echo $blacklist_server 0 > $ns_answer.status
    grep 127.0.0.0 $ns_answer > /dev/null && return
    grep 127. $ns_answer > /dev/null &&
    echo $blacklist_server 1 > $ns_answer.status
    }

    get_alerted_blacklist_servers(){
    for i in ${blacklist_servers[@]}; do
    grep ' 1' $WORK_DIR/$rev_ip.$i.status | cut -d' ' -f1
    done
    }

    cleanup_workdir(){ find $WORK_DIR/ -type f -delete; }

    foreach(){ for i in $@; do echo $i; done }
    DISCOVERY_STATUS=$WORK_DIR/.discovered

    # General blacklists

    if [ $action == «discovery» ]; then
    mode=${3:-fast}
    blacklist_servers=($(foreach ${blacklist_servers_fast[@]} | sort -u))

    [ "$mode" == «full» ] &&
    blacklist_servers=($(foreach ${blacklist_servers_full[@]} | sort -u))

    cleanup_workdir
    for blacklist_server in ${blacklist_servers[@]}; do
    in_blacklist $rev_ip $blacklist_server &
    done
    wait

    {
    echo { \«data\»:[
    for i in $(get_alerted_