Convertendo endereços IP registrados do servidor Web para DNS

3

Eu estou tentando usar um script bash para processar um arquivo de log do servidor web e substituir qualquer IP que ele encontrar com seus nomes de host DNS correspondentes.

Um exemplo de entrada de uma única linha do arquivo de log é:

<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=192.168.1.6 DST=192.168.1.1 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51 

(Eu mudei todos os detalhes privados na linha acima para fins de exemplo).

Então, acima, os dois campos SRC = 192.168.1.6 e DST = 192.168.1.1 contêm endereços IP, que eu preciso converter em nomes de host DNS (eu entendo que eles são apenas endereços internos, isso é apenas um exemplo). / p>

Isso é o que eu criei até agora para o meu script:

#!/bin/bash

logFile=$1

while read line
do
    for word in $line
    do

            # if word is ip address change to hostname
            if [[ $word =~ 'DST='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
            then
                    # check if ip address is correct
                    ip=($word) | cut -d'=' -f 2
                    echo -n 'nslookup $word | grep Name | cut -d' ' -f 8'
                    echo -n " "
            # else print word
            else
                    echo -n $word
                    echo -n " "
            fi
    done
    # new line
    echo
done < "$logFile"

A parte que está me jogando é interpretar os campos DST = e SRC = como um endereço IP, não tenho certeza se a sintaxe é necessária antes do processamento do DNS e, em seguida, adicioná-lo novamente ao processamento do DNS a seguir ou se há uma maneira melhor?

Eu pesquisei os fóruns com antecedência e encontrei o seguinte artigo: resolve todos os endereços IP no comando saída usando ferramentas de linha de comando padrão

No entanto, parece que não funcionou, possivelmente dado o formato dos meus arquivos de log.

    
por Dave 04.11.2013 / 17:42

2 respostas

1

@Dave, verifique o script abaixo:

Arquivo de entrada de amostra

[mihai@image-host-1 tmp]$ cat demo.log
    <12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.161 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
    <12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.162 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
    <12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.163 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
    <12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.164 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
    <12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
    <12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=166.78.125.164 DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
    <12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
  • Contém válido (IP resolvível de DNS)
  • Contém IP inválido (* .61. * .63)
  • Contém o nome do host como SRC

Exemplo de saída

[mihai@image-host-1 tmp]$ ./demo.sh demo.log
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.161 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=bangimage.com. DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.163 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.164 DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=173.194.46.38 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=NODNS-166.78.125.164 DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51
<12>1 2013-11-04T15:04:05+00:00 networkname kernel - - - kernel: [161030.740000] ACCEPT IN=br0 OUT= MAC=00:11:22:33:44:11:00:11:11:11:11:11:11:11 SRC=hostnamesrc DST=hostnamedst LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=30324 DF PROTO=UDP SPT=43729 DPT=53 LEN=51

Script real

[mihai@image-host-1 tmp]$ cat demo.sh
#!/bin/bash

logFile=$1

while read logLine
do
        # For each log line, find the SRC
        # If needed, this can be extended to DSC as well
        # ----------------------------------------------
        logSRC='echo $logLine | awk '{print $14}' | awk -F "=" '{print $2}''
        # echo "SRC = ${logSRC}"

        # Test if SRC is an IP or not
        # ---------------------------
        if [[ ${logSRC} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
        then
                # echo "${logSRC} is IP"

                # Convert IP into hostname via reverse DNS lookup
                # -----------------------------------------------
                logSRCHOST='host ${logSRC} | awk '{print $NF}''

                if [[ ${logSRCHOST} =~ 'NXDOMAIN' ]];
                then
                        logSRCHOST="NODNS-${logSRC}"
                fi
        else
                logSRCHOST=${logSRC}

        fi

        # echo "FINAL SRC = ${logSRCHOST}"

        echo $logLine | sed -e "s/SRC.*DST/SRC=${logSRCHOST} DST/g"

done < "$logFile"
    
por 05.11.2013 / 14:04
0

logresolve

Se estes forem os logs do Apache, você pode usar a ferramenta logresolve que está incluída no Apache para fazer este trabalho para você.

script de shell alternativo

Eu também deparei com este SO Q & A intitulado: Substituir IPs por nomes de host em um log . A resposta aceita para essa pergunta incluiu o seguinte script de shell para converter IPs em nomes de host DNS.

#!/bin/bash

logFile=$1

while read line
do
  for word in $line
  do
    # if word is ip address change to hostname
    if [[ $word =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
    then
      # check if ip address is correct
      OIFS=$IFS
      IFS="."
      ip=($word)
      IFS=$OIFS
      if [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
      then
        echo -n 'host $word | cut -d' ' -f 5'
        echo -n " "
      else
        echo -n "$word"
        echo -n " "
      fi
    # else print word
    else
        echo -n $word
        echo -n " "
    fi
  done
  # new line
  echo
done < "$logFile"

Salve o script acima no nome do arquivo ip_to_hostname.sh e execute-o da seguinte forma:

$ ./ip_to_hostname.sh your_logfile > resolved_ip
    
por 04.11.2013 / 18:45