Ping mesmo com firewall

Publicado por Mauricio 07/03/2007

[ Hits: 7.038 ]

Homepage: http://www.mbmaciel.com

Download tcpping




Se você tem um servidor que bloqueia pacotes ICMP pelo firewall, como saber se ele está online utilizando o comando ping ?

Resposta: Utilizando o tcpping, um script feito por Richard van den Berg que trago aqui para o VivaoLinux.

Requisitos:
-bash
-tcptraceroute

Como usar:
tcpping www.servidorcomfirewall.com.br

Abraços!

  



Esconder código-fonte

#!/bin/sh
#
# tcpping: test response times using TCP SYN packets
#          URL: http://www.vdberg.org/~richard/tcpping.html
#
# uses tcptraceroute from http://michael.toren.net/code/tcptraceroute/
#
# (c) 2002-2005 Richard van den Berg <richard@vdberg.org> under the GPL
#               http://www.gnu.org/copyleft/gpl.html
#
# 2002/12/20 v1.0 initial version
# 2003/01/25 v1.1 added -c and -r options
#                 now accepting all other tcptraceroute options
# 2003/01/30 v1.2 removed double quotes around backquotes
# 2003/03/25 v1.3 added -x option, courtesy of Alvin Austin <alvin@crlogic.com>
# 2005/03/31 v1.4 added -C option, courtesy of Norman Rasmussen <norman@rasmussen.org>

ver="v1.4"
format="%Y%m%d%H%M%S"
d="no"
c="no"
C="no"
ttl=255
seq=0
q=1
r=1
w=3
topts=""

usage () {
   name=`basename $0`
   echo "tcpping $ver Richard van den Berg <richard@vdberg.org>"
   echo
   echo "Usage: $name [-d] [-c] [-C] [-w sec] [-q num] [-x count] ipaddress [port]"
   echo
   echo "        -d   print timestamp before every result"
   echo "        -c   print a columned result line"
   echo "        -C   print in the same format as fping's -C option"
   echo "        -w   wait time in seconds (defaults to 3)"
   echo "        -r   repeat every n seconds (defaults to 1)"
   echo "        -x   repeat n times (defaults to unlimited)"
   echo
   echo "See also: man tcptraceroute"
   echo
}

_testsite() {
   myseq="${1}"
   shift
   [ "${c}" = "yes" ] && nows=`date +${format}`
   [ "${d}" = "yes" ] && nowd=`date`
   ttr=`tcptraceroute -f ${ttl} -m ${ttl} -q ${q} -w ${w} $* 2>/dev/null`
   host=`echo "${ttr}" | awk '{print $2 " " $3}'`
   if echo "${ttr}" | egrep "\[(open|closed)\]" >/dev/null 2>&1; then
      rtt=`echo "${ttr}" | awk '{print $5}'`
   else
      rtt=`echo "${ttr}" | awk '{print $4}'`
   fi
   not=`echo "${rtt}" | tr -d ".0123456789"`
   [ "${d}" = "yes" ] && echo "$nowd"
   if [ "${c}" = "yes" ]; then
      if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then
         echo "$myseq $nows $rtt $host"
      else
         echo "$myseq $nows $max $host"
      fi
   elif [ "${C}" = "yes" ]; then
      if [ "$myseq" = "0" ]; then
         echo -n "$1 :"
      fi
      if [ "x${rtt}" != "x" -a "x${not}" = "x" ]; then
         echo -n " $rtt"
      else
         echo -n " -"
      fi
      if [ "$x" = "1" ]; then
         echo
      fi
   else
      echo "${ttr}" | sed -e "s/^.*\*.*$/seq $myseq: no response (timeout)/" -e "s/^$ttl /seq $myseq: tcp response from/"
   fi
#       echo "${ttr}"
}

while getopts dhq:w:cr:nNFSAEi:f:l:m:p:s:x:C opt ; do
   case "$opt" in
      d|c|C) eval $opt="yes" ;;
      q|w|r|x) eval $opt="$OPTARG" ;;
      n|N|F|S|A|E) topt="$topt -$opt" ;;
      i|l|p|s) topt="$topt -$opt $OPTARG" ;;
      f|m) ttl="$OPTARG" ;;
      ?) usage; exit ;;
   esac
done

shift `expr $OPTIND - 1`

if [ "x$1" = "x" ]; then
   usage
   exit
fi

max=`echo "${w} * 1000" | bc`

if [ `date +%s` != "%s" ]; then
   format="%s"
fi

if [ "$x" = "" ]; then
   while [ 1 ] ; do
      _testsite ${seq} ${topt} $* &
      pid=$!
      if [ "${C}" = "yes" ]; then
         wait $pid
      fi
      seq=`expr $seq + 1`
      sleep ${r}
   done
else
   while [ "$x" -gt 0 ] ; do
      _testsite ${seq} ${topt} $* &
      pid=$!
      if [ "${C}" = "yes" ]; then
         wait $pid
      fi
      seq=`expr $seq + 1`
      x=`expr $x - 1`
      if [ "$x" -gt 0 ]; then
         sleep ${r}
      fi
   done
fi

exit

Scripts recomendados

Configurando um Domínio no BIND9 com Debian 3.1

Criar usuários com ponto (nome.usuario) no Slackware

Limpeza de cache do Squid

INSTALADOR TAR BZ2

Backup bases de dados Firebird com envio via FTP e local


  

Comentários
[1] Comentário enviado por y2h4ck em 08/03/2007 - 09:02h

não acho que o uso de pacotes tcp com flag SYN seja a mais indicada para checagem de stay-alive junto a firewalled hosts como forma de firewallking.

o mais indicado é o uso de pacotes tcp com flag ACK, uma vez que um firewall com statefull filtering iria retornar muito possivelmente um icmp-type 3 (network-unreachable) para filtros. Assim saberiamos se o host existe e está sob um firewall.



[2] Comentário enviado por mbmaciel em 09/03/2007 - 08:36h

Olá y2h4ck,

Resolvi fazer o teste mudando no script para usar pacotes com flag ACK , mas não deu resultado que eu queria. O script como está funcionou melhor. Faça o teste:

tcpping nsa.gov

[]'s


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts