
rustnet v1.5.0
Monitoreo de red por proceso para tu terminal con inspección profunda de paquetes. Multiplataforma, en sandbox.
RustNet
Monitoreo de red por proceso para tu terminal: conexiones TCP, UDP y QUIC en vivo con inspección profunda de paquetes, aislado por defecto.
Visibilidad en tiempo real de cada conexión que realiza tu máquina, quién la posee y qué protocolo utiliza. Sin tcpdump, reenvío de X11 ni tuberías con root.
Características
- Atribución por proceso: Cada conexión TCP, UDP y QUIC se asigna a su proceso propietario, mediante eBPF en Linux, PKTAP en macOS, ETW con respaldo automático de IP Helper en Windows y APIs nativas en FreeBSD. Los detalles incluyen PID, ejecutable, nombres de usuario/grupo, confianza de coincidencia y una cadena de procesos padre limitada en cada plataforma. Wireshark y tcpdump no pueden hacer esto;
netstat/ssno pueden mostrar el estado en vivo. - Inspección profunda de paquetes: Identifica HTTP, HTTPS/TLS con SNI, DNS, SSH, FTP, QUIC, MQTT, BitTorrent, STUN, NTP, mDNS, LLMNR, DHCP, SNMP, SSDP y NetBIOS, sin disectores externos.
- Exportación PCAPNG anotada:
--pcapng-exportescribe una captura lista para Wireshark con proceso, PID, dirección, DPI/SNI y GeoIP incrustados como comentarios por paquete. Ábrela en Wireshark y cada paquete ya nombra su proceso propietario, sin post-procesamiento. También está disponible la exportación clásica--pcap-exportcon un archivo lateral JSONL para correlación fuera de línea. - Aislamiento de seguridad: Landlock (Linux 5.13+), Seatbelt (macOS), reducción de privilegios de token + bloqueo de procesos hijos con job-object (Windows). Reduce privilegios inmediatamente después de que libpcap se inicializa. Consulta SECURITY.md.
- Analítica de red: Tiempos de ida y vuelta en tiempo real para TCP, handshakes QUIC, respuestas DNS y eco ICMP, además de detección de retransmisiones TCP, paquetes fuera de orden y retransmisiones rápidas.
- Ciclo de vida inteligente de conexiones: Tiempos de espera conscientes del protocolo con indicadores de obsolescencia blanco → amarillo → rojo. Alterna con
tpara mantener visibles las conexiones históricas (cerradas) para análisis forense. - Filtrado estilo Vim/fzf:
port:,src:,dst:,sni:,process:,state:,proto:, además de regex mediante/(?i)patrón/. - Enriquecimiento GeoIP: Consultas de país mediante MaxMind GeoLite2 local. Sin llamadas de red.
- Identificación de dispositivos LAN: Dirección MAC y fabricante (de la base de datos IEEE OUI integrada) para pares en el enlace y la puerta de enlace, aprendido pasivamente del tráfico ARP y mostrado en el panel de detalles.
- Atribución Kubernetes (característica opcional
kubernetes): conexiones asignadas a su pod, namespace y contenedor, mostradas en el panel de detalles, exportaciones JSON/PCAPNG y los filtrospod:,ns:,container:. Habilitada en la imagen oficial de Docker; en un clúster, usa el plugin kubectl-rustnet para ejecutarlo como un pod de depuración efímero. Consulta USAGE.md. - Multiplataforma: Linux, macOS, Windows, FreeBSD.
¿Por qué RustNet?
RustNet llena el vacío entre las herramientas simples de conexión (netstat, ss) y los analizadores de paquetes (Wireshark, tcpdump):
- Atribución de procesos: Ve qué aplicación posee cada conexión. Wireshark no puede proporcionar esto porque solo ve paquetes, no sockets.
- Vista centrada en conexiones: Rastrea estados, ancho de banda y protocolos por conexión en tiempo real
- Amigable con SSH: La TUI funciona a través de SSH para que puedas ver rápidamente qué está sucediendo en un servidor remoto sin reenviar X11 ni capturar tráfico
RustNet complementa las herramientas de captura de paquetes. Usa RustNet para ver qué está haciendo conexiones. Para inspección directa con Wireshark, --pcapng-export escribe comentarios de paquetes en vivo con contexto de PID/proceso. Para correlación en tiempo de limpieza, usa --pcap-export junto con el archivo lateral JSONL y el opcional scripts/pcap_enrich.py. Consulta Exportación PCAP y Comparación con herramientas similares para más detalles.
Construido sobre ratatui, libpcap, eBPF (libbpf-rs), DashMap, crossbeam, ring, MaxMind GeoLite2 y Landlock. Consulta ARCHITECTURE.md para el desglose completo de dependencias.
Identificación de procesos mejorada con eBPF (predeterminado en Linux)
RustNet usa programas eBPF del kernel por defecto en Linux para un rendimiento mejorado e identificación de procesos con menor sobrecarga.
Nombres de procesos:
- eBPF registra el TGID del líder del grupo de procesos y el nombre
comm(un campo del kernel limitado a 16 caracteres) en lugar del nombre del hilo en ejecución, por lo que las aplicaciones multihilo muestran el nombre del proceso principal en lugar de nombres de hilos como "Socket Thread" - RustNet luego vuelve a resolver el nombre actual mediante
/proc/<tgid>/comm, recupera nombres truncados por comm desde el nombre del archivo ejecutable (por ejemplo, "chromium-browse" se convierte en "chromium-browser") y resuelve la ruta completa del ejecutable mostrada en la vista de Detalles - Los procesos de corta duración que terminan antes de que se ejecute este enriquecimiento conservan el nombre de 16 caracteres registrado por eBPF
Comportamiento de respaldo:
- Cuando eBPF falla al cargar o carece de permisos suficientes, RustNet automáticamente recurre a la identificación de procesos estándar basada en procfs
- El modo estándar resuelve nombres de la misma manera mediante escaneo de procfs, pero con mayor sobrecarga de CPU
- eBPF está habilitado por defecto; no se necesitan banderas de compilación especiales
Para deshabilitar eBPF y usar solo el modo procfs, compila con:
cargo build --release --no-default-features
Consulta ARCHITECTURE.md para información técnica.
Monitoreo de actividad de procesos e interfaces
RustNet combina la contabilidad de tráfico a nivel de proceso con estadísticas de interfaz de red en tiempo real:
- Pestaña Resumen: Muestra interfaces activas con tasas actuales, errores y descartes
- Pestaña Actividad (presiona
3): Clasifica procesos por Egreso (TX) o Ingreso (RX), incluyendo tráfico retenido y continuo, tasas, participaciones, conexiones y destinos - Flujo de trabajo de seguridad: Ordena por Egreso, identifica un cargador inesperado y luego inspecciona su par remoto principal y el tráfico retenido incluso después de que la conexión se cierre
- Detalles de interfaz (presiona
ien Actividad): Muestra las métricas integrales originales para cada interfaz - Multiplataforma: Linux (sysfs), macOS/FreeBSD (getifaddrs), Windows (API GetIfTable2)
- Filtrado inteligente: Windows excluye automáticamente adaptadores virtuales/filtro
Consulta USAGE.md para documentación detallada sobre la interpretación de estadísticas de interfaz y el comportamiento específico de cada plataforma.
Métricas disponibles:
- Bytes y paquetes totales (RX/TX)
- Contadores de errores (recepción y transmisión)
- Descartes de paquetes (desbordamientos de cola)
- Colisiones (heredado, raramente usado en redes modernas)
Las estadísticas se recopilan cada 2 segundos en un hilo en segundo plano con impacto mínimo en el rendimiento.
Capturas de pantalla
| Resumen Tabla de conexiones con estadísticas en vivo y sparklines ![]() | Detalles SNI por conexión, cifrado, GeoIP, DPI ![]() |
| Gráfico Gráfico de tráfico, distribución de aplicaciones, procesos principales ![]() | Actividad Egreso/ingreso de procesos, cobertura de 60 segundos, atribución y pares remotos ![]() |
Inicio rápido
Instalación
Homebrew (macOS / Linux):
brew install rustnet
Ubuntu (22.04 LTS+) / Linux Mint 21+ / Pop!_OS 22.04+:
sudo add-apt-repository ppa:domcyrus/rustnet
# en Pop!_OS: sudo apt-manage add ppa:domcyrus/rustnet
sudo apt update && sudo apt install rustnet
Fedora (42+):
sudo dnf copr enable domcyrus/rustnet
sudo dnf install rustnet
openSUSE Tumbleweed:
sudo zypper addrepo https://download.opensuse.org/repositories/home:/domcyrus:/rustnet/openSUSE_Tumbleweed/home:domcyrus:rustnet.repo
sudo zypper refresh
sudo zypper install rustnet
Arch Linux:
sudo pacman -S rustnet
Nix / NixOS:
nix-shell -p rustnet
# Luego dentro del shell: sudo rustnet
Desde crates.io:
cargo install rustnet-monitor
Windows (Chocolatey):
# Ejecutar en PowerShell como Administrador
# Requiere Npcap (https://npcap.com) instalado con "Modo compatible con API WinPcap" habilitado
choco install rustnet
Otras plataformas:
- FreeBSD: Descarga desde lanzamientos de rustnet-bsd
- Docker, compilaciones desde fuente, otras distribuciones de Linux: Consulta INSTALL.md para instrucciones detalladas
Ejecutar RustNet
La captura de paquetes requiere privilegios elevados:
# Inicio rápido (todas las plataformas)
sudo rustnet
# Linux: Otorga capacidades para ejecutar sin sudo (recomendado)
sudo setcap 'cap_net_raw,cap_bpf,cap_perfmon+eip' $(which rustnet)
rustnet
Opciones comunes:
rustnet -i eth0 # Especificar interfaz de red
rustnet --show-localhost # Mostrar conexiones de localhost
rustnet --no-resolve-dns # Deshabilitar resoluciones DNS inversas (habilitadas por defecto)
rustnet -r 500 # Establecer intervalo de actualización (ms)
rustnet --theme tokyo-night # Tema: muted (predeterminado), vivid, catppuccin-mocha, tokyo-night, gruvbox, nord
rustnet --pcapng-export capture.pcapng # PCAPNG anotado para Wireshark
El tema y las anulaciones por color también se pueden configurar en ~/.config/rustnet/config.toml; --theme tiene prioridad. Consulta USAGE.md para el esquema.
Consulta INSTALL.md para la configuración detallada de permisos y USAGE.md para todas las opciones.
Si configuras las capacidades pero la TUI aún muestra
eBPF unavailable, consulta eBPF no disponible a pesar de que las capacidades estén configuradas en la sección de solución de problemas.
Controles de teclado
| Tecla | Acción |
|---|---|
q | Salir (presiona dos veces para confirmar) |
Ctrl+C | Salir inmediatamente |
x | Borrar todas las conexiones (presiona dos veces para confirmar) |
Tab o ] | Siguiente pestaña |
Shift+Tab o [ | Pestaña anterior |
1–5 | Ir a Resumen / Detalles / Actividad / Gráfico / Ayuda |
↑/k ↓/j | Navegar arriba/abajo |
g G | Ir a la primera/última conexión |
Enter | Ver detalles de la conexión |
Esc | Volver atrás o borrar filtro |
c | Copiar dirección remota |
p | Alternar nombres de servicios/puertos |
d | Alternar nombres de host/IPs en Resumen o Egreso/Ingreso en Actividad |
s S | Ciclar columnas de ordenación / alternar dirección |
a | Alternar agrupación por proceso |
Espacio | Expandir/contraer grupo de procesos |
←/→ o h/l | Contraer/expandir grupo |
PageUp/PageDown o Ctrl+B/F | Navegación de páginas |
t | Alternar conexiones históricas (cerradas) |
i | Alternar información del sistema en Resumen o detalles de interfaz en Actividad |
r | Restablecer vista (agrupación, ordenación, filtro) |
/ | Entrar en modo filtro |
h | Alternar ayuda |
Consulta USAGE.md para controles de teclado detallados y consejos de navegación.
Filtrado y ordenación
Ejemplos rápidos de filtrado:
/google # Buscar "google" en cualquier lugar
/port:443 # Filtrar por puerto
/process:firefox # Filtrar por proceso
/state:established # Filtrar por estado de conexión
/dport:443 sni:github.com # Combinar filtros
Ordenación:
- Presiona
spara ciclar entre columnas ordenables (Proceso, Direcciones, Servicio, Aplicación, Estado, Ancho de banda) - Presiona
S(Shift+s) para alternar la dirección de ordenación - Encuentra consumidores de ancho de banda: Presiona
shasta que aparezca "Ancho de banda Total ↓" (ordena por velocidad combinada de subida+bajada)
Consulta USAGE.md para la sintaxis completa de filtrado y la guía de ordenación.
Ejemplos avanzados de filtrado
Filtros por palabra clave:
port:44- Puertos que contienen "44" (443, 8080, 4433)sport:80- Puertos de origen que contienen "80"dport:443- Puertos de destino que contienen "443"src:192.168- IPs de origen que contienen "192.168"dst:github.com- Destinos que contienen "github.com"process:ssh- Nombres de proceso que contienen "ssh"sni:api- Nombres de host SNI que contienen "api"app:openssh- Conexiones SSH que usan OpenSSHstate:established- Filtrar por estado de protocoloproto:tcp- Filtrar por tipo de protocolo
Filtrado por estado:
state:syn_recv- Conexiones semiabiertas (detección de inundación SYN)state:established- Solo conexiones establecidasstate:quic_connected- Conexiones QUIC activasstate:dns_query- Conexiones de consulta DNS
Ejemplos combinados:
sport:80 process:nginx- Conexiones Nginx desde el puerto 80dport:443 sni:google.com- HTTPS hacia Googleprocess:firefox state:quic_connected- Conexiones QUIC de Firefoxdport:22 app:openssh state:established- Conexiones OpenSSH establecidas
Ciclo de vida de conexiones e indicadores visuales
RustNet usa tiempos de espera inteligentes y advertencias visuales antes de eliminar conexiones:
Indicadores visuales de obsolescencia:
- Blanco: Activo (< 75% del tiempo de espera)
- Amarillo: Obsoleto (75-90% del tiempo de espera)
- Rojo: Crítico (> 90% del tiempo de espera)
Tiempos de espera conscientes del protocolo:
- HTTP/HTTPS: 10 minutos (soporta keep-alive)
- SSH: 30 minutos (sesiones largas)
- TCP genérico establecido: 5 minutos
- QUIC conectado: 3 minutos (o el tiempo de espera de inactividad del parámetro de transporte del par, cuando esté presente);
Initial/Handshaking: 60 segundos - DNS: 30 segundos
- TCP CLOSED: Gracia de archivo de 15 segundos
Ejemplo: Una conexión HTTP se vuelve amarilla a los 7.5 min, roja a los 9 min y se elimina a los 10 min.
Consulta USAGE.md para detalles completos de los tiempos de espera.
Documentación
- INSTALL.md - Instrucciones detalladas de instalación para todas las plataformas, configuración de permisos y solución de problemas
- USAGE.md - Guía de uso completa que incluye opciones de línea de comandos, filtrado, ordenación y registro
- SECURITY.md - Características de seguridad que incluyen aislamiento Landlock y gestión de privilegios
- ARCHITECTURE.md - Arquitectura técnica, implementaciones por plataforma y detalles de rendimiento
- CONTRIBUTING.md - Flujo de trabajo de contribución, requisitos de calidad y pautas del proyecto
- PROFILING.md - Guía de perfilado de rendimiento con configuración de flamegraph y consejos de optimización
- ROADMAP.md - Características planificadas y mejoras futuras
- RELEASE.md - Proceso de lanzamiento para mantenedores
Contribuciones
¡Las contribuciones son bienvenidas! Consulta CONTRIBUTING.md para las pautas sobre cómo contribuir.
Consulta CONTRIBUTORS.md para la lista de personas que han contribuido a este proyecto.
Licencia
Este proyecto está licenciado bajo la Licencia Apache, Versión 2.0 - consulta el archivo LICENSE para más detalles.
Agradecimientos
- Construido con ratatui para la interfaz de terminal
- Captura de paquetes impulsada por libpcap
- Inspirado por herramientas como
tshark/wireshark/tcpdump,sniffnet,netstat,ss,iftopy bandwhich - Parte del código está generado por vibración (OMG) / que los dioses de la LLM estén contigo
Documentación trasladada
Algunas secciones se han movido a archivos dedicados para una mejor organización:
- Configuración de permisos: Ahora en INSTALL.md - Configuración de permisos
- Instrucciones de instalación: Ahora en INSTALL.md
- Uso detallado: Ahora en USAGE.md
- Detalles de arquitectura: Ahora en ARCHITECTURE.md



