Capturar tráfico en NETinVM puede hacerse tanto en base como en las máquinas KVM. Como en cualquier entorno corporativo, para poder capturar todo el tráfico que atraviesa un conmutador (switch), es necesario utilizar un puerto espejo, es decir, un puerto configurado para recibir copia de todo el tráfico que atraviese el conmutador.
Los tres conmutadores de NETinVM están configurados con un puerto espejo para que la captura desde base sea lo más sencilla posible. Estos puertos son mirror-ext, mirror-dmz y mirror-int; y, lógicamente, permiten capturar el tráfico que atraviesa los conmutadores de la red externa, DMZ e interna, respectivamente. La captura de tráfico en base ya la tenemos descrita en la entrada «Aprendiendo a trabajar con NETinVM«, concretamente en la actividad 13 de la práctica “Seguridad informática – Introducción a NETinVM”.
No obstante, en muchos casos puede ser interesante capturar el tráfico desde una máquina KVM de cualquiera de las redes. En este artículo usaremos como ejemplo la máquina intc, conectada a la red interna; pero el procedimiento se puede aplicar a cualquiera de las máquinas KVM.
Descripción general
A grandes rasgos, el proceso es como sigue:
- Se añade una interfaz Ethernet de captura a la máquina virtual KVM (intc en este caso) y se conecta a la red virtual adecuada (la interna, en este caso). En el mundo físico este paso sería equivalente a conectar una interfaz de red adicional al ordenador (por ejemplo, una interfaz USB) y conectar un cable a un puerto del conmutador correspondiente.
- Se configura la interfaz Ethernet en la máquina virtual KVM. (Igual que se haría con una interfaz física en un ordenador).
- Se configura el conmutador para que copie el tráfico al dicho puerto. (Igual que se haría con un conmutador físico).
Instrucciones detalladas
Las instrucciones paso a paso son las siguientes:
Paso 1: arrancar intc
Si no se ha hecho todavía, poner en marcha intc y, si se desea que intc pueda conectarse a otras redes, fw. (Lógicamente tiene sentido poner en marcha otras máquinas para generar el tipo de tráfico que se desee analizar).
Paso 2: añadir una interfaz Ethernet a intc y conectarla al conmutador
Para añadir la interfaz, es necesario, como «user1» en base, ejecutar la siguiente orden:
virsh attach-interface intc --type network --source int --target capture-intc --model virtio --live
Esta orden añade a intc una interfaz Ethernet conectada al conmutador «int» (el de la red interna). En base, esta interfaz tendrá el nombre «capture-intc», y en intc, como será la segunda interfaz, tendrá el nombre eth1.
Paso 3: preparar la interfaz en intc
Para comprobar que ha sido añadida correctamente, en intc, como «root», se debe ejecutar la orden:
ip addr
Debe aparecer eth1. Lógicamente no tendrá asignada IP y estará en el estado «DOWN». Para poder usar la interfaz para capturar paquetes no es necesario que tenga una IP asignada, pero sí es necesario que esté en el estado UP. Por tanto, será necesario ejecutar la orden:
ip link set dev eth1 up
Finalmente, para que los paquetes capturados incluyan el checksum, será necesario asegurarse de que no se delega en la interfaz el cálculo de dicho checksum. Para ello es necesario utilizar «ethtool» para desactivar GRO Y LRO:
ethtool -K eth1 gro off lro off
(En este caso «ethtool» indica que LRO no se puede desactivar. Esto no es un problema, simplemente queremos estar seguros de que no está activo).
Paso 4: configurar el puerto espejo en el conmutador
Queremos que el conmutador de la red interna envíe una copia de los paquetes a la interfaz eth1 de intc. Como esta interfaz tiene el nombre «capture-intc» en base, será necesario ejecutar como «root» en base la orden:
ovs-vsctl --id=@p get port capture-intc -- --id=@m create mirror name=mirror-capture-intc select-all=true output-port=@p -- add bridge virbr-int mirrors @m
Este orden añade un mirror (espejo) denominado «mirror-capture-intc» que incluye todo el tráfico («select-all=true») al conmutador virbr-int. El puerto de salida de este mirror es el puerto «capture-intc», es decir, la interfaz eth1 de intc.
Paso 5: capturar el tráfico
Una vez llegados a este punto, la interfaz eth1 de intc permite capturar todo el tráfico que atraviesa el conmutador virbr-int. Por tanto, un simple «tcpdump» como «root» en inct servirá:
tcpdump -ni eth1
Eso sí, como el único tráfico que atraviesa el conmutador es el generado por base y/o las máquinas KVM de la red interna, será necesario generar el tráfico. Por ejemplo, desde base se puede ejecutar:
ping -c 1 10.5.2.254