2013-06-07 15:55:48 +0000 2013-06-07 15:55:48 +0000
51
51

Monitorear el tráfico TCP en un puerto específico

He buscado bastante extensamente para esto, pero parece que no puedo encontrar un ejemplo que funcione.

Mi objetivo es monitorear el tráfico TCP en un puerto específico para ver las conexiones entrantes y escribirlas en un archivo de texto. El truco es que también necesito una marca de tiempo en cada fila para mostrar exactamente cuándo el cliente se conectó al segundo.

Ya he agotado netstat, nmap y tcptrack, pero ninguno soporta marca de tiempo.

Estaba pensando que un shell script de linux podría funcionar si monitoreara un puerto local específico y escribiera texto en un archivo cuando se hace una conexión y luego sólo concatenara la fecha en cada línea.

Estaba jugando con esto:

netstat -ano|grep 443|grep ESTABLISHED

así como con esto:

tcptrack -i eth0 port 443

pero ninguno de los dos se ajusta a mis necesidades ya que necesito el tiempo en el que se realiza la conexión.

Si tienes alguna sugerencia o puedes indicarme la dirección correcta sería muy apreciado.

Gracias. :)

Respuestas (7)

73
73
73
2013-06-07 16:03:28 +0000

edición : Todavía estoy recibiendo votos para esto años después. Por favor, no vayas por esta respuesta, la respuesta usando iptables aquí es muy superior en mi opinión.

  • *
tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

o sólo tcp-syn, o sólo tcp-ack (mi suposición sería esa), dependiendo de lo que necesites.

33
33
33
2014-12-05 15:08:24 +0000

Puedes usar el soporte de iptables en el kernel de Linux para esto. La ventaja es que no requiere ningún software extra para ser moderadamente útil. La desventaja es que requiere privilegios de root para configurarlo (pero dado que está hablando del puerto 443, que es un puerto privilegiado, probablemente necesite privilegios de root con la mayoría de las soluciones).

Añada una regla de iptables con algo como:

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "

(Ajuste la parte -I INPUT a su gusto.)

Cuando se active la regla, el kernel emitirá una entrada de syslog. Por ejemplo, con una regla de entrada, la entrada del registro puede parecerse a algo como:

Dec 5 09:10:56 nombre de host del kernel: [1023963.185332] HTTPS SYN: IN=ifX OUT= MAC=80:80:80:80:80:80:80:80:80:80:08:00 SRC=A.B.C.D D DST=W.X.Y. Z LEN=52 TOS=0x00 PREC=0x20 TTL=119 ID=11901 DF PROTO=TCP SPT=37287 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0

Puede usar cualquier herramienta de monitoreo de registros de corridas para hacer algo útil con esta información. Si su implementación de syslog lo soporta, puede incluso dirigirlos a un archivo de registro separado, cumpliendo efectivamente su requerimiento de escribir los datos de conexión en un archivo con fecha y hora al segundo sin software adicional.

Tenga en cuenta que el objetivo de LOG es un objetivo no terminal, lo que significa que cualquier regla que lo siga será evaluada, y el paquete no será ni rechazado ni aceptado por la propia regla de LOG. Esto hace que el objetivo LOG sea útil también para depurar las reglas del cortafuegos.

Para evitar que su registro se inunde, considere utilizar el módulo limit junto con esto. Vea la página de manual de iptables(8) para más detalles.

26
26
26
2013-06-07 16:13:36 +0000

Resolución de micro-segundos

Por defecto, la utilidad tcpdump reportará el tiempo con resolución de micro-segundos. Por ejemplo:

$ sudo tcpdump -i any port 443

mostrará una salida similar a la siguiente:

12:08:14.028945 IP localhost.33255 > localhost.https: Flags [S], seq 1828376761, win 43690, opciones [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], length 0 12:08:14.028959 IP localhost.https > localhost.33255: Flags [R.], seq 0, ack 1828376762, win 0, length 0

Ver tcpdump(8) para una lista completa de las opciones de tcpdump, y pcap-filter(7) para la sintaxis completa de los filtros que puedes usar.

5
5
5
2013-06-07 16:09:31 +0000

443 es tráfico encriptado - tan difícil de hacer cabezas o colas del tráfico en este puerto de todos modos:

puedes hacer

yum instalar ngrep o apt-get instalar ngrep

y luego ejecutar

ngrep -W byline -d any port 443 -q
2
2
2
2016-06-02 09:48:03 +0000

Puede requerir esto también para monitorear los paquetes entrantes y salientes de otras máquinas.

tcpflow -i eth0 -c port 7891

(opción -i para mencionar la red, opción -c para imprimir los paquetes en la consola)

1
1
1
2013-06-07 15:59:57 +0000

Puedes usar tcpdump o Wireshark.

0
0
0
2017-05-26 11:08:35 +0000

Si necesitas una solución permanente que siempre monitorice el tráfico en los puertos de interés, sugiero usar QoS (el comando tc en linux). tc es un poco críptico e indocumentado, así que uso el FireQoS para configurar el QoS y netdata para monitorizarlo en tiempo real.

Comprueba esto para más información: https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers