Captura de paquetes Tcpdump (captura de paquetes de solicitud http)

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 o tcp[20:2]=0x4854

0x4745 son las dos primeras letras "GE" de "GET"

0x4854 son las dos primeras letras "HT" de "HTTP"

Explicación: En circunstancias normales: una conexión TCP normal tendrá tres etapas: 1. Apretón de manos de tres vías de TCP 2. Transmisión de datos 3. TCP agitado cuatro veces

Varios conceptos en su interior:

  • SYN: (Sincronizar número de secuencia, Sincronizar números de secuencia)
  • ACK: (número de confirmación, número de acuse de recibo)
  • FIN: (bandera final, FINish)

Apretón de manos TCP de tres vías (crear OPEN)

  1. El cliente inicia una solicitud para establecer una conexión TCP con el servicio, aquí está SYN(J)
  2. Después de recibir la solicitud de creación del cliente, el servidor devuelve dos mensajes: SYN(K) + ACK(J+1)
  3. Después de que el cliente recibe la información ACK del servidor y se verifica con éxito (J y J+1), devuelve un mensaje: ACK(K+1)
  4. Después de que el servidor reciba la verificación de información ACK del cliente con éxito (K y K+1), ya no devolverá información y luego ingresará a la etapa de comunicación de datos.

comunicación de datos

  1. Paquetes de lectura/escritura cliente/servidor

Apretón de manos TCP de cuatro vías (fin de cierre)

  1. El cliente inicia una solicitud de cierre y envía un mensaje: FIN(M)
  2. Después de recibir el mensaje, el servidor primero devuelve ACK (M+1), indicando que ha recibido el mensaje.
  3. Antes de que el servidor esté listo para cerrarse, finalmente envía un mensaje FIN(N) al cliente, preguntando si el cliente está listo para cerrarse.
  4. Después de recibir el mensaje enviado por el servidor, el cliente devuelve un mensaje de confirmación: ACK(N+1)
  5. Finalmente, cuando tanto el servidor como el cliente están confirmados, cada uno cierra o recicla la conexión TCP correspondiente.

Descripción detallada del estado (y ajuste de parámetros relacionados con Linux)

  1. SYN_SEND
    • El cliente intenta conectarse al servidor a través del método abierto. Es decir, se está cargando el protocolo de enlace de tres vías TCP... Después del primer paso en la cancelación de la recarga, preste atención al estado del cliente
    • sysctl -w net.ipv4.tcp_syn_retries = 2, como cliente, puede configurar el número de reintentos de paquetes SYN, el valor predeterminado es 5 veces (alrededor de 180). Cita del director: solo reintentar 2 veces, la red moderna es suficiente
  2. SYN_RECIBIDO
    • Después de que el servicio acepta el SYN de la solicitud de creación, es decir, el protocolo de enlace de tres vías de TCP se está cargando... Paso 2 en la cancelación de re-carga, antes de enviar el paquete ACK
    • Presta atención al estado del servidor, por lo general unos 15 son normales, si es demasiado grande se sospecha que está siendo atacado por SYN_FLOOD
    • sysctl -w net.ipv4.tcp_max_syn_backlog=4096 , establezca el número de colas de espera en este estado, el valor predeterminado es 1024, puede prevenir adecuadamente la inundación de sincronización después de aumentarla, vea man 7 tcp está cargando ... vuelva a cargar en Cancelar
    • sysctl -w net.ipv4.tcp_syncookies=1 , abre syncookie, proporciona un mecanismo para intercambiar temporalmente el enlace de sincronización cuando la cola de sincronización es insuficiente
    • sysctl -w net.ipv4.tcp_synack_retries = 2, como el número de reintentos para que el servidor devuelva el paquete ACK, el valor predeterminado es 5 veces (alrededor de 180). Cita del director: solo 2 reintentos, la red moderna es suficiente
  3. ESTABLECIDO
    • El estado después de que el cliente recibe el paquete ACK del servidor, y el servidor se ESTABLECE después de enviar el ACK dentro de un cierto período de tiempo
    • sysctl -w net.ipv4.tcp_keepalive_time = 1200, el valor predeterminado es 7200 segundos (2 horas), el sistema realizará una verificación de latidos para enlaces inactivos, si excede net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = predeterminado 11 minutos , termine el enlace tcp correspondiente, la frecuencia de la verificación de latidos se puede ajustar adecuadamente
    • Advertencia de monitoreo en línea actual: 600, crítico: 800
  4. FIN_WAIT1
  5. CLOSE_WAIT
  6. FIN_WAIT2
    • La parte que cierra activamente, después de recibir el ACK de la parte pasiva cerrada, es decir, el protocolo de enlace de cuatro vías TCP está cargando... el segundo paso de volver a cargar y cancelar
    • sysctl -w net.ipv4.tcp_fin_timeout=30, puede establecer el período de tiempo de espera después de que la parte pasiva cercana devuelva FIN, recicle efectivamente el enlace y evite la inundación de sincronización.
  7. LASK_ACK
  8. TIEMPO DE ESPERA
    • La parte que cierra activamente envía ACK después de recibir el paquete FIN de cierre pasivo. Es decir, se está cargando el protocolo de enlace de cuatro vías TCP... el cuarto paso de la cancelación de la recarga
    • sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打开快速回收TIME_WAIT,No se recomienda habilitar esta opción ya que esto causa problemas cuando se trabaja con NAT (traducción de direcciones de red)
    • sysctl -w net.ipv4.tcp_tw_reuse =1, recicle y reutilice rápidamente el enlace TIME_WAIT, parece entrar en conflicto con tw_recycle, ¿reciclar si no se puede reutilizar?
    • net.ipv4.tcp_max_tw_buckets: el número máximo de conexiones en el estado time_wait, el valor predeterminado es 180000.

Instrucciones relacionadas:

  1. Después de recibir la solicitud FIN de la parte de cierre pasiva, la parte de cierre activa cambia su estado de FIN_WAIT2 a TIME_WAIT después de enviar con éxito un ACK a la otra parte, y debe esperar el doble de MSL (vida útil máxima del segmento, MSL es un datagrama). que pueda existir en la internetwork) Pasado el tiempo, ambas partes pueden cambiar el estado a CERRADO para cerrar la conexión. Actualmente, el tiempo para mantener el estado TIME_WAIT en RHEL es de 60 segundos.
  2. La estrategia keepAlive puede evitar efectivamente el apretón de manos de tres vías y el cierre de cuatro vías

Otros parámetros importantes de la red

parámetro net.ipv4.tcp_rmem

  • Predeterminado: mínimo = 4096 predeterminado = 87380 máximo = 4194304

parámetro net.ipv4.tcp_wmem

  • Predeterminado: mínimo = 4096 predeterminado = 16384 máximo = 4194304


volcado tcp

Tcpdump es una herramienta de captura de paquetes que viene con el sistema linux. Es principalmente a través de la línea de comando. Es más adecuado para operaciones de captura de servidores en línea. Si es Windows o ubuntu, puede elegir algunas herramientas gráficas. Ubuntu recomienda usar wireshark. El método de instalación es muy simple, solo sudo apt.

Formato de línea de comando:

tcpdump [-adeflnNOpqStvx] [-c número] [-F nombre de archivo] [-i interfaz de red] [-r nombre de archivo] [-s snaplen] [-T tipo] [-w nombre de archivo] [expresión]

Parámetros comunes:

-l hace que la salida estándar se almacene en búfer
-n no convierte las direcciones de red en nombres;

-c Después de recibir la cantidad especificada de paquetes, tcpdump se detendrá;
-i especifica la interfaz de red para monitorear; (si no se especifica, puede monitorearse en la tarjeta de red predeterminada, debe especificar la tarjeta de red vinculada a una IP específica )
-w directamente El paquete se escribe en el archivo, pero no se analiza ni se imprime;
-s especifica el tamaño del paquete grabado, el común -s 0 representa el valor máximo de 65535, la mitad de la unidad mínima de transmisión de Linux MTU es 1500, que es suficiente

-X envía directamente datos de datos del paquete, que no están configurados de forma predeterminada, y solo se pueden generar especificando el archivo con -w

Expresiones comunes:

  1. Palabras clave sobre tipos, principalmente host, red, puerto
  2. Las palabras clave de la dirección de transmisión incluyen principalmente src, dst, dst o src, dst y src
  3. Palabras clave de protocolo, que incluyen principalmente fddi, ip, arp, rarp, tcp, udp y otros tipos
  4. Operación lógica, la operación de negación es 'no', '!', y la operación es 'y', '&&'; o la operación es 'o', '||'
  5. Otras palabras clave importantes son las siguientes: puerta de enlace, difusión, menos, mayor

Ejemplos prácticos:

1. Captura de paquetes HTTP (salida directa de datos del paquete en el terminal)

tcpdump tcp port 80 -n -X -s 0 especifica el puerto 80 para la salida

2. Capture el archivo especificado de datos del paquete http para enviar el paquete

tcpdump puerto tcp 80 -n -s 0 -w /tmp/tcp.cap

El /tmp/tcp.cap correspondiente básicamente puede ver la información a simple vista, como encabezado http, información de contenido, etc.

3. Combinación de flujo de tubería

tcpdump puerto tcp 80 -n -s 0 -X -l | grep xxxx

Esto permite el filtrado de coincidencia de cadenas de paquetes en tiempo real

4. captura de paquetes de proxy inverso mod_proxy

Servidor en línea apache+jetty, un proxy inverso a través de apache mod_proxy, puerto 80 apache, puerto 7001 jetty

Captura de datos del puerto Apache: tcpdump tcp port 80 -n -s 0 -X -i eth0 Nota: especifique la interfaz de red eth0

Captura de datos del puerto Jetty: tcpdump tcp port 7001 -n -s 0 -X -i lo Nota: especifique la interfaz de red Loopback

5. Solo monitoree hosts IP específicos

tcpdump host tcp 10.16.2.85 y puerto 2100 -s 0 -X 

Debe usar una combinación de expresiones tcp, aquí está la instrucción del host para escuchar solo la ip

Consejos:

1. Se puede combinar con tcpdump (comando) + wireshark (gráfico)

funcionar: 

    • Ejecute tcpdump -w /tmp/tcp.cap en el servidor para especificar el archivo externo de salida
    • scp /tmp/tcp.cap copie el archivo a su local
    • wireshark & ​​empezar wireshark
    • Abra el archivo copiado a través de Archivo -> Abrir, para que pueda usarlo para el análisis de paquetes.
    • El resto es muy conveniente.
tcpdump  -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -vvv
13:45:34.199147 IP (tos 0x0, ttl 64, id 40098, offset 0, flags [DF], proto TCP (6), length 3545)
    host-11-11-35-35.65530 > 11.18.11.18.http: Flags [P.], cksum 0x8c84 (incorrect -> 0x1d14), seq 2648134490:2648137995, ack 3508301428, win 15, length 3505: HTTP, length: 3505
  GET /static/js/chunk-55fc74fe.31902c3d.js HTTP/1.0
  Host: zb.ik.com
  X-Real-IP: 11.22.162.12
  X-Forwarded-For: 11.22.162.12
  Connection: close
  sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
  sec-ch-ua-mobile: ?0
  User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
  sec-ch-ua-platform: "macOS"
  Accept: */*
  Sec-Fetch-Site: same-origin
  Sec-Fetch-Mode: no-cors
  Sec-Fetch-Dest: script
  Referer: https://zb.ik.com/
  Accept-Encoding: gzip, deflate, br
  Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  Cookie: www.likecs.com|t_331182531_|tuguan; areaId=1;  
  X-Jdlb-Client-Port: 5604
  J-Forwarded-For: 10.0.16.131
  X-Original-To: 178.20.36.249

Supongo que te gusta

Origin blog.csdn.net/philip502/article/details/127207828
Recomendado
Clasificación