IPCDump es una aparejo para rastrear la comunicación entre procesos (IPC) en Linux. Cubre la mayoría de los mecanismos comunes de IPC: tuberías, fijos, señales, sockets UNIX, redes basadas en tirabuzón de retorno y pseudo-terminales. Es una aparejo útil para depurar aplicaciones multiproceso y una forma sencilla de comprender cómo se comunican entre sí las distintas partes móviles de su sistema. I
Puede realizar un seguimiento tanto de los metadatos como del contenido de esa comunicación y es particularmente adecuado para rastrear IPC entre procesos de corta duración, lo que puede ser complicado con herramientas de depuración tradicionales como strace o gdb. Asimismo tiene algunas funciones de filtrado básicas que puede utilizar para averiguar en grandes cantidades de eventos.
La longevo parte de la información que recopila ipcdump proviene de ganchos BPF colocados en kprobes y puntos de rastreo en funciones secreto en el kernel, aunque además completan cierta contabilidad del sistema de archivos / proc. Para hacer esto, ipcdump usa mucho gobpf, que proporciona el enlace de Golang para el situación bcc.
Requisitos y uso
- Golang> = 1.15.6
- Sistemas operativos y kernels probados
Ubuntu 18.04 LTS | Ubuntu 20.04 LTS | |
---|---|---|
4.15.0 | Comprobado | No probado |
5.4.0 | No probado | Comprobado |
5.8.0 | No probado | Comprobado* |
Nota: Requiere recopilar bcc desde la fuente
edificio
Dependencias
Instalación rápida go –classic
o directamente desde el sitio web de Golang
- Instale BCC de acuerdo con las instrucciones de iovisor, dependiendo del sistema eficaz que haya seleccionado (generalmente, las versiones más nuevas deben construirse a partir del código fuente).
Crear ipcdump
Clon de Git https://github.com/guardicore/IPCDump
cd IPCDump / cmd / ipcdump
Ir a construir
usar
./ ipcdump -h
Usando ./ipcdump:
-B uint
Número mayor de bytes que se generarán por evento o 0 para el evento completo (puede ser prócer). sólo es útil si se especifica -x.
-Valía D
Filtrar por comunicación de destino (se puede especificar varias veces)
-L no imprime información de eventos perdidos
-Valía P
Filtrar por comunicación (ya sea de origen o de destino, se puede especificar más de una vez)
-Valía S
Filtrar por fuente de comunicación (se puede especificar varias veces)
-c uint
Salir posteriormente de los eventos
-d valía
Filtrar por PID objetivo (se puede especificar varias veces)
-f dependencia
Formato de salida (el en serie es texto) («texto» en serie)
-valor p
Filtrar por PID (ya sea de origen o de destino, se puede especificar más de una vez)
vale la pena
Filtrar por fuente PID (se puede especificar varias veces)
-no vale la pena
Filtrar por tipo (se puede especificar más de una vez).
títulos posibles: a | todo k | señal u | unix ud | unix-dgram us | unix-stream t | pty lo | loopback según | loopback-tcp lu | loopback-udp p | tubo
-x Imprime los bytes de IPC donde sea relevante (y no solo los detalles del evento).
Un trazador de líneas
Ejecutar como root:
#Volcar todo el IPC en el sistema
./ipcdump
# Volcado de señales que se envían entre dos procesos cualesquiera
./ipcdump -t kill
#dump loopback de metadatos de conexión TCP cerca de o desde pid 1337
./ipcdump -t loopback-tcp -p 1337
#Dump de contenido y metadatos de IPC de Unix Socket de Xorg
./ipcdump -t Unix -x -S Xorg
#dump json metadatos de E / S de tubería formateados y los primeros 64 bytes de contenido
./ipcdump -t tubería -x -B 64 -f json
propiedades
- Soporte para tuberías y FIFO
- IPC de tirabuzón invertido
- Señales (regulares y en tiempo auténtico)
- Flujos y datagramas de Unix
- IPC basado en pseudo-terminal
- Filtrado de eventos basado en el nombre o el PID del proceso
- Salida con formato JSON o humano
diseño
ipcdump se compone de varios recopiladores, cada uno de los cuales es responsable de un tipo específico de evento de IPC. Por ejemplo, IPC_EVENT_LOOPBACK_SOCK_UDP
o IPC_EVENT_SIGNAL
.
En la praxis, todos los recopiladores se crean con ganchos bpf que se adjuntan a kprobes y puntos de seguimiento. Sin retención, sus implementaciones son completamente independientes; no hay ninguna razón en particular para suponer que nuestra información siempre proviene de bpf. Sin retención, los diferentes recopiladores deben compartir un solo módulo bpf porque deben compartir un código global. Para hacer esto, estamos compartiendo un solo BpfBuilder (que es esencialmente un contenedor para concatenar cadenas de código bcc) y cada recopilador registra su propio código con este constructor. Luego, el script bcc completo se carga con gobpf y cada módulo coloca los ganchos que necesita.
Actualmente, existen dos tipos de contabilidad que comparten los recopiladores de IPC:
SocketIdentifier (internal/collection/sock_id.go)
– tarjetas entre núcleosstruct sock*
y los procesos que utilizan.CommIdentifier (internal/collection/comm_id.go)
– Asignaciones entre números PID y los nombres de proceso correspondientes (/proc/<pid>/comm
). La contabilidad en cada una de estas áreas es particularmente importante para los procesos de corta duración. Esta información se puede analizar seguidamente en modo de usufructuario/proc
A menudo, el proceso relevante desaparece cuando el evento golpea al regulador. Eso significa que a veces completamos información/proc
. Esto ocurre principalmente con los procesos que existían antaño de que se ejecutara ipcdump. En este caso, no se registran eventos como la denominación de procesos.SocketIdentifier
yCommIdentifier
Intente inducir esta dualidad entre el código bcc y/proc
Analizando detrás de una sola API, aunque no es súper noble. Por cierto, en las súper nuevas versiones de Linux (5.8), los iteradores bpf pueden reemplazar completamente esta contabilidad, aunque probablemente deberíamos ceñirnos al canon hooks-and-procfs por el momento por razones de compatibilidad con versiones anteriores.
El evento se emite a través del global EmitIpcEvent()
Función que utiliza un formato de evento en serie (proceso de origen, proceso de destino, pares de metadatos-clave-valor y contenido) y los genera en un formato uniforme. Para racionar ufano de lado de eventos, los recopiladores generalmente no generan contenido de IPC cuando el -x
La bandera no está especificada. Hace esto con una elegante hechicería de preprocesamiento. internal/collection/ipc_bytes.go
.