8.6.1. Monitorización

Hay dos herramientas fundamentales para la monitorización de la red:

  • tcpdump, sin interfaz gráfica, cuya mayor utilidad es la de

    capturar tráfico en entornos sin escritorio y detectar la ausencia o presencia de determinado tipo de tráfico.

  • wireshark, con interfaz gráfica, que además de capturar tráfico es muy útil para analizarlo y rastrear conexiones.

8.6.1.1. tcpdump

Es capaz de capturar el tráfico que pasa por una interfaz de red (en cuyo caso debemos ser administradores) o que se lee de un fichero en que se hubiera guardado el tráfico capturado previamente. El fruto de la captura puede ser mostrado por pantalla o almacenado en un fichero (gracias a -w):

# tcpdump -ni <interfaz> [-w <output.pcap>] [<filtro>]
# tcpdump -nr <input.pcap> [<filtro>]

Es conveniente usar la opción -n para evitar que se intenten resolver las direcciones IP. El «filtro», por su parte, determina qué trafico es capturado. Por ejemplo:

  • Para capcurar el tráfico ICMP que pasa por eth0:

    # tcpdump -ni eth0 icmp
    
  • Para lo mismo, pero almacenándolo en un fichero:

    # tcpdump -ni eth0 -w icmp.pcap icmp
    

La complicación, pues, es saber expresar los filtros para obtener sólo el tráfico que interesa.

8.6.1.1.1. Filtros

Los filtros posibles se encuentran en pcap-filter(7) y pueden yuxtaponerse, lo cual significa que todos son aplicables.

Protocolos

Pueden ser protocolos de capa 3 y 4: ip, ip6, icmp, arp, tcp, udp

Direcciones de origen/destino

Cuando el origen es IP, puede indicarse una máquina:

dst host 192.168.1.4
src host 192.168.1.4
host 192.168.1.4

o bien una red en notación CIDR o expresando sólo los bytes de host:

dst net 192.168.1.0/24
src net 192.168.1
host 192.168.1

También pueden definirse origenes o destinos MAC:

ether dst AA:BB:CC:DD:EE:FF
ether src AA:BB:CC:DD:EE:FF
ether host AA:BB:CC:DD:EE:FF
Puertos de origen/destino

Basta con:

dst port 80
src port 80
port 80

aunque podemos especificar si son tcp o udp:

tcp dst port 80

En caso de que queramos expresar un rango:

dst portrange 80-90
Operadores lógicos

not (o !), and (o &&), or (o ||). Pueden también usarse paréntesis para alterar la precedencia:

dst port not 80
tcp || udp

Recetas

  1. Capturar tráfico SSH (ambas direcciones):

    # tcpdump -ni eth0 tcp port 22
    
  2. Ïdem, pero restringido a la comunicación con la máquina 192.168.1.100:

    # tcpdump -ni eth0 tcp port 22 host 192.168.1.100
    
  3. Tráfico generado por la orden ping:

    # tcpdump -ni eth0 "icmp[icmptype] == icmp-echoreply || icmp[icmptype] == icmp-echorequest"
    
  4. Obtener las VLANs de los paquetes circulan por el puente br0:

    #  tcpdump -eni br0 | grep -oP '(?<=vlan )[0-9]+' | sort -nu
    

    Nota

    -e añade en la salida la cabecera Ethernet.

8.6.1.2. wireshark

Como tcpdump es capaz de capturar el tráfico de una interfaz o leer de fichero tráfico previamente capturado. Tiene definidos dos tipos de filtros:

  • Filtros de captura, aplicables cuando se captura tráfico de una interfaz y que son aquellos que sirven para seleccionar de entro todo el tráfico circulante cuál que será clonado para ser analizado. Tienen, pues, el mismo sentido que que los filtro de tcpdump y, de hecho, se expresan con el mismo formato.

  • Filtros de visualización, que son aquellos que seleccionan cuál será de entre el tráfico capturado, el mostrado en la interfaz. El expresión de estos filtros es distinta que la que usa tcpdump.

8.6.1.2.1. Filtros de visualización

Protocolo

Puede ser tanto de capa 3 y 4:

tcp
udp
arp
icmp

como protocolo de capa de aplicación:

ssh
dhcp
dns
http
ftp

Además proto.parametro permite filtrar paquetes según un determinado parámetro propio del protocolo. Por ejemplo:

http.host == www.example.com
tcp.ack
Dirección de origen/destino

Pueden ser direcciones IP:

ip.src == 192.168.1.4
ip.dst == 192.168.1.4
ip.addr == 192.168.1.4

La última expresión sirve tanto para origen como para destino. Si filtramos por direcciones físicas:

eth.addr == 00:11:22:33:44:55
eth.addr[0:3] == 00:11:22
eth.src == 00:11:22:33:44:55
eth.dst == FF:FF:FF:FF:FF:FF
Puerto de origen/destino

Puede filtrarse tráfico TCP:

tcp.port == 80
tcp.srcport == 80
tcp.dstport == 80

o UDP:

udp.port == 53
udp.srcport == 53
udp.dstport == 53
Operadores lógicos

Son los mismos que para tcpdump. Por ejemplo:

ip.addr == 192.168.1.4 and tcp.port == 80

y, por supuesto, podremos alterar la precedencia usando paréntesis.

Operadores de comparación

A los habituales ==, !=, :!=`, >=, >, <= y <, deben añadirse:

in

Permite definir rangos y valores múltiple:

tcp.port in {80 443}
tcp.port in {110..121}
tcp.port in {80 443 8080..8089}
~ (virgulilla)

Permite comparar usando expresiones regulares.

contains

La cadena contiene una subcadena.

Advertencia

La expresión ip.addr != 192.168.1.4 muy probablemente sea un filtro totalmente inútil, ya que equivale a ip.src != 192.168.1.4 or ip.dst != 192.168.1.4.

8.6.1.2.2. Captura de tráfico remoto

Si se desean analizar con wireshark paquetes de un servidor sin entorno gráfico, cabe la posibilidad de capturarlos con tcpdump guardándolos en un archivo; y llevarse este fichero al cliente gráfico. Podemos, no obstante, ahorrarnos el tedio de transportar el archivo:

usuario@cliente$ ssh root@sevidor tcpdump -U -s0 -ni eth0 w - 'not port 22' | wireshark -k -i -