Blacklist - O que é? Como consultar o IP? Como automatizar?

Explana sobre bloqueio de IPs em Blacklists (RBL), demonstrando como consultar e como automatizar via shell script.

[ Hits: 20.242 ]

Por: Danillo Costa em 19/05/2015 | Blog: https://nillow.com.br/


Automatizando consultas via shell script



Pré-requisitos:
  • msmtp (envio de notificação via email)
  • lynx

Embora o ambiente utilizado seja o Cygwin, acredito que qualquer Linux é compatível com o script, desde que atenda os pré-requisitos.

Não ensinarei como configurar o msmtp, pois este não é foco e caso decida não utiliza-lo, basta adapta-lo.

As consultas são feitas utilizando o método 2 da página anterior, que é mais rápido em relação ao método 1.

O check-blacklist, nome do shell script, pode ser executado de duas formas.

Para um IP em específico:

bash check-blacklist.sh 23.226.214.16

Para uma lista determinada dentro do script:

bash check-blacklist.sh

Imagem da saída em tempo real do script:
Linux: Blacklist - O que é? Como consultar o IP? Como automatizar?
Imagem da notificação via email:
Linux: Blacklist - O que é? Como consultar o IP? Como automatizar?
Salve o código abaixo, em "check-blacklist.sh". Não esqueça de editar os endereços de e-mails e a faixa de IP a ser analisada.

#!/bin/bash
# Editado por hellnux (Danillo Costa)
# Fonte: http://daemonforums.org/showthread.php?t=302
version="15.0508"

# Checa um determinado IP se passado como parametro, caso contrario eh
# analisado um faixa de IPs pre determinados.

#######################################################
#                               Functions
#######################################################

function dateNow () {
        date +%d/%m/%Y" "%k:%M:%S
}

function getIps() {
        # Cria lista de ips
        ips=""
        notes_mail="Faixa de IPs analisadas:\n"
        prefix="162.144.34"
        notes_mail="$notes_mail de 162.144.34.1 até 162.144.34.126 \n"
        for i in `seq 1 126`; do
                ips="$ips $prefix.$i"
        done        
        # Adiciona a lista de ips, os ips de 37.49.226.1 até 37.49.226.62
        prefix="37.49.226"
        notes_mail="$notes_mail de 37.49.226.1 até 37.49.226.62 \n"
        for i in `seq 1 62`; do
                ips="$ips $prefix.$i"
        done 
}

function printResultBase () {
        printf "%-22s %-18s %-30s %-24s %s \n" "$date_now" "$ip" "$reverse_dns" "${BL}" "$result"
}

function printResultSenderbase() {
        date_now=`dateNow`
        BL="senderbase.org"
        # Evita consulta desnecessaria quando o SenderBase tiver bloqueado IP da maquina que executa este script
        if [ "$block_printResultSenderbase" == "1" ]; then
                result="Fail"
                printResultBase
        else
                # Passa pelos Termos de Servicos do SenderBase, method post e pega a saida do lynx
                out=$(echo "tos_accepted=Yes, I Agree" | lynx -dump -post_data "$link_sederbase$ip" | nl -ba)
                if [ $? -eq 0 ]; then
                        if [ "`echo "$out" | grep -F "You don't have permission to access"`" != "" ]; then
                                block_printResultSenderbase="1"
                                result="Fail"
                                printResultBase
                        else
                                # O status do email_reputation costuma estar uma linha antes de "Web Reputation Help" na saida do lynx
                                n_web_reputation=$(echo "$out" | grep -F "Web Reputation Help" | awk '{print $1}')
                                n_email_reputation=$(( $n_web_reputation - 1 ))
                                email_reputation=$(echo "$out" | sed -n "$n_email_reputation"p | awk '{print $2}')
                                if [ "$email_reputation" == "Poor" ]; then
                                        result="Listed"
                                        printResultBase | tee -a "$log_file"
                                else
                                        result="---"
                                        printResultBase
                                fi
                        fi
                else # Metodo antigo. Nao eh tao preciso, pois informa apenas o score. Raramente entre neste trecho
                        BL="rf.senderbase.org"
                        result=$(dig +short txt ${reverse[$i]}.${BL}.)
                        date_now=`dateNow`
                        if [ "`echo "$result" | grep -F "-"`" != "" ]; then
                                score=$(echo "$result" | tr -d '"') 
                                result="NeedCheck:$score" 
                                printResultBase | tee -a "$log_file"
                        else
                                result="---"
                                printResultBase
                        fi
                fi
        fi
}

function printResult() {
        date_now=`dateNow`
        if [ "$result" != "" ]; then
                result="Listed"
                printResultBase | tee -a "$log_file"
        else
                result="---" # Nao listado
                printResultBase
        fi
}

#######################################################
#                                       Main
#######################################################

# Lista de blacklists. SenderBase eh analisado separadamente
BLISTS="
b.barracudacentral.org
zen.spamhaus.org
xbl.spamhaus.org
pbl.spamhaus.org
bl.spamcop.net
dnsbl.sorbs.net
http.dnsbl.sorbs.net
web.dnsbl.sorbs.net
"

script_name=$(basename $0 .sh)
emails="seu@email.com"
msmtp="/usr/sbin/msmtp"
log_file="/tmp/$script_name.log"
sign_mail="------------------\n$script_name $version" #Assinatura da notificacao via email
link_sederbase="http://www.senderbase.org/lookup/?search_string="
block_printResultSenderbase="0" # disable
msg_printResultSenderbase=""

# Define se usa IP passado via argumento ou "lista de IPs" informadas neste codigo.
if [ "$2" != "" ]; then
        echo "Error: Informe apenas 1 IP ou nenhum para usar a lista pre-determinada."
        exit 1
elif [ "$1" != "" ]; then
        ips="$1"
else
        getIps
fi

# limpa log
> "$log_file"

# Cria IP reverso
i=0
for ip in $ips; do
        reverse[$i]=$(echo "$ip" | sed -ne "s~^\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)$~\4.\3.\2.\1~p")
        if [ "x${reverse[$i]}" = "x" ]; then
                echo "Error: '$ip' nao parece ser um IP valido."
                exit 1
        fi
        (( i++ ))
done

# Faz checagem nas blacklists
i=0
for ip in $ips; do
        #echo "[$ip]" #debug
        reverse_dns=$(dig +short -x "$ip")
        if [ "$reverse_dns" == "" ]; then
                reverse_dns="reverseNull"
        fi
        # Chama funcao printResultSenderbase
        printResultSenderbase
        # Demais blacklists
        for BL in ${BLISTS} ; do
                result="$(dig +short -t a ${reverse[$i]}.${BL}.)"
                printResult
        done
        sleep "$(( ( RANDOM % 10 )  + 5 ))" # Random de ~5s a ~20s
        (( i++ ))
done

# Print in body mail if this script blocked in SenderBase
if [ "$block_printResultSenderbase" == "1" ]; then
        msg_printResultSenderbase="SenderBase blocked the `hostname -i` to queries.\n"
fi

# Send mail - Se identar o echo, pode bugar
if [ "`wc -l "$log_file" | awk '{print $1}'`" != "0" ]; then
echo "To: $emails
From: seu@email.com
Subject: [$script_name]
Content-Type: text/html; charset=\"utf-8\"

`cat \"$log_file\"`
`echo -e \"$msg_printResultSenderbase\"`
`echo -e \"$notes_mail\"`
`echo -e \"\n\n$sign_mail\"`
" | "$msmtp" --read-recipients fi # senderbase # dig +short txt 55.145.202.186.rf.senderbase.org # Outras RBL # combined.njabl.org # spam.rbl.msrbl.net # bl.spamcannibal.org # bl.deadbeef.com # bl.emailbasura.org # blackholes.five-ten-sg.com # bogons.cymru.com # blacklist.woody.ch # 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.ahbl.org # dnsbl.cyberlogic.net # dnsbl.inps.de # dnsbl.njabl.org # drone.abuse.ch # drone.abuse.ch # duinv.aupads.org # dul.dnsbl.sorbs.net # dul.ru # dyna.spamrats.com # dynip.rothen.com # 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 # 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.spamrats.com # spamlist.or.kr # spamrbl.imp.ch # t3direct.dnsbl.net.au # tor.ahbl.org # 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 # wormrbl.imp.ch # zombie.dnsbl.sorbs.net # phishing.rbl.msrbl.net # Fontes de pesquisas # http://www.redhat.com/archives/rhl-list/2003-December/msg01341.html # http://h3manth.com/content/methods-submit-form-post-using-curl-perl-python-ruby-lynx # Numero random em um determinado range pelo shuf # http://stackoverflow.com/questions/2556190/random-number-from-a-range-in-a-bash-script

Download do script acima: check-blacklist-VOL.sh

Agora, basta agendar via cron:

crontab -e

Exemplo para executar às 7 e 13h de todos os dias:

00 7,13 * * * /bin/bash /caminho/para/o/check-blacklist.sh

Aconselho não abusar no número de execuções, ainda mais se mandar analisar uma lista de IPs, pois as Blacklists podem acabar bloqueando o IP de onde está rodando o script, por abuso.

Caso esteja iniciando nesta área, lembre-se que apenas tal método não é o suficiente para combater os Spams.

Sintam-se livre para editar o script, desde que mantenha os créditos. Por um mundo sem Spam! =D

Página anterior    

Páginas do artigo
   1. Introdução
   2. Consultando o IP
   3. Automatizando consultas via shell script
Outros artigos deste autor

rwd - Restart When Down

Shell Script como serviço no Windows

Gerenciando Mouses da Razer

chkconfig - Adicionando o seu shell script

Adium, IM open source

Leitura recomendada

Kit de scripts para backup (Full + Diferencial + Samba + Rede)

Relatório de conexão Wi-Fi com dados de usuários conectados nos POPs

Backup automatizado com HD externo

Entendendo, criando e editando pacotes Debian (.deb)

Monitorando servidores pelo celular

  
Comentários
[1] Comentário enviado por vmmello em 19/05/2015 - 18:43h

legal o artigo. Na página 2, a linha do sed não funciona pra mim. E copiando direto do script na página 3 também não funciona. Será que a formatação do texto no VOL estragou a linha? Só funciona modificando ela um pouco.

[2] Comentário enviado por hellnux em 19/05/2015 - 18:55h

vmmello,

Obrigado por reportar. Já enviei a equipe de moderação tanto o comando sed da segunda página quanto o script da última página.

--- EDIT ---
Ambos foram corrigidos no artigo. =D

[3] Comentário enviado por xerxeslins em 21/05/2015 - 18:49h


Não trabalho com isso, mas achei o artigo bem informativo!

Eu não sabia dessas coisas de blacklist.

Valeu!

Abraço!
--
http://pastebin.com/aji5Qp05

[4] Comentário enviado por brunor1989 em 25/05/2015 - 11:04h

Olá,

Copiei o arquivo e fiz as mudanças necessárias, porém me retorna o seguinte erro:
/check.backlist.sh: 25: ./check.backlist.sh: Syntax error: "(" unexpected


[5] Comentário enviado por brunor1989 em 25/05/2015 - 14:18h


[4] Comentário enviado por brunor1989 em 25/05/2015 - 11:04h

Olá,

Copiei o arquivo e fiz as mudanças necessárias, porém me retorna o seguinte erro:
/check.backlist.sh: 25: ./check.backlist.sh: Syntax error: "(" unexpected



Resolvido, apenas troquei /bin/sh para /bin/bash

[6] Comentário enviado por hellnux em 25/05/2015 - 14:30h

Obriagado brunor1989. Corrigido no artigo, mas para quem chama o bash na linha de comando, que nem eu, não faz diferença.

[7] Comentário enviado por fmpfmp em 25/05/2015 - 17:00h

Muito útil seu script. No meu caso a maior causa do IP ser listado é ele ser considerado um IP dinâmico quando na verdade é estático. Aqui pagamos pra ter um IP fixo da GVT e vez ou outra ele é listado como IP doméstico. Toda vez eu tinha que ir na página do Spamhaus pra tirá-lo da lista, mas com seu script isso se torna desnecessário. Obrigado.

[8] Comentário enviado por juliomartins em 26/05/2015 - 17:10h

Código apenas para consulta passando ip por parâmetro ...

#!/bin/bash
#VERIFICADOR DE IPS BLACKLIST
BLISTS="b.barracudacentral.org zen.spamhaus.org xbl.spamhaus.org pbl.spamhaus.org bl.spamcop.net dnsbl.sorbs.net http.dnsbl.sorbs.net web.dnsbl.sorbs.net cbl.abuseat.org"

IP=`echo $1 | awk -F . '{print $4,$3,$2,$1}' | tr " " .`

for i in `echo $BLISTS`;
do
echo "$i ----> `dig +short -t a $IP.$i`"
done

[9] Comentário enviado por juliomartins em 26/05/2015 - 17:17h

Para executar o script:

Salve com o nome ChecaRBL

chmod 755 ChecaRBL

./ChecaRBL IP_QUE_VC_QUE_VERIFICAR

[10] Comentário enviado por wilyman em 29/08/2016 - 10:19h

Oi pessoal poderiam me ajudar, eventualmente tenho problemas de clientes com esse problema e na qual uso o BRMA.
Fiz o download do script porém ao executar ocorre esse erro
[root@mail root]# sh check-blacklist-VOL.sh
: command not found.sh: line 5:
: command not found.sh: line 8:
: command not found.sh: line 12:
'heck-blacklist-VOL.sh: line 13: syntax error near unexpected token `{
'heck-blacklist-VOL.sh: line 13: `function dateNow () {

Talvez o BRMA não tenha todos os recursos necessários para a execução do script mas seria muito util para o uso aqui na empresa

[11] Comentário enviado por hellnux em 29/08/2016 - 10:42h

wilyman

Use o bash em vez do sh


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts