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

49

He buscado bastante por 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 problema es que también necesito una marca de tiempo en cada fila para mostrar exactamente cuándo el cliente se conectó a la segunda.

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

Estaba pensando que un script de shell de Linux podría funcionar si supervisaba un puerto local específico y escribía texto en un archivo cuando se realiza una conexión, luego concatena la fecha en cada línea.

Estaba jugando con esto:

netstat -ano|grep 443|grep ESTABLISHED

tan bien como esto:

tcptrack -i eth0 port 443

pero tampoco se ajusta a mis necesidades ya que necesito el momento en que entra la conexión.

Si tiene alguna sugerencia o podría señalarme en la dirección correcta, sería muy apreciado.

Gracias. :)


fuente
Haha migró de stackoverflow pero necesita migrar a unix / linux
Kolob Canyon

Respuestas:

71

editar : Todavía estoy recibiendo votos para esto años más tarde. Por favor, no busque esta respuesta, la respuesta que usaiptables aquí es muy superior en mi opinión.


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

o solo tcp-syn, o solo tcp-ack(supongo que sería ese), dependiendo de lo que necesite.

Wrikken
fuente
En lugar de mostrar el nombre de host para cada conexión, ¿hay alguna forma de anularlo con la IP?
Sí, agregue -ndespués de tcpdump (man tcpdump: -n No convierta direcciones (es decir, direcciones de host, números de puerto, etc.) a nombres. )
Escrito el
55
Yo diría que el spam del registro del núcleo no es realmente superior. ;)
Daniel B
1
Ah, pero lo haría, siempre que uno configure correctamente dónde deben ir los registros, por supuesto: P Pero bueno, esta respuesta todavía está aquí si eso es un
factor decisivo
2
@Wrikken, el problema con el uso del registro del kernel para esto es que, usando su solución cuando ctrl + c sale de tcpdump, todo permanece como antes. La solución de iptables significa dejar una "sorpresa" si no elimina la regla manualmente. Esta sorpresa puede traducirse en tener un disco raíz completo en poco tiempo. Lo siento, pero estoy votando esto (:
John Blackberry
31

Puede usar el soporte de iptables en el kernel de Linux para esto. La ventaja es que no requiere ningún software adicional para ser moderadamente útil. La desventaja es que requiere privilegios de root para configurar (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).

Agregue una regla de iptables con algo como:

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

(Ajuste la -I INPUTparte a su gusto).

Cuando se activa la regla, el núcleo emitirá una entrada de syslog. Por ejemplo, con una regla de entrada, la entrada del registro puede verse así:

5 de diciembre 09:10:56 kernel del nombre de host: [1023963.185332] HTTPS SYN: IN = ifX OUT = MAC = 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 08: 00 SRC = ABCD DST = WXYZ LEN = 52 TOS = 0x00 PREC = 0x20 TTL = 119 ID = 11901 DF PROTO = TCP SPT = 37287 DPT = 443 WINDOW = 8192 RES = 0x00 SYN URGP = 0

Luego, puede usar cualquier herramienta de monitoreo de registro corriente para hacer algo útil con esta información. Si su implementación de syslog lo admite, incluso puede dirigirlos a un archivo de registro separado, cumpliendo efectivamente su requisito de escribir los datos de conexión en un archivo con marca de tiempo al segundo sin software adicional.

Tenga en cuenta que el LOGobjetivo es un objetivo sin terminación, lo que significa que las reglas que siguen se evaluarán y la regla LOG no rechazará ni aceptará el paquete. Esto hace que el LOGobjetivo sea útil también para depurar las reglas del firewall.

Para evitar inundar su registro, considere usar el limitmódulo junto con esto. Consulte la página del comando man iptables (8) para obtener más información.

un CVn
fuente
¿Es posible ejecutar un script de Python que desencadene esto?
Karl Zillner
No olvides eliminar estas reglas de tablas de IP una vez que hayas terminado, de lo contrario, enviarán spam a los registros en gran medida dependiendo de la regla. digitalocean.com/community/tutorials/…
Mo Beigi
26

Micro-segunda resolución

Por defecto, la utilidad tcpdump informará el tiempo con una resolución de microsegundos. Por ejemplo:

$ sudo tcpdump -i any port 443

mostrará una salida similar a la siguiente:

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

Consulte tcpdump (8) para obtener una lista completa de las opciones de tcpdump y pcap-filter (7) para ver la sintaxis completa de los filtros que puede usar.

CodeGnome
fuente
5

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

tu puedes hacer

yum install ngrep o apt-get install ngrep

entonces corre

ngrep -W byline -d any port 443 -q
Halcyon vindicado
fuente
2

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

tcpflow -i eth0 -c port 7891

(opción -ipara mencionar la red, opción -cpara imprimir los paquetes en la consola)

reegan vijay
fuente
Esto es realmente un comentario y no una respuesta a la pregunta original. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente reputación podrá comentar cualquier publicación . Por favor lea ¿Por qué necesito 50 reputación para comentar? ¿Qué puedo hacer en su lugar?
DavidPostill
1

Puedes usar tcpdump o Wireshark.

sigjuice
fuente
0

Si necesita una solución permanente que siempre supervise el tráfico en los puertos de interés, le sugiero que use QoS (el comando tc en Linux). tc es un poco críptico e indocumentado, por lo que utilizo FireQoS para configurar QoS y netdata para monitorearlo en tiempo real.

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

Costa Tsaousis
fuente
Diría que esto es un poco excesivo para simplemente registrar conexiones, donde iPTables + --log funcionará.
djsmiley2k - Vaca
Tiene razón, es excesivo si necesita registrar las conexiones. Utilizo esta solución no para monitorear qué clientes se conectaron, sino cuánto ancho de banda usa el servicio.
Costa Tsaousis