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
Capturar tráfico SSH (ambas direcciones):
# tcpdump -ni eth0 tcp port 22
Ï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
Tráfico generado por la orden ping:
# tcpdump -ni eth0 "icmp[icmptype] == icmp-echoreply || icmp[icmptype] == icmp-echorequest"
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:
tcpudparpicmpcomo protocolo de capa de aplicación:
sshdhcpdnshttpftpAdemá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 -