Algunas herramientas o utilidades son conmúnmente ignoradas en nuestro día a día, y sin embargo, muchas de ellas guardan un potencial increíble, especialmente para la solución de problemas básicos. Tal es el caso de un comando de ESXi llamado “pktcap-uw“.

Este comando ha estado disponible desde hace varias versiones de ESXi y también ha tenido algunas mejoras que lo han convertido particularmente poderoso para inspeccionar paquetes de red que atraviesan el stack de TCP/IP del Kernel de ESXi. Es decir, que podemos observar cómo fluyen las comunicaciones de nuestras máquinas virtuales y de los adaptadores vmk también.

El comando es muy sencillo de usar pero para mantener un orden adecuado y posts limpios y cortos, en 3 series de posts les mostraré cómo utilizarlo. En estas series también incluiré un video de uso de este fabuloso comando.

Estructura

pktcap-uw es un comando bastante sencillo en su forma base, sin adicionar atributos extra, pero es posible hacer uso de estos atributos para que filtre paquetes con mucho detalle. Su estructura es como a continuación:

​pktcap-uw [*Argumento del Puerto del Switch] [*Opciones de Punto de Captura] [Opciones de Filtros] [Argumentos de control de salida del comando]

* Requerido

Argumento del Puerto del Switch

Especificamos el nombre de un objeto conectado al puerto del switch virtual al cual queremos inspeccionar su tráfico. Existen 3 tipos de objetos.

--switchport [id]

Captura paquetes específicos un adaptador virtual (vNIC) de una máquina virtual. Utiliza este argumento cuando quieras capturar paquetes del lado del kernel más cerca de la VM.

--vmk [vmk#]

Captura paquetes relacionados a un adaptador vmk del ESXi. Estos adaptadores se usan para habilitar algún tipo de servicio en el hypervisor como administración, vMotion, etc. Utiliza este argumento para capturar paquetes del lado más cercano a un VMK.

--uplink [vmnic#]

Captura paquetes en relación con el uplink de un ESXi, o lo que es lo mismo, del lado de una vmnic. Utiliza este argumento para inspeccionar paquetes del lado de las vmnics.

Opciones de Punto de Captura

Seleccionamos en cuál parte del kernel queremos capturar tráfico. La opción que que escojamos aquí dependerá de cuál argumento del puerto del switch hayamos colocado anteriormente. Existen aproximadamente 32 ubicaciones distintas, sin embargo, muchas deben utilizarse únicamente bajo supervisión de un Ingeniero de VMware ya que funcionan my dentro del kernel del ESXi. Las que veremos aquí son 8 que son más fáciles de analizar.

Se debe especificar el atributo capture en el comando antes de usar alguna de estas opciones.

--capture

VnicTx: Captura tráfico saliente de la maquina virtual.

VnicRx: Captura tráfico entrante hacia la máquina virtual.

TcpipTX: Captura tráfico saliente de un adaptador VMK.

TcpipRX: Captura tráfico entrante hacia un adaptador VMK.

PortOutput: Inspecciona tráfico saliendo del switch virtual. Puede ser tráfico de máquina virtual o VMK (si usamos --vmk o --switchport en el Argumento del Puerto del Switch)

PortInput: Inspeciona tráfico entrando hacia el switch virtual. También puede ser tráfico de máquina virtual o VMK.

UplinkSndKernel: Captura tráfico saliente por las vmnics en el último punto posible del kernel.

UplinkRcvKernel: Captura tráfico entrante por las vmnics en el primer punto posible del kernel.

Opciones de filtros

Lo usamos para filtrar con mayor detalle los paquetes que estamos inspeccionando basados en elementos como direcciones IP o MAC, puertos o protocolos.

Direcciones IP

Podemos filtrar por dirección IP de origen o destino, o cualquiera de las dos.

--srcip
--dstip
--ip

Direcciones MAC

También es posible filtrar por origen, destino o cualquiera con una dirección MAC.

--srcmac
--dstmac
--mac

Puertos

Para los puertos podemos especificar algun puerto en específico y hasta decidir si puede ser TCP o UDP.

--srcport
--dstport
--port
--udpport
--srcudpport
--dstudpport

Protocolos

La oportunidad de filtrar por protocolos de Capa 2 o 3 del Modelo OSI también es posible.

--proto (Capa 3)
--ethertype (Capa 2)
--vlan
--vxlan
--vni

Protocolos --protoProtocolos --ethertype

Argumentos de Control de Salida del Comando

Es posible controlar cómo queremos que la salida del comando se muestre en pantalla o se guarde en un archivo, también si sólo queremos capturar los primeros bytes de los paquetes.

Outfile

Con --outfile indicaremos el nombre del archivo .pcap donde guardaremos la captura de paquetes. Es necesario indicar la ruta completa, por ejemplo:

/vmfs/volumes/ds1/test.pcap

O sustituimos--outfile por -o.

Existe la posibilidad de enviar la salida del comando hacia un buffer, para que sea procesado por otro comando, como tcpdump-uw utilizando un guión luego de outfile:

--outfile -

PCAPNG

Algunas características de pktcap-uw necesita guardarse en un archivo .pcapng para poder analizar las capturas con algún software tipo Wireshark, de lo contrario no podremos ver los detalles correctos.

Podemos usar -P o --ng en conjunto con --outfile para que se guarde en formato pcapng. Es decir, así:

--ng --outfile  /vmfs/volumes/ds1/test.pcapng

ó

-P --outfile  /vmfs/volumes/ds1/test.pcapng

Cantidad de Paquetes

Algunas veces queremos capturar sólo una cantidad específica de paquetes. Podemos utilizar --count o -c para especificar cuantos paquetes capturar cuando corremos el comando.

--count 100

-c 500

Tamaño de los paquetes

Podemos decirle a pktcap-uw que capture únicamente los primeros bytes de cada paquete con --snaplen o -s y un valor mayor a 24.

Esto es útil cuando el tráfico es intenso en los ESXi o las máquinas virtuales.

--snaplen 32

-s 64

Ahora que conocemos los elementos importantes de pktcap-uw, es necesario entender cómo utilizarlos. Como mencioné, la forma básica de pktcap-uw es muy sencilla, donde podemos mezclar el Argumento del Puerto del Switch y el Punto de Captura y con esto ya estaríamos capturando paquetes en cierto punto del kernel de ESXi. Sin embargo, mi objetivo es enseñarles a capturar paquetes un poco más detallado para que las capturas sean efectivas y además eficientes con los recursos de CPU, Memoria y Disco de los ESXi.

Por lo tanto, se preguntarán, ¿en qué parte del kernel se encuentran aquellos parámetros --switchport, --vmk, --uplink y cómo puedo mezclarlos con los puntos de captura? Es más fácil si vemos la siguiente imagen y observamos los detalles de arriba (las máquinas virtuales o los adaptarores VMK) hacia abajo (los adaptadores vmnic). Es decir, analicemos la imagen como que si el tráfico estuviera saliendo del ESXi, y luego lo hacemos de la forma contraria.

En un video que grabaré en la tercera serie de estos posts explicaré esta imagen con detalle. Por el momento, mi recomendación es que se fijen en el orden de las flechas y siguiendo el tráfico saliente o entrante, empezando por el tráfico de la máquina virtual y luego del VMK.

Mapa de Puntos de Captura en ESXi

Como podemos ver, en el centro de la imagen tenemos un Switch Virtual. Importante mencionar que pktcap-uw funciona sin importar el tipo de switch que tengamos, puede ser Standard, Distribuido o inclusive un Switch Lógico de NSX (en la práctica es un Portgroup de un Switch Distribuido).

Ahora bien, desde el punto de vista del switch virtual en dirección hacia la máquina virtual o el adaptador VMK tenemos que el Argumento del Puerto del Switch puede ser --switchport para la VM o --vmk para el VMK, ¿sencillo verdad? Desde el Switch Virtual hacia la vmnic usamos --uplink.

Lo siguiente que tienen que notar son los puntos de captura, observen cómo cambian según el Argumento del Puerto del Switch y también la dirección del tráfico. Es importante tomar en cuenta tambien que algunos puntos de captura pueden estar antes o después de algunos filtros como el Dvfilter.

Para ir terminando este post, me gustaría compartirles algunos ejemplos sencillos y algunos otros un poco más detallados para que puedan ir entendiendo como se utilizan los comandos y como es posible hacer mezclas de atributos según los casos de uso que tengamos.

Caso de Uso de pktcap-uw con Ejemplos

A continuación explicaré un caso de uso sencillo y ejemplos de cómo capturar el tráfico pertinente con pktcap-uw.

Caso de Uso: Máquinas Virtuales sin conectividad de red después de un vMotion

Algunas veces las máquinas virtuales podrían perder conectividad de red después de efectuar un vMotion manual o automáticamente mendiante DRS. Es muy posible que esta conectividad no funcione hacia la red física. El primer paso sería hacer un ping entre máquinas virtuales en el mismo portgroup y en el mismo ESXi para validar que el stack de red de ESXi funciona.

Con pktcap-uw podríamos verificar si el protocolo ARP está funcionando perfectamente o no. La pregunta es, ¿en dónde capturo paquetes? Ya sabemos la estructura de pktcap-uw y conocemos los puntos de captura. Mi recomendación es siempre empezar inspeccionando paquetes lo más cercano al uplink para validar que los paquetes salen del ESXi y si tanto el ARP Request como el ARP Reply se ven, entonces proceder a cambiar la captura esta vez lo más cercano a la máquina virtual. Si notamos que algún paquete no se ve en este punto de la máquina virtual, estaríamos identificando un posible problema de configuración o funcionamiento del switch virtual. De lo contrario, podríamos aislar el problema en la red física (si falla el uplink) o en Sistema Operativo de la máquina virtual si los paquetes se ven en bien en todo el kernel de ESXi. No obstante, después de esta prueba de ARP, podríamos pasar de Capa 2 hacia Capa 3 y por último hacia Capa 7 y verificar otros protocolos para asegurarnos de que hemos encontrado el punto de falla correctamente.

¿Qué comandos ejecutamos?

Anota estos comandos ya que podrían ser muy útiles.

Lado saliente del Uplink

pktcap-uw --uplink vmnic6 --capture UplinkSndKernel --ethertype 0x0806 -o /vmfs/volumes/datastore/SalidaVmnic6.pcap --count 100

Lado entrante del Uplink

pktcap-uw --uplink vmnic6 --capture UplinkRcvKernel --ethertype 0x0806 -o /vmfs/volumes/datastore/EntradaVmnic6.pcap --count 100

Ethertype 0x0806 es ARP.

Para saber cuál vmnic o switchport debo usar, puedes revisar con esxtop que te dirá por cual vmnic o switchport está saliendo el tráfico de una VM o un VMK.

  1. Corre el comando esxtop
  2. Luego presiona la tecla n
  3. Busca la máquina virtual y anota el ID de la vmnic y el switchport.

Si los paquetes de ARP salen y entran al ESXi, quiere decir que la red física está funcionando posiblemente bien, al menos a nivel de capa 2. Ahora podemos profundizar un poco más y realizar una captura del lado de la máquina virtual para descartar o confirmar un problema en el Switch Virtual.

Lado entrante de la máquina virtual

pktcap-uw --switchport 100663305 --capture VnicRx --ethertype 0x0806 -o /vmfs/volumes/datastore/EntradaVnicVM.pcap -c 100

Lado saliente de la máquina virtual

pktcap-uw --switchport 100663305 --capture VnicTx --ethertype 0x0806 -o /vmfs/volumes/datastore/SalidaVnicVM.pcap -c 100

Ahora bien, podríamos utilizar comandos similares para monitorear otros tipos de tráfico en caso de que ARP y hasta un ping funcionen, pero HTTP no, por ejemplo.

pktcap-uw --switchport 100663305 --capture VnicTx --port 80 --dstip 192.168.0.150 -o /vmfs/volumes/datastore/SalidaVnicVM.pcap -c 100

Notemos como agregué --port 80 para filtrar por HTTP y también agregué un --dstip 192.168.0.151 para que filtre paquetes dirigidos hacia esa dirección IP. Ahora sabemos que también podríamos ejecutar ese mismo comando pero cambiando el punto de captura hacia la otra dirección con VnicRx, para saber si el tráfico HTTP tiene respuesta y cambiando el --dstip por --srcip ya que ahora esa dirección IP es la de origen.

¿Qué sigue?

Inspeccionando tráfico con pktcap-uw Parte 2

En el siguiente post de esta serie explicaré como utilizar pktcap-uw en conjunto con tcpdump-uw y obtener las ventajas de ambos comandos. También veremos dos puntos de captura especiales: Drop y Trace.

Ir ArribaIr a Home