Capturar tráfico de red con tcpdump en Linux

Como bien sabemos en Linux existen multitud de herramientas para monitorizar y capturar el tráfico de una red. TCPdump es una de ellas y nos facilitará la tarea de recopilar este tipo de información de forma fácil y rápida.

Lo primero que deberemos hacer será instalar el programa desde el terminal:

sudo apt-get install tcpdump

Una vez instalado procedemos por ejemplo a capturar el tráfico HTTPS con el siguiente comando aunque se podría capturar el tráfico de cualquier otro puerto como el 22 (SSH), 25 (SMTP), 80 (HTTP)…

sudo tcpdump tcp port 443
pi@raspberrypi:~ $ sudo tcpdump tcp port 443
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
13:14:22.689078 IP 192.168.1.202.34952 > server-13-33-235-94.mad51.r.cloudfront.net.https: Flags [.], ack 120063348, win 2538, options [nop,nop,TS val 4072468548 ecr 2103667772], length 0
13:14:22.699114 IP server-13-33-235-94.mad51.r.cloudfront.net.https > 192.168.1.202.34952: Flags [.], ack 1, win 130, options [nop,nop,TS val 2103672326 ecr 4072423030], length 0
13:14:25.777734 IP 212.119.29.132.https > 192.168.1.202.52910: Flags [P.], seq 93192774:93192801, ack 919532583, win 2159, options [nop,nop,TS val 643869071 ecr 4250646701], length 27
13:14:25.777858 IP 192.168.1.202.52910 > 212.119.29.132.https: Flags [.], ack 27, win 273, options [nop,nop,TS val 4250655781 ecr 643869071], length 0
13:14:25.778244 IP 192.168.1.202.52910 > 212.119.29.132.https: Flags [P.], seq 1:28, ack 27, win 273, options [nop,nop,TS val 4250655782 ecr 643869071], length 27
13:14:25.816250 IP 212.119.29.132.https > 192.168.1.202.52910: Flags [.], ack 28, win 2159, options [nop,nop,TS val 643869081 ecr 4250655782], length 0
^C
6 packets captured
6 packets received by filter
0 packets dropped by kernel

Si queremos guardar esta información en un fichero para tenerlo a mano simplemente habría que volcarlo en un archivo de la siguiente manera:

sudo tcpdump tcp port 443 -w /home/pi/captura.log

Para poder leer el contenido del log será necesario cambiar el parámetro por «r»:

tcpdump -r captura.log 
pi@raspberrypi:tcpdump -r captura.log 
 reading from file captura.log, link-type EN10MB (Ethernet)
 13:21:57.089075 IP 192.168.1.202.34952 > server-13-33-235-94.mad51.r.cloudfront.net.https: Flags [.], ack 120064852, win 2603, options [nop,nop,TS val 4072922952 ecr 2103713157], length 0
 13:21:57.098379 IP server-13-33-235-94.mad51.r.cloudfront.net.https > 192.168.1.202.34952: Flags [.], ack 1, win 139, options [nop,nop,TS val 2103717765 ecr 4072691048], length 0

También podemos capturar el tráfico dirigido a un destino, por ejemplo en este caso a nuestra Raspberry (192.168.1.202) con el comando: «sudo tcpdump tcp port 443 and dst 192.168.1.202«

pi@raspberrypi:~ $ sudo tcpdump tcp port 443 and dst 192.168.1.202
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
08:56:57.997464 IP 165.254.239.132.https > 192.168.1.202.34238: Flags [P.], seq 2482152072:2482152528, ack 4108062054, win 1452, options [nop,nop,TS val 190272497 ecr 4208058993], length 456
08:56:58.192819 IP 165.254.239.133.https > 192.168.1.202.50488: Flags [S.], seq 3869791175, ack 3503885378, win 28960, options [mss 1400,nop,nop,TS val 256293030 ecr 3413755198,nop,wscale 7], length 0
08:56:58.364868 IP 165.254.239.133.https > 192.168.1.202.50488: Flags [.], ack 209, win 235, options [nop,nop,TS val 256293073 ecr 3413755370], length 0

Por otro lado, si queremos capturar el tráfico de origen: «sudo tcpdump tcp port 443 and src 192.168.1.202«

pi@raspberrypi:~ $ sudo tcpdump tcp port 443 and src 192.168.1.202
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
09:00:34.471570 IP 192.168.1.202.54850 > 212.119.29.132.https: Flags [.], ack 1536060295, win 501, options [nop,nop,TS val 3114967182 ecr 661661245], length 0
09:00:34.480797 IP 192.168.1.202.54850 > 212.119.29.132.https: Flags [.], ack 33, win 501, options [nop,nop,TS val 3114967192 ecr 661661247], length 0
09:00:34.483573 IP 192.168.1.202.54850 > 212.119.29.132.https: Flags [P.], seq 0:690, ack 33, win 501, options [nop,nop,TS val 3114967194 ecr 661661247], length 690
09:00:34.632739 IP 192.168.1.202.54850 > 212.119.29.132.https: Flags [.], ack 65, win 501, options [nop,nop,TS val 3114967344 ecr 661661275], length 0

En cualquier caso la herramienta tcpdump dispone de una gran cantidad de opciones que podemos consultar como siempre con el comando «man». Podréis observar que se pueden aplicar multitud de parámetros para capturar el tráfico de forma exhaustiva aplicando las condiciones que queramos en nuestra consulta:

man tcpdump