Skip to content


Como evitar IPs duplicados numa rede Linux (Detector de IPs duplicados)

Quando eu cheguei em minha empresa atual, vi que existia uma lista de IPs liberados para conectar a Internet com mais privilégios que os demais. Todos recebiam o IP por dhcp, porém alguns espertinhos estavam colocando seu IP a mão, ao invés de pegar automaticamente, para terem assim mais privilégios. Era terrível ver algumas falhas na rede ou o tráfego indesejado devido a isso.

Como primeiro passo, eu bloqueei todos os IPs que não viessem com o MAC correto. Para isso, obtive a lista de IPs e MACs através do DHCP e depois controlei com o IPTables. Para isso, criei os scripts:

Para obter o mac e ip do dhcp:

#!/bin/bash

CONF_FILE=/etc/dhcp3/dhcpd.conf

CONF_FILTERED=$(sed -n '/^ *host.*{/,/}/p' $CONF_FILE | sed 's;hardware.*ethernet;; ; s;fixed-address;; ; s;host\( \|\t\)*;; ; s;\( \|\t\|{\|}\|\;\)*;;g')

CONTROL=3
for i in $CONF_FILTERED;do
 case "$i" in
   *:*)
   MAC=$i
   let CONTROL--
   ;;
   *\.*)
   IP=$i
   let CONTROL--
   ;;
   [a-zA-Z]*)
   NOME=$i
   let CONTROL--
   ;;
 esac
 if [ $CONTROL -eq 0 ];then
   printf "%-20s %-18s %s\n" "$NOME" "$IP" "$MAC"
   CONTROL=3
 fi
done

Basta executar e salvar a saída em um arquivo, por exemplo:

# ./obter-mac-ips.sh > LISTA

E a parte do script do IPTables para trabalhar com este arquivo LISTA criado:

# INTERFACE DE SAÍDA
WAN=eth2
while read NOME IP MAC; do
    printf  "Liberando IP para \033[0;34m%12s\033[0m: \033[2;32m%-15s\033[0m [\033[0;31m%s\033[0m]...\n" "$NOME" "$IP" "$MAC"
    /sbin/iptables -t nat -I PREROUTING -s $IP -m mac --mac-source ! $MAC -j DROP
    /sbin/iptables -t nat -I POSTROUTING -o $WAN -s $IP -j MASQUERADE
done < LISTA

Agora estava quase tudo resolvido, faltava identificar as pessoas que estavam colocando o IP a mão.

Para isso, fiz um script usando o arp-scan e o coloquei para rodar no crontab:

# Linha do crontab
* *     * * *   root    /usr/sbin/verificar_ips_duplicados.sh verificar >> /var/log/ips_duplicados

Script verificar_ips_duplicados.sh:

#!/bin/bash

BEEP_FILE=/var/cache/duplicate-ips/alerta
BEEP_FREQ=3100

verificar_ips() {
    IPS=$(arp-scan -l | grep ^[0-9] | awk '{print $1" "$2}' | sort -t . -n -k 1 -k 2 -k 3 -k 4 | uniq)
    DUPLICADOS=$(awk '{print $1}' <<< "$IPS" | uniq -c | awk '{if ($1 != 1) print $2}')

    [ "$DUPLICADOS" = "" ] && return 0

    for i in $DUPLICADOS;do
        awk '{if ($1 == "'$i'") print $1"="$2}' <<< "$IPS"
    done
    return 1
}

emitir_beep() {
    mkdir -p ${BEEP_FILE%/*}
    while [ "$(cat $BEEP_FILE 2> /dev/null)" = "yes" ];do
        beep -f $BEEP_FREQ
        sleep 0.5
    done
}

case "$1" in
    verificar)
        if verificar_ips;then
            $0 parar-beep
        else
            echo
            $0 iniciar-beep
        fi
    ;;
    parar-beep)
        echo no > $BEEP_FILE
    ;;
    iniciar-beep)
        echo yes > $BEEP_FILE
        emitir_beep
    ;;
    *)
        echo "ERRO: Comando desconhecido"
        echo -e "\nUtilize:\n\t$0 [verificar|iniciar-beep|parar-beep]"
        exit 1
    ;;
esac

Assim, ele verificaria a cada minuto por IPS duplicados, caso encontrasse, salvaria o IP e o MAC no log e ficaria emitindo um beep no servidor.

Para que funcione corretamente, você deverá:

  • instalar o arp-scan;
  • instalar o beep;
  • copiar os scripts de forma correta, substituindo as aspas daqui por aspas normais, senão o bash não reconhecerá direito.

abs

Postado em 🐧 GNU/Linux 🐧.


0 Respostas

Fique por dentro da conversa, assine o Feed deste post   em RSS.



Some HTML is OK

ou, responda este post através de um trackback.