Me gustaría capturar el tráfico en las interfaces virtuales de Linux, con fines de depuración. He estado experimentando con veth
, tun
y dummy
tipos de interfaz; en los tres, tengo problemas tcpdump
para mostrar algo.
Así es como configuro la interfaz ficticia:
ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up
En una terminal, míralo con tcpdump
:
tcpdump -i dummy10
En un segundo, escúchalo con nc
:
nc -l 99.99.99.1 2048
En un tercero, haga una solicitud HTTP con curl
:
curl http://99.99.99.1:2048/
Aunque en la terminal 2 podemos ver los datos de la curl
solicitud, no aparece nada tcpdump
.
Un tutorial Tun / Tap aclara algunas situaciones en las que el núcleo puede no enviar ningún paquete cuando uno está operando en una interfaz local:
Mirando la salida de tshark, vemos ... nada. No hay tráfico pasando por la interfaz. Esto es correcto: dado que estamos haciendo ping a la dirección IP de la interfaz, el sistema operativo decide correctamente que no es necesario enviar ningún paquete "en el cable", y el núcleo mismo está respondiendo a estos pings. Si lo piensa, es exactamente lo que sucedería si pinchara la dirección IP de otra interfaz (por ejemplo, eth0): no se enviarían paquetes. Esto puede sonar obvio, pero podría ser una fuente de confusión al principio (lo fue para mí).
Sin embargo, es difícil ver cómo esto podría aplicarse a los paquetes de datos TCP.
Tal vez tcpdump
debería estar vinculado a la interfaz de una manera diferente?
Respuestas:
El tráfico pasa por la
lo
interfaz.Cuando se agrega una IP a un cuadro, se agrega una ruta para esa dirección a la tabla 'local'. Todas las rutas en esta tabla enrutan el tráfico a través de la interfaz de bucle invertido.
Puede ver el contenido de la tabla 'local' con lo siguiente:
Que en mi sistema se ve así:
Así que, básicamente, si envío a todo el tráfico
10.230.134.38
,127.0.0.0/8
,127.0.0.1
(redundante) ,172.17.42.1
o192.168.0.20
, el tráfico se enruta a través de obtener la interfaz de bucle de retorno, a pesar de que esas IPs son realmente en una interfaz diferente.fuente
Puede usar
tcpdump
con cualquier interfaz en el host (tcpdump -i any ...
)fuente
Esto debería ser posible invocando un segundo sistema (puede ser incluso una VM en ese host).
Puede usar
DNAT
en laOUTGOING
cadena de lanat
tabla y redirigir los paquetes a una interfaz que el núcleo no controla. Tienes que reflejarlos allí:fuente