ngrep: un analizador de paquetes de red para Linux


Ngrep (network grep) es un analizador de paquetes de red simple pero poderoso. Es una herramienta similar a grep aplicada a la capa de red: coincide con el tráfico que pasa por una interfaz de red. Le permite especificar una expresión regular o hexadecimal extendida para que coincida con las cargas útiles de datos (la información real o el mensaje en los datos transmitidos, pero no los metadatos generados automáticamente) de los paquetes.

Esta herramienta funciona con varios tipos de protocolos, incluidos IPv4/6, TCP, UDP, ICMPv4/6, IGMP y Raw en varias interfaces. Funciona de la misma forma que la herramienta de detección de paquetes tcpdump.

El paquete ngrep está disponible para instalar desde los repositorios del sistema predeterminados en las distribuciones principales de Linux utilizando la herramienta de administración de paquetes como se muestra.

$ sudo apt install ngrep
$ sudo yum install ngrep
$ sudo dnf install ngrep

Después de instalar ngrep, puede comenzar a analizar el tráfico en su red Linux usando los siguientes ejemplos.

1. El siguiente comando le ayudará a hacer coincidir todas las solicitudes de ping en la interfaz de trabajo predeterminada. Necesita abrir otra terminal e intentar hacer ping a otra máquina remota. El indicador -q le dice a ngrep que trabaje silenciosamente, que no muestre ninguna información que no sean los encabezados de los paquetes y sus cargas útiles.

$ sudo ngrep -q '.' 'icmp'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( icmp ) and ((ip || ip6) || (vlan && (ip || ip6)))
match: .

I 192.168.0.104 -> 192.168.0.103 8:0
  ]...~oG[....j....................... !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.103 -> 192.168.0.104 0:0
  ]...~oG[....j....................... !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.104 -> 192.168.0.103 8:0
  ]....oG[............................ !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.103 -> 192.168.0.104 0:0
  ]....oG[............................ !"#$%&'()*+,-./01234567  

Puede presionar Ctrl + C para terminarlo.

2. Para hacer coincidir solo el tráfico que va a un sitio de destino en particular, por ejemplo, "google.com", ejecute el siguiente comando y luego intente acceder a él desde un navegador.

$ sudo ngrep -q '.' 'host google.com'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( host google.com ) and ((ip || ip6) || (vlan && (ip || ip6)))
match: .

T 172.217.160.174:443 -> 192.168.0.103:54008 [AP]
  ..................;.(...RZr..$....s=..l.Q+R.U..4..g.j..I,.l..:{y.a,....C{5>[email protected]                                                                       

T 172.217.160.174:443 -> 192.168.0.103:54008 [AP]
  .............l.......!,0hJ....0.%F..!...l|.........PL..X...t..T.2DC..... ..y...~Y;[email protected]

3. Si está navegando por la web, ejecute el siguiente comando para controlar qué archivos solicita su navegador :.

$ sudo ngrep -q '^GET .* HTTP/1.[01]'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ((ip || ip6) || (vlan && (ip || ip6)))
match: ^GET .* HTTP/1.[01]

T 192.168.0.104:43040 -> 172.217.160.174:80 [AP]
  GET / HTTP/1.1..Host: google.com..User-Agent: Links (2.13; Linux 4.17.6-1.el7.elrepo.x86_64 x86_64; 
  GNU C 4.8.5; text)..Accept: */*..Accept-Language: en,*;q=0.1..Accept-
  Encoding: gzip, deflate, bzip2..Accept-Charset: us-ascii,ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,
  ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,ISO-8859-9,ISO-8859-10,I
  SO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16,windows-1250,windows-1251,windows-1252,windows-1256,
  windows-1257,cp437,cp737,cp850,cp852,cp866,x-cp866-u,x-mac,x-mac-ce,x-
  kam-cs,koi8-r,koi8-u,koi8-ru,TCVN-5712,VISCII,utf-8..Connection: keep-alive.... 

4. Para ver toda la actividad que cruza el puerto de origen o destino 25 (SMTP), ejecute el siguiente comando.

$ sudo ngrep port 25

5. Para monitorear cualquier tráfico de syslog basado en la red para detectar la aparición de la palabra "error", use el siguiente comando.

 
$ sudo ngrep -d any 'error' port 514

Es importante destacar que esta herramienta puede convertir los nombres de los puertos de servicio almacenados en “/ etc/services” (en sistemas similares a Unix como Linux) en números de puerto. Este comando es equivalente al comando anterior.

$ sudo ngrep -d any 'error' port syslog

6. También puede ejecutar ngrep contra un servidor HTTP (puerto 80), hará coincidir todas las solicitudes con el host de destino como se muestra.

$ sudo ngrep port 80

interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
####
T 67.169.59.38:42167 -> 64.90.164.74:80 [AP]
  GET / HTTP/1.1..User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i
  686) Opera 7.21  [en]..Host: www.darkridge.com..Accept: text/html, applicat
  ion/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gi
  f, image/x-xbitmap, */*;q=0.1..Accept-Charset: iso-8859-1, utf-8, utf-16, *
  ;q=0.1..Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0..Cookie: SQ
  MSESSID=5272f9ae21c07eca4dfd75f9a3cda22e..Cookie2: $Version=1..Connection:
  Keep-Alive, TE..TE: deflate, gzip, chunked, identity, trailers....
##

Como puede ver en la salida anterior, todas las transmisiones de encabezados HTTP se muestran con su sangriento detalle. Sin embargo, es difícil de analizar, así que veamos qué sucede cuando aplica el modo de línea -W .

$ sudo ngrep -W byline port 80

interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
####
T 67.169.59.38:42177 -> 64.90.164.74:80 [AP]
GET / HTTP/1.1.
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686) Opera ...
Host: www.darkridge.com.
Accept: text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9 ...
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1.
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0.
Cookie: SQMSESSID=5272f9ae21c07eca4dfd75f9a3cda22e.
Cookie2: $Version=1.
Cache-Control: no-cache.
Connection: Keep-Alive, TE.
TE: deflate, gzip, chunked, identity, trailers.

7. Para imprimir una marca de tiempo en forma de AAAA/MM/DD HH: MM: SS.UUUUUU cada vez que un paquete coincide, use la bandera -t.

$ sudo ngrep -t -W byline port 80

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( port 80 ) and ((ip || ip6) || (vlan && (ip || ip6)))
####
T 2018/07/12 16:33:19.348084 192.168.0.104:43048 -> 172.217.160.174:80 [AP]
GET / HTTP/1.1.
Host: google.com.
User-Agent: Links (2.13; Linux 4.17.6-1.el7.elrepo.x86_64 x86_64; GNU C 4.8.5; text).
Accept: */*.
Accept-Language: en,*;q=0.1.
Accept-Encoding: gzip, deflate, bzip2.
Accept-Charset: us-ascii,ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,ISO-8859-5,utf-8.
Connection: keep-alive.

8. Para evitar poner la interfaz que se está monitoreando en modo promiscuo (donde intercepta y lee cada paquete de red que llega en su totalidad), agregue el indicador -p .

$ sudo ngrep -p -W byline port 80

9. Otra opción importante es -N que es útil en caso de que esté observando protocolos sin formato o desconocidos. Le dice a ngrep que muestre el número de subprotocolo junto con el identificador de un solo carácter.

$ sudo ngrep -N -W byline

Para obtener más información, consulte la página de manual de ngrep.

$ man ngrep

Repositorio de ngrep Github: https://github.com/jpr5/ngrep

¡Eso es todo! Ngrep (network grep) es un analizador de paquetes de red que comprende la lógica del filtro BPF de la misma manera que tcpdump. Nos gustaría conocer su opinión sobre ngrep en la sección de comentarios.