ROAMSWITCH PARA LINUX · REFERENCIA DE OPERACIONES

CLI/Guía de operaciones sin cabeza

Cómo operar RoamSwitch para Linux sin una GUI: en instancias de VPS en la nube, a través de SSH, desde cron, scripts de monitoreo y agentes de IA programáticos (MCP).

Elegir la edición
  • Client Edition (roamswitch): Diseñado para computadoras portátiles, estaciones de trabajo móviles y dispositivos de desarrollador. Cambia de forma autónoma los perfiles de firewall de nftables según el nivel de confianza de la red conectada. Esta guía se centra principalmente en la gestión sin cabeza/CLI de Client Edition.
  • Server Edition (roamswitch-server): Diseñado para instancias de VPS en la nube (AWS, GCP, DigitalOcean, Linode, etc.) y servidores locales expuestos directamente a Internet. Incluye filtrado de caída predeterminada entrante, prevención de bloqueo SSH, monitoreo de integridad de archivos de ruta crítica (FIM), integración de tiempo de ejecución eBPF/Falco y notificaciones instantáneas (Telegram/LINE/Webhooks). Para obtener instrucciones completas de instalación y administración, consulte el RoamSwitch Server Edition Operations Manual y el Server Security Whitepaper.
  • .

1. Componentes

Componente Funciona como Rol
roamswitch-daemon (Cliente) raíz (sistemad Type=notify) Todas las operaciones privilegiadas del cliente: control de nftables, detección de red, monitoreo de ransomware/malware, fanotify, fijación de ARP/NDP, aplicación de DNS. No abre ningún socket de escucha TCP/UDP.
roamswitch-server-daemon (Servidor) raíz (sistemad Type=notify) Todo el trabajo privilegiado del lado del servidor: descarte predeterminado del tráfico entrante, protección de excepciones de SSH / IP de administración, FIM (detección de manipulación de más de 150 archivos críticos y conjuntos de archivos de directorios), recepción de eventos eBPF de Falco en un socket UNIX y congelación de procesos (SIGSTOP), el grabador de ejecuciones, el reenvío de eventos (opt-in) y el envío de notificaciones
roamswitch (CLI) usuario de inicio de sesión (algunas acciones requieren sudo) Estado del demonio de lectura del cliente ligero. Utiliza /run/roamswitch/roamswitch.sock IPC en Client Edition o proporciona los subcomandos --server, server, fim y emergency-restore en Server Edition.
roamswitch-mcp generado por clientes de IA Servidor MCP de solo lectura (stdio/JSON-RPC) para la recuperación programática del estado por parte de agentes de IA. Ver configuración de MCP
roamswitch-ransomware-rollback root (watch se ejecuta como la unidad systemd roamswitch-ransomware-rollback-watch.service) Herramienta de recuperación de ransomware. Toma instantáneas de subvolúmenes btrfs y volúmenes lógicos LVM y extrae solo los archivos necesarios. Incluida en el paquete cliente; también disponible en la pestaña «Incident Response» de la interfaz
roamswitch-app iniciar sesión usuario GUI GTK (solo edición cliente). No es necesario en entornos sin cabeza.

Se ejecuta una implementación sin cabeza en el demonio + roamswitch CLI (más roamswitch-mcp si se desea). Todos los mecanismos de defensa autónomos funcionan sin ninguna GUI.

Paquetes mutuamente exclusivos
Client Edition (roamswitch) y Server Edition (roamswitch-server) son paquetes mutuamente excluyentes (Conflicts). Implemente roamswitch-server en entornos de servidor.

2. Daemon (servicios systemd)

Edición de cliente

sudo systemctl status  roamswitch.service      # Estado de funcionamiento
sudo systemctl enable  roamswitch.service      # Inicio automático al arrancar (habilitado en la instalación)
sudo systemctl restart roamswitch.service      # Reiniciar
journalctl -u roamswitch.service -f            # Seguir registros
journalctl -u roamswitch.service --since "1h ago"

Lo que hace el demonio cliente de forma autónoma al inicio y en cada ciclo (3 s):

  • Identifica la MAC de la puerta de enlace conectada y aplica perfiles de nftables (open / balanced / lockdown) contra trusted_networks
  • Detección de ransomware por comportamiento (fanotify + entropía de Shannon + canarios)
  • Escaneo de malware en acceso (fanotify, opcionalmente ClamAV)
  • Monitoreo de suplantación de ARP y fijación preventiva de ARP/NDP de puerta de enlace en redes no confiables
  • Endurecimiento del kernel (sysctl / Yama / core dumps / /tmp noexec) por perfil
  • Aplicación de DNS de protección contra amenazas (dns_enabled + dns_scope)
  • Guardia de enlace (NFQUEUE) para interceptación de phishing
  • Salida del estado de tiempo de ejecución a /run/roamswitch/state.json

Edición de servidor

sudo systemctl status  roamswitch-server.service      # Estado de funcionamiento
sudo systemctl restart roamswitch-server.service      # Reiniciar
journalctl -u roamswitch-server.service -f            # Seguir registros

3. Referencia de comandos CLI

Sintaxis básica: roamswitch <command> [options]. La ejecución sin argumentos tiene como valor predeterminado status. El idioma de salida sigue automáticamente la configuración regional del sistema operativo (LC_ALL / LC_MESSAGES / LANG).

Comando Permisos Descripción
status [--server] (alias report / server-status) Usuario Evaluación de salud de seguridad (27 elementos normalmente, la evaluación de servidor de 34 elementos con --server), puntuación (0–100), nota y recomendaciones. --json imprime el mismo informe como JSON legible por máquina en la salida estándar
server [status|config|setup|tui|test-notify|restart|ack|ebpf|bans|unban|allowlist] Usuario/raíz Administración de Server Edition. config muestra y cambia la configuración, setup es el asistente interactivo, tui inicia la TUI de cobertura completa (roamswitch-server-tui; todas las acciones como root, solo lectura para usuarios normales), test-notify envía una notificación de prueba y restart reinicia el servicio (no se admite recargar la configuración). ack reconoce el aislamiento de emergencia actual (mantiene estricto un aislamiento FULL y libera uno en DEGRADED; véase la política de aislamiento en §3). ebpf (alias incidents) muestra el estado de contención actual de la protección de ejecución eBPF y el historial de incidentes detectados. allowlist [list|add <rule> <process> [--exe <absolute-path>]|remove] administra la lista de permitidos permanente de falsos positivos; vincular una entrada al ejecutable con --exe impide que un proceso renombrado la use. bans [--json] muestra la guardia contra fuerza bruta SSH y los orígenes bloqueados (la lista solo la puede leer root), y unban <IP|/64 IPv6|--all> levanta un bloqueo (root)
fim [verify|update] Usuario/raíz Verificación de monitoreo de integridad de archivos de ruta crítica (verify) y actualización de base de datos hash de referencia (update)
bans [--json] Usuario/raíz Muestra el estado de la guardia contra fuerza bruta SSH (bloquea / solo detecta / detenida, y por qué), los orígenes bloqueados en este momento con el tiempo restante y los registros recientes. La lista de bloqueos solo la puede leer root, así que añada sudo. Admite --json. Igual que server bans de la Server Edition
unban <IP | IPv6 /64 | --all> raíz Levanta un bloqueo de la guardia contra fuerza bruta SSH y borra también el recuento de fallos de ese origen. --all los levanta todos. Igual que server unban de la Server Edition
emergency-restore raíz Elimine todos los aislamientos de emergencia de eBPF/firewall y restaure la línea base de la red
ports [-a|--all] Usuario Puertos de escucha en 0.0.0.0, bases de datos no autenticadas y servidores de desarrollo. -a incluye puertos solo de bucle invertido
guards Usuario Estado de las protecciones de defensa automáticas (anomalía de puerto, ARP, almacenamiento USB, descarga, amenaza de DNS, canario, aislador de servidor de desarrollo, Bluetooth)
wifi Usuario Nivel de cifrado de Wi-Fi (abierto/WEP/WPA/cableado) y SSID
sharing [status|on|off] Usuario Detención/restauración automática de SSH/Samba/RDP en redes que no son de confianza (on desconecta el SSH activo cuando no es de confianza)
audit-url <URL> Usuario Inspeccione el riesgo de amenazas y phishing de URL a través del feed local + heurística (nunca recupera el objetivo)
audit-secrets <text|path|directory> Usuario Detecta claves API, claves privadas y tokens en texto, un archivo o un directorio (recursivo; omite .git/node_modules, etc.) — nunca transmite datos
audit-logs [hours] Usuario Agrega y clasifica los registros de journald/autenticación del sistema de las últimas N horas (predeterminado 24). Las claves API y los tokens se enmascaran automáticamente. También muestra los resultados de detección de anomalías de patrones de registro (patrones nuevos y picos de frecuencia estadísticos).
canary Usuario Estado e integridad del archivo señuelo canario de ransomware, y historial de incidentes detectados (hasta los 50 más recientes)
port-anomaly (alias port-guard) General Estado de referencia del Port Anomaly Guard, puertos actualmente auto-aislados, e historial de incidentes detectados (hasta los 50 más recientes)
quarantine [list] Usuario Contenido de la bóveda de cuarentena de malware (muestra, ruta original, nombre de la amenaza, fecha)
knowledge [query] (alias faq) Usuario Buscar en la base de conocimientos sin conexión
airgap [enable|disable] Usuario/raíz Activa o levanta el aislamiento Air-Gap de emergencia (solo Client Edition). enable descarta todo el tráfico externo (las conexiones que ya estaban abiertas también se cortan) y disable lo restaura. Consulte «Política de aislamiento (Air-Gap)» más abajo para saber cómo funciona la liberación automática
help (--help / -h) Usuario Mostrar ayuda (roamswitch <command> --help para ayuda del subcomando)
scan-packages [CARPETA...] General Compara los paquetes del SO instalados (detecta automáticamente dpkg/pacman/dnf/zypper) con la correspondencia de CVE conocida local. Si se pasan carpetas como argumento, también comprueba los archivos de bloqueo de dependencias de ese proyecto (npm/PyPI/crates.io y 4 ecosistemas más). En Ubuntu (20.04, 22.04, 24.04, 26.04) usa los datos propios de Ubuntu y solo comprueba las CVE con CVSS 7,0 o superior para las que Ubuntu ya ha publicado una corrección («sin coincidencias» no significa que no haya CVE conocidas). Las derivadas de Ubuntu y las versiones no compatibles se indican como no cubiertas y no se pasa a los datos de Debian. Sin ninguna actividad de red
scan-vulns [--confirm] General Solo se ejecuta si active_vuln_scan_enabled: true (desactivado por defecto): comprobaciones de accesibilidad no autenticada limitadas a 127.0.0.1 para Redis/Memcached/MongoDB/dockerd, detección de configuración CORS incorrecta/path traversal/redirección abierta/SSRF en servidores de desarrollo detectados, diagnóstico de relay SMTP abierto, y diagnósticos de exposición basados en pruebas para Telnet/FTP/SSH. Sin --confirm es un simulacro
vuln-status General Muestra, para cada prueba registrada por scan-vulns --confirm, el último resultado registrado y los días transcurridos (pass_age). El resultado es uno de tres estados: vulnerable / seguro / no concluyente, y el tiempo transcurrido se muestra como «hoy», «hace N día(s)» o «desconocido» (nunca ejecutado). Si nunca se ha ejecutado un escaneo, indica que se ejecute primero scan-vulns --confirm y finaliza (todavía no existe una ejecución programada, por lo que el tiempo transcurrido solo refleja la frecuencia real de ejecuciones manuales). Los mismos datos también están disponibles a través de la GUI (pestaña ports) y la herramienta MCP get_vulnerability_scan_history
notifications (alias notification-history) Usuario El historial de notificaciones que RoamSwitch ha enviado (anomalías de auditoría de registros, detecciones de ClickFix, etc.) durante la última semana, de la más reciente a la más antigua. --json imprime un array JSON y --export <FILE> escribe JSON Lines
frozen [list|resume <PID>|resume all] Usuario / root Lista los procesos que las protecciones (detección de cifrado rápido de ransomware, manipulación de canarios, detección de exploits del kernel y la contención selectiva de la protección eBPF) mantienen en SIGSTOP, y libera (SIGCONT) uno que fue un falso positivo. Congelar no es matar, así que un proceso liberado se reanuda justo donde se detuvo. resume all libera todos. Liberar un proceso propiedad de root requiere sudo
resource-guard (alias leak-guard) Usuario Historial de incidentes del guardián de agotamiento de recursos y anomalías de procesos (solo Server Edition): crecimiento sostenido del RSS (fuga de memoria / DoS) o bucles de fallo en servicios expuestos, con un nivel de confianza
timeline (alias incident-timeline) Usuario Combina las detecciones de la protección de enlaces (suplantación ARP), el canario antiransomware, la protección de ejecución eBPF y la protección de recursos en una sola línea de tiempo, con el linaje de procesos y etiquetas de MITRE ATT&CK (experimental). --json imprime todos los registros como un array JSON en la salida estándar, y --export <FILE> escribe JSON Lines (un registro por línea) en un archivo
xdp-gate [status|enable|disable] Usuario / root Muestra o alterna la compuerta XDP de arranque (experimental). status indica si roamswitch-xdp-gate.service está habilitado y el estado actual del programa. Desactivado por defecto
sensor [key|list|pair|repin|unpair|request-audit|results] Usuario/root Confianza mutua, mediante códigos de emparejamiento, con el sensor de red «RoamSwitch Sensor» instalado en una máquina de propósito general (un producto aparte). pair --addr <IP> --code <code> --fingerprint <SHA-256> empareja usando el código que emitió el Sensor (se supone que el Sensor funciona con una IP fija; la huella digital es el valor que se muestra en la pantalla del Sensor o con roamswitch-sensor pairing show, y fija el certificado usado para TLS 1.3: nunca se obtiene de la red y no hay retroceso a texto plano). repin introduce la nueva huella digital después de que el Sensor regenere su certificado, key muestra la clave pública y la dirección de este endpoint, unpair elimina el emparejamiento y request-audit solicita al Sensor una auditoría activa de vulnerabilidades (obtenga el resultado con results). Requiere sensor_pairing_enabled: true (desactivado de forma predeterminada). Consulte el Manual de operaciones del Sensor para más detalles
port-scan (alias portscan) Usuario Muestra el historial de detección de la protección de detección de escaneo de puertos entrantes (IP de origen, si se bloqueó automáticamente y duración del bloqueo). Una función distinta de port-anomaly, que detecta puertos desconocidos recién «expuestos»
lockfile-fim [verify|update] [--quiet|-q] raíz Verifica (verify) o restablece (update) la línea base de monitorización de manipulación de los archivos de bloqueo de dependencias. Requiere root. Los objetivos son las carpetas de proyecto vigiladas (lockfile_watch_dirs en la edición de servidor)
scan-scripts <FOLDER...> Usuario Lista de forma estática los scripts preinstall / install / postinstall / prepare declarados por los archivos package.json bajo node_modules en las carpetas de proyecto indicadas (un inventario, no un veredicto; sin actividad de red)
scan-typosquat <FOLDER...> Usuario Compara los nombres de dependencias de package.json con una lista incluida de nombres de paquetes npm populares por distancia de edición 1–2 y marca los probables typosquats (solo como referencia; sin actividad de red)
web-scan [FOLDER...] [--quarantine] [--json] Usuario/raíz Busca webshells de PHP, JavaScript, JSP y ASP, código inyectado, PHP disfrazado de imagen y abuso de .htaccess con las reglas de la capa de aplicaciones web (integradas, feed diario firmado y reglas propias en /etc/roamswitch/rules.d). Sin carpeta, revisa las raíces de documentos de la configuración del servidor web. Por defecto solo comprueba; --quarantine (root) pone en cuarentena. Código de salida: 0 = nada, 2 = critical o high, 1 = no se pudo ejecutar
web-rules [status|list|validate <file.json>|locked|unlock-account <user>|example] Usuario/raíz Muestra el estado de las reglas de la capa de aplicaciones web (versión, versión del feed instalada, carpeta de reglas propias, nivel de cuarentena, respuesta sobre cuentas, hook tras la detección) (status), lista las reglas cargadas (list), valida un archivo de reglas propias (validate), muestra los shells de inicio de sesión desactivados por la respuesta sobre cuentas (locked) y los restaura (unlock-account, root), y da ejemplos de configuración y hook (example)
kernel-modules [--json] [--apply [MODULE...]] [--remove] Usuario/raíz Comprueba, solo leyendo archivos (sin comunicarse), si se pueden cargar los módulos del kernel que fueron vías para Copy Fail, Dirty Frag y act_pedit (algif_aead, esp4, esp6, rxrpc, act_pedit). --apply (root) escribe install … /bin/false en modprobe.d solo para los no usados; --remove lo deshace. No cuenta en la puntuación del diagnóstico
audit-agent-setup [FOLDER...] [--json] Usuario/raíz Comprobación de solo lectura (sin red) de los archivos de instrucciones y los skills dados a agentes de IA (~/.claude, ~/.codex, ~/.cursor, ~/.gemini, ~/.agents, ~/.openclaw, además de CLAUDE.md, AGENTS.md y similares en las carpetas de proyecto registradas para el análisis CVE de paquetes y cualquier FOLDER indicado) y del openclaw.json de OpenClaw. Señala caracteres Unicode invisibles, instrucciones anuladas, descargar y ejecutar, referencias a archivos secretos junto a un envío, código compilado dentro de un skill, autenticación de OpenClaw desactivada o un token corto y más; lo que esté en un comentario HTML se valora más alto. Nunca se imprimen el contenido de los archivos ni los secretos. Una coincidencia significa «una persona debería leer esta línea», no «malicioso». --json imprime JSON
bluetooth-audit [--json] Usuario Comprueba la configuración de BlueZ (/etc/bluetooth/input.conf y main.conf) en busca de ajustes que dejen conectar como teclado a dispositivos no emparejados, y lista los teclados y ratones Bluetooth conectados (solo lectura)
audit-npm-signatures <DIR> [--confirm] Usuario Verifica las firmas y la procedencia de los paquetes instalados con npm audit signatures (el único comando de RoamSwitch que se comunica con npmjs.com; sin --confirm es una simulación; la edición de servidor también necesita npm_audit_signatures_enabled)
install [--pm npm|pnpm] [--yes] Usuario Envuelve npm / pnpm install y confina solo la fase de scripts de ciclo de vida dentro de un sandbox bwrap (la descarga del paquete en sí usa la red con normalidad)
forward status|test|queue (alias event-forward) Usuario/raíz Muestra el estado del reenvío de eventos (status), envía un evento de prueba (test) o lista la cola de reintentos (queue) para syslog RFC 5424 / CEF, JSON Lines y un webhook estructurado firmado con HMAC. Opt-in, desactivado de forma predeterminada, y envía solo a los destinos que usted configure (Manual de operaciones del servidor §16)
events search|tree|export|verify|status (alias exec-events) raíz Busca (search: --since 2h --pid N --exe S --user U --parent P --text S --json), imprime el árbol de procesos de (tree <pid>), exporta (export), verifica la cadena de hashes de (verify; evidente ante manipulaciones, no a prueba de manipulaciones) y muestra el estado de (status) el registro local del grabador de ejecuciones. El registro es accesible solo para root, por lo que normalmente se necesita sudo (Manual de operaciones del servidor §15)

Política de aislamiento (Air-Gap)

Liberar solo con un temporizador fijo permite que un atacante paciente espere, por lo que el desencadenante de un aislamiento se clasifica según su confianza (en ambas ediciones).

  • Baja confianza (un Air-Gap manual, anomalías genéricas, eBPF Error / Warning e inferiores): se restaura por completo tras un temporizador corto (cliente: airgap_low_confidence_secs, 600 s de forma predeterminada; servidor: safety_timer_secs en guard.yaml, 300 s de forma predeterminada; 0 desactiva el temporizador).
  • Alta confianza (manipulación del canario, reescritura masiva al estilo ransomware, suplantación ARP bajo lockdown, eBPF Critical / Emergency / Alert, activación repetida de la misma regla, etc.): nunca se restaura en silencio. Tras el temporizador se vuelve a comprobar la causa (PID congelado, canario, ARP, regla que se reactiva) y el aislamiento se libera con una notificación solo cuando se verifica que la causa ha desaparecido. Si no se puede confirmar, nadie lo ha reconocido y se alcanza el límite (cliente: airgap_hard_cap_secs; servidor: isolation_hard_cap_secs en server.conf; ambos 3600 s de forma predeterminada, 0 = sin límite), pasa al modo DEGRADED.
  • El modo DEGRADED nunca se abre por temporizador (el cliente solo permite loopback; el servidor solo permite las rutas de administración de SSH de mantenimiento e IP de la lista blanca). Solo se libera mediante una nueva comprobación que verifique que la causa ha desaparecido, un reconocimiento explícito (servidor: roamswitch server ack) o una liberación manual (el botón de la interfaz gráfica / roamswitch emergency-restore). En el modo DEGRADED del cliente tampoco se levanta el rfkill del Wi-Fi, a menos que airgap_degraded_lift_rfkill sea true.
  • Se cortan las conexiones establecidas distintas de las rutas de administración (servidor: todo excepto los puertos SSH de mantenimiento y las IP de la lista blanca, por lo que también se corta un canal C2 o una reverse shell que el atacante ya tenga abierta). Un Air-Gap manual es de baja confianza cuando procede del menú / la interfaz gráfica / roamswitch airgap enable sin contexto de advertencia, pero cuando se inicia desde el botón «bloquear ahora» de una advertencia de suplantación ARP hereda la confianza (alta) de esa advertencia, y la MAC de la puerta de enlace se vuelve a comprobar sin enviar tráfico hasta que coincide con la MAC de confianza en comprobaciones consecutivas (arp_recheck_consecutive comprobaciones que abarquen al menos arp_recheck_min_secs segundos). Cada transición se registra en la línea de tiempo de incidentes.

Recuperación de ransomware (instantáneas y restauración de archivos)

Los comandos siguientes pertenecen a roamswitch-ransomware-rollback (no son subcomandos de roamswitch). Su estado se guarda en /var/lib/roamswitch.

Comando Permisos Descripción
roamswitch-ransomware-rollback snapshot [--path PATH] [--label TEXT] root Toma ahora una instantánea del destino (por defecto $HOME). Los destinos son subvolúmenes btrfs y volúmenes lógicos LVM
roamswitch-ransomware-rollback watch [--path PATH] [--periodic-interval-secs N] root Vigilancia permanente. Toma instantáneas automáticamente ante ráfagas de reescritura de archivos y ante eventos Critical registrados por otras protecciones, y toma además instantáneas previas al daño según un calendario (cada 6 horas por defecto; 4 generaciones en btrfs, 2 en LVM; tras una instantánea al detectar, las periódicas se pausan 7 días por defecto)
roamswitch-ransomware-rollback list [--path PATH] [--json] root Lista las instantáneas creadas por esta herramienta (tipo, si aún existe y la instantánea previa al daño recomendada). --json para salida legible por máquina
roamswitch-ransomware-rollback restore-files <ID> <PATH> [--dest DIR] root Copia solo el archivo o directorio indicado de una instantánea a otra ubicación, sin sobrescribir el estado actual (por defecto <destino>/RoamSwitch-Recovered/<ID>/). La primera opción para recuperar
roamswitch-ransomware-rollback mount-for-browsing <ID> / unmount-browse <MOUNT_POINT> root Hace visible el contenido de una instantánea para elegir la ruta que se pasa a restore-files (btrfs: tal cual; LVM: montaje temporal de solo lectura). Al terminar, desmonte con unmount-browse
roamswitch-ransomware-rollback config get|set --periodic-interval-secs N root Intervalo de las instantáneas previas al daño (segundos; 0 las desactiva, si no al menos 300). Se aplica a un watch en ejecución sin reiniciar. No hay ningún ajuste para desactivar las instantáneas al detectar
roamswitch-ransomware-rollback restore <ID> [--yes] [--accept-tampered] root Revierte todo el destino al estado de una instantánea (destructivo). Una instantánea al detectar contiene archivos ya cifrados, por lo que se rechaza sin --accept-tampered. Pruebe primero restore-files

Ejemplos

sudo roamswitch status                 # Diagnóstico integral del cliente (27 elementos)
sudo roamswitch status --server        # Diagnóstico integral de Server Edition (34 elementos)
sudo roamswitch ports -a               # Todos los puertos en escucha
roamswitch guards                      # Estado de las protecciones
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-secrets .                          # Escanear recursivamente el directorio actual
roamswitch audit-logs 72               # Analizar los registros de las últimas 72 horas
sudo roamswitch sharing on             # Detener automáticamente SSH/Samba/RDP en redes no confiables
sudo roamswitch fim verify             # Verificación de integridad de archivos FIM
sudo roamswitch fim update             # Actualizar línea base de FIM
sudo roamswitch emergency-restore      # Levantar por completo el bloqueo de emergencia y restaurar
sudo roamswitch airgap enable          # Bloqueo de emergencia
sudo roamswitch airgap disable         # Levantar
sudo roamswitch server ack             # Reconoce el aislamiento de emergencia (mantiene estricto un aislamiento FULL y libera uno en DEGRADED)
roamswitch canary                      # Historial de incidentes del canario
roamswitch vuln-status                 # Muestra el último resultado del escaneo y los días transcurridos (pass_age)
roamswitch port-anomaly                # Historial de incidentes del Port Anomaly Guard
roamswitch server ebpf                 # Estado de aislamiento e historial de incidentes del guardián eBPF
roamswitch server bans                 # Estado de la guardia contra fuerza bruta SSH y lista de los orígenes bloqueados
sudo roamswitch server unban 203.0.113.9   # Levantar un bloqueo de la guardia SSH (requiere root)
roamswitch notifications               # Historial de notificaciones de los últimos 7 días
roamswitch frozen                      # Listar procesos congelados
sudo roamswitch frozen resume 12345    # Liberar un falso positivo
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2 --fingerprint 3F:45:89:E1:...:36:10  # Se empareja con Sensor mediante un código de emparejamiento
sudo roamswitch sensor key             # Muestra la clave pública/dirección propias de este endpoint
roamswitch port-scan                   # Historial de detección de escaneo de puertos
roamswitch timeline --json             # all incident-timeline records as JSON
roamswitch notifications --export n.jsonl   # JSON Lines
sudo roamswitch events search --since 2h --exe curl
sudo roamswitch forward status
sudo roamswitch server allowlist add "<rule>" mytool --exe /usr/local/bin/mytool
sudo roamswitch sensor repin <PUBLIC_KEY> --fingerprint <NEW_FINGERPRINT>
sudo roamswitch server tui

El daemon de la edición servidor se ejecuta como root, por lo que los comandos que necesitan leer el conjunto de reglas de nftables o identificar al propietario de un proceso (status / status --server / ports -a) devuelven resultados inexactos sin sudo (un falso veredicto de “inactivo”, o información de proceso faltante). Los comandos que modifican la configuración (sharing / fim update / airgap / emergency-restore, etc.) también requieren sudo. El resto de comandos, de solo lectura, funcionan correctamente sin él.

Advertencias y limitaciones
  • Se admite --help por subcomando (por ejemplo roamswitch ports --help).
  • Para una salida legible por máquina use status --json, --json (un array JSON) y --export <FILE> (JSON Lines) en timeline / notifications, events search --json, MCP (§6) o /run/roamswitch/state.json (§5).
  • En la edición cliente no hay ningún comando de la CLI que cambie el perfil directamente (el daemon decide de forma autónoma). Para forzarlo, establezca manual_override en config.json o llame directamente al método IPC set_security_level (§5).
  • status devuelve el código de salida 0 independientemente del resultado. Si lo usa para monitorización, analice la línea de puntuación de la salida (hay un ejemplo en §7).

4. Archivos de configuración

Edición del cliente (~/.config/roamswitch/config.json)

El demonio se ejecuta como root y escanea /home/*/.config/roamswitch/config.json, utilizando el primer archivo válido que encuentra (o /root/.config/roamswitch/config.json en entornos solo root).

clave Tipo / Predeterminado Descripción
languagecadena/localización del sistema operativoIdioma UI y CLI (ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT)
trusted_networks[{name, mac, level}]Redes confiables; mac es la puerta de enlace MAC, level es open / balanced / lockdown
away_protection_levelcadena / lockdownPerfil predeterminado en redes desconocidas
manual_overridecadena / nuloForzar open / balanced / lockdown (nulo para automático)
dns_enabledbooleano/trueAplicación de DNS de protección contra amenazas
dns_providercadena / quad9quad9 / cloudflare / adguard / cleanBrowsing
dns_scopecadena / untrusted_onlyuntrusted_only / always_on
arp_spoof_guard_enabledbooleano/trueMonitoreo de suplantación de ARP
gateway_arp_lock_enabledbooleano/trueBloqueo preventivo ARP/NDP de puerta de enlace en redes no confiables
port_anomaly_guard_enabledbooleano/trueBloquear automáticamente nuevos puertos de escucha
system_wide_fanotify_enabledbooleano/trueProtección contra malware en todo el sistema
pre_exec_blocking_enabledbooleano/trueBloqueo previo a la ejecución (FAN_DENY)
mount_hardening_enabledbooleano/truenoexec en /tmp y /dev/shm (aplicado en perfiles no abiertos)
yama_memory_protect_enabledbooleano/trueRestricciones de la ruta de Yama
usb_storage_guard_enabled / usb_keyboard_guard_enabledbooleano/falseAlmacenamiento USB / Protección de teclado BadUSB (desactivada de forma predeterminada)
usb_zero_trust_enabledbooleano/falseBus USB autorizado_default=0
bluetooth_guard_enabledbool / trueDesactiva la «visibilidad» de Bluetooth en una red no confiable (activado por defecto; la radio sigue encendida y los dispositivos conectados siguen conectados)
sharing_service_control_enabledbooleano/trueDetener/restaurar automáticamente SSH/Samba/RDP
scan_exclusions[string]Rutas absolutas excluidas del escaneo
link_guardobjeto{enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns}
vpn_on_untrusted_enabledbooleano/falseTúnel VPN de inicio automático en redes que no son de confianza
vpn_backendcadena / wireguardwireguard / tailscale
active_vuln_scan_enabledbool / falsePermite la ejecución de scan-vulns (desactivado por defecto). Requiere activación explícita porque envía sondas de accesibilidad limitadas a 127.0.0.1
pkgcve_watched_folders[string]Carpetas de proyecto (rutas absolutas) que comprueba la verificación de dependencias de la GUI. El comando scan-packages de la CLI ignora este ajuste y solo usa las carpetas pasadas como argumentos de línea de comandos
sensor_pairing_enabledbool / falsePermite la confianza mutua mediante código de emparejamiento con RoamSwitch Sensor (desactivado por defecto). Necesario para usar el comando sensor
port_scan_detect_enabledbool / trueProtección de detección de escaneo de puertos entrantes
port_scan_detect_min_distinct_portsint / 15Un origen que se conecta a al menos esta cantidad de puertos distintos dentro de la ventana de detección se considera un escaneo
port_scan_detect_window_secsint / 300Ventana de agregación para la detección de escaneo (segundos)
port_scan_block_enabledbool / trueBloquea automáticamente la IP de origen del escaneo detectado
port_scan_block_duration_secsint / 600Duración del bloqueo automático (segundos)
airgap_low_confidence_secsint / 600Segundos hasta que un Air-Gap de baja confianza se restaura automáticamente (0 = nunca automáticamente). No se aplica a los aislamientos de alta confianza (§3, «Política de aislamiento (Air-Gap)»)
airgap_hard_cap_secsint / 3600Segundos antes de que un aislamiento de alta confianza pase al modo DEGRADED (0 = sin límite). El modo DEGRADED nunca se abre por temporizador
airgap_degraded_lift_rfkillbool / falseSi el modo DEGRADED también levanta el rfkill del Wi-Fi (de forma predeterminada no lo hace)
airgapAutoRfkillbool / trueSi Air-Gap también bloquea la radio Wi-Fi con rfkill (se restaura al liberar)
arp_recheck_consecutiveint / 3Número de comprobaciones consecutivas en las que la MAC de la puerta de enlace debe coincidir con la MAC de confianza para que un aislamiento por suplantación ARP se considere resuelto (1 o más)
arp_recheck_min_secsint / 60El número mínimo de segundos que debe abarcar la coincidencia consecutiva
arp_recheck_active_probebool / trueEn un aislamiento activado por ARP, cuando la puerta de enlace no tiene entrada en la caché de vecinos (y el enlace está activo), envía una solicitud ARP directa para verificar la MAC de la puerta de enlace. Cualquier respuesta con una MAC distinta de la de confianza cuenta como discrepancia. Como máximo una sonda cada 20 segundos
credential_access_watch_enabledbool / trueNotifica cuando un proceso inesperado abre un archivo de credenciales (clave privada en ~/.ssh, ~/.aws/credentials, ~/.config/gcloud, almacén de credenciales de un navegador); solo notificación, activado por defecto. Las herramientas de copia de seguridad y los indexadores están exentos desde el principio; exente otros con credential_access_watch_allow. Los cambios se aplican en unos 30 segundos. Una lectura muy breve, como cat o head, en la que el programa termina antes de que RoamSwitch pueda identificar su ejecutable, puede no notificarse.
ssh_guard_*—Ajustes de la guardia contra fuerza bruta SSH. Las 10 claves y sus valores por defecto son los mismos que en la Server Edition (server.conf): ssh_guard_enabled (true), ssh_guard_block_enabled (true), ssh_guard_max_failures (6), ssh_guard_window_secs (600), ssh_guard_ban_secs (3600), ssh_guard_ban_max_secs (604800), ssh_guard_allow (vacío; una matriz de IP / CIDR o una cadena separada por comas), ssh_guard_log_source (auto), ssh_guard_yield_to_fail2ban (true) y ssh_guard_trust_key_days (30). Trabaja solo mientras sshd esté en marcha. Un valor fuera de rango vuelve al valor por defecto. Los cambios se aplican en aproximadamente un minuto (sin reiniciar). Liste y levante los bloqueos con roamswitch bans y roamswitch unban
fim_intrusion_context_enabledbool / trueAñade a las notificaciones de manipulación de archivos (FIM) y de archivos de bloqueo la cuenta y el ejecutable del proceso que escribió y el inicio de sesión SSH al que pertenece (origen, hora, método de autenticación); en un archivo de credenciales, solo cuando el proceso pertenece a un inicio de sesión SSH. Se aplica tras reiniciar el demonio. No se envía nada al exterior
forward_*—Ajustes de reenvío de eventos (syslog / JSON Lines / webhook firmado). Opt-in, desactivado de forma predeterminada. Las claves son forward_enabled, forward_syslog_url, forward_syslog_format, forward_syslog_framing, forward_tls_ca_file, forward_file_path, forward_file_max_mb, forward_file_keep, forward_webhook_url, forward_webhook_secret, forward_webhook_secret_file, forward_min_severity, forward_queue_max_mb y forward_queue_max_age_hours (los tipos y valores predeterminados están en el Manual de operaciones del servidor §18)
exec_recorder_* / exec_rule*—Ajustes del grabador de ejecuciones local y de las reglas de correlación de solo notificación EXR-001 a EXR-007. Activado de forma predeterminada (desactivado en hosts con menos de 1 GiB de memoria; un ajuste explícito prevalece). Las claves son exec_recorder_enabled, exec_recorder_retention_mb, exec_recorder_retention_days, exec_recorder_hash_chain, exec_recorder_hash_exe, exec_recorder_cpu_budget_pct, exec_rules_enabled, exec_rules_disabled, exec_rule_service_users, exec_rule_window_secs y exec_rules_isolation_optin (predeterminado false; solo cuando es true las reglas de gravedad alta desencadenan aislamiento)
Precaución SSH remoto
Con sharing_service_control_enabled: true, conectarse a una red que no es de confianza desconecta las sesiones SSH activas. Déjelo deshabilitado en servidores sin cabeza.

Edición de servidor (/etc/roamswitch/server.conf)

La edición de servidor usa un archivo de configuración en formato INI protegido con permisos 0600 (solo root). El tipo, los valores permitidos, el valor predeterminado y si requiere reinicio de cada clave figuran en Manual de operaciones del servidor §18. Cambie las claves con roamswitch server config show|get|set o en el editor de configuración de roamswitch server tui (las 146 claves de server.conf y guard.yaml). La edición de servidor no admite recargar su configuración, así que aplique los cambios con sudo roamswitch server restart.

Equipos compartidos: modo solo administrador

En un equipo compartido por varias personas, sudo touch /etc/roamswitch/admin-only activa el modo solo administrador. Los cambios que afectan a todo el equipo (cortafuegos, DNS, VPN, USB, refuerzo del kernel y de los montajes, radios, confianza de Sensor, etc.) quedan limitados a root o a los usuarios del grupo sudo, wheel o roamswitch. Las acciones ligadas a sus propios archivos y procesos (aislamiento, kill, freeze, análisis) funcionan como antes. /etc/roamswitch/admin-only solo cuenta si pertenece a root y los demás no pueden escribirlo (un usuario no puede crearlo para cambiar de modo). Está desactivado por defecto (sin archivo).

5. Registros y archivos de estado de tiempo de ejecución

Camino Objetivo Descripción
journalctl -u roamswitch.serviceClienteRegistros del demonio del cliente (cambios de perfil, detecciones, errores)
journalctl -u roamswitch-server.serviceServidorRegistros del demonio del servidor (eventos FIM, detecciones de Falco, aislamientos)
/run/roamswitch/roamswitch.sockClienteDemonio cliente IPC Socket de dominio Unix
/run/roamswitch/events.sockServidorEl socket de integración eBPF de Falco / Tetragon (root:root, modo 0600; Falco también se ejecuta como root, por lo que no se necesita ninguna configuración de permisos adicional)
/run/roamswitch/state.jsonClienteEstado del ciclo: {active_level, network_trusted, fanotify_ready}
/run/roamswitch/alerts.jsonClienteCola de alertas recientes
/run/roamswitch/approvals.jsonClienteCola de aprobación pendiente
/run/roamswitch/fanotify.readyClienteArchivo de marca que indica que fanotify guard se está ejecutando
/var/lib/roamswitch/fim.dbServidorBase de datos de hash de referencia FIM SHA-256
~/.local/share/roamswitch/quarantine/ambosBóveda de cuarentena (0700, muestras 0400) + .metadata.json
/var/lib/roamswitch/exec_log/ambosLos JSON Lines encadenados por hash del grabador de ejecuciones (solo root, 0600). Busque y verifique con roamswitch events
/run/roamswitch/airgap_isolation.json / host_isolation.jsonambosEl estado de aislamiento (Air-Gap) (FULL / DEGRADED) y el registro del desencadenante; el aislamiento sobrevive a un reinicio del daemon

Llamar a IPC directamente (avanzado)

El demonio acepta JSON delimitado por nueva línea en /run/roamswitch/roamswitch.sock:

# Forzar cambio de perfil (edición cliente)
printf '{"id":1,"method":"set_security_level","params":{"level":"lockdown"}}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

# Reconciliar ahora el bloqueo ARP de la puerta de enlace
printf '{"id":1,"method":"reconcile_gateway_lock","params":null}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

6. Estado programático (MCP)

roamswitch-mcp expone herramientas de solo lectura a través de JSON-RPC en stdio (get_security_report / verify_security_findings / get_exposed_ports / get_guard_status / audit_url_safety / audit_secrets / audit_security_logs / audit_mcp_configs / audit_agent_setup / get_app_help / get_quarantine_status / get_file_scan_guard_status / verify_fim / get_port_anomaly_incidents / get_ebpf_incidents / get_resource_guard_incidents / get_port_scan_incidents / get_ssh_guard_incidents / get_canary_status / get_vulnerability_scan_history / get_notification_history / search_exec_events / get_process_tree / get_incident_timeline / get_fleet_status / get_vpn_status / get_link_guard_status / get_air_gap_status / get_sharing_services_status / get_bluetooth_guard_status / get_usb_guard_status / run_active_vuln_scan / run_package_cve_scan / run_package_cve_scan_languages / run_package_lifecycle_script_scan / run_typosquat_scan / run_npm_audit_signatures / get_sensor_audit_results).

No se conecta a hosts externos y habla localmente con el socket del demonio o llama directamente a roamswitch-core. get_security_report y verify_security_findings tampoco envían nada a la LAN (la puerta de enlace solo se lee de la caché ARP y de otra información local). Consulte Guía de configuración de MCP

7. Recetas de automatización

Comprobación diaria del estado del cron → Correo electrónico si la puntuación cae por debajo del umbral

#!/usr/bin/env bash
# /etc/cron.daily/roamswitch-health
out=$(runuser -u "$SUDO_USER" -- roamswitch status 2>&1)
score=$(printf '%s\n' "$out" | grep -oE '[0-9]+/100' | head -1 | cut -d/ -f1)
if [ -n "$score" ] && [ "$score" -lt 80 ]; then
  printf '%s\n' "$out" | mail -s "RoamSwitch health: ${score}/100" root
fi

Supervisar la cola de alertas (poll alerts.json)

#!/usr/bin/env bash
last=0
while :; do
  ts=$(jq -r 'max_by(.timestamp).timestamp // 0' /run/roamswitch/alerts.json 2>/dev/null || echo 0)
  if [ "$ts" -gt "$last" ]; then
    jq -c ".[] | select(.timestamp > $last)" /run/roamswitch/alerts.json | logger -t roamswitch-alert
    last=$ts
  fi
  sleep 10
done

Verificar fanotificar el estado del guardia (state.json)

jq -e '.fanotify_ready == true' /run/roamswitch/state.json >/dev/null \
  || echo "WARNING: fanotify guard is not running" >&2

8. Solución de problemas

Síntoma Resolución
roamswitch sale con "verifique que roamswitch-mcp esté instalado" El demonio no se está ejecutando → sudo systemctl start roamswitch.service (o roamswitch-server.service). Verificar que el socket exista
roamswitch status muestra fanotificar 🔴 "guardia parada" Agotamiento transitorio fs.fanotify.max_user_groups. Reinicie con sudo systemctl restart roamswitch.service y verifique en el diario.
El perfil permanece en balanced, nunca llega a open Verifique que la MAC de la puerta de enlace esté registrada en trusted_networks con level: open
SSH se desconecta inesperadamente La edición del cliente tiene sharing_service_control_enabled: true en una red que no es de confianza. Desactivar mediante roamswitch sharing off
Los cambios de configuración no surten efecto The client daemon reads the first of /home/*/.config/…; apply with systemctl restart roamswitch.service. For the server edition, edit /etc/roamswitch/server.conf then run sudo roamswitch server restart (no reload).
Las comunicaciones del servidor se bloquearon accidentalmente Acceda a la consola en la nube (VNC/Serial) y ejecute sudo roamswitch emergency-restore

9. Referencias