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).
- 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.
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) contratrusted_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 /
/tmpnoexec) 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_secsenguard.yaml, 300 s de forma predeterminada;0desactiva 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_secsenserver.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 queairgap_degraded_lift_rfkillseatrue. - 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 enablesin 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_consecutivecomprobaciones que abarquen al menosarp_recheck_min_secssegundos). 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.
- Se admite
--helppor subcomando (por ejemploroamswitch ports --help). - Para una salida legible por máquina use
status --json,--json(un array JSON) y--export <FILE>(JSON Lines) entimeline/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_overrideenconfig.jsono llame directamente al método IPCset_security_level(§5). statusdevuelve 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 |
|---|---|---|
language | cadena/localización del sistema operativo | Idioma 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_level | cadena / lockdown | Perfil predeterminado en redes desconocidas |
manual_override | cadena / nulo | Forzar open / balanced / lockdown (nulo para automático) |
dns_enabled | booleano/true | Aplicación de DNS de protección contra amenazas |
dns_provider | cadena / quad9 | quad9 / cloudflare / adguard / cleanBrowsing |
dns_scope | cadena / untrusted_only | untrusted_only / always_on |
arp_spoof_guard_enabled | booleano/true | Monitoreo de suplantación de ARP |
gateway_arp_lock_enabled | booleano/true | Bloqueo preventivo ARP/NDP de puerta de enlace en redes no confiables |
port_anomaly_guard_enabled | booleano/true | Bloquear automáticamente nuevos puertos de escucha |
system_wide_fanotify_enabled | booleano/true | Protección contra malware en todo el sistema |
pre_exec_blocking_enabled | booleano/true | Bloqueo previo a la ejecución (FAN_DENY) |
mount_hardening_enabled | booleano/true | noexec en /tmp y /dev/shm (aplicado en perfiles no abiertos) |
yama_memory_protect_enabled | booleano/true | Restricciones de la ruta de Yama |
usb_storage_guard_enabled / usb_keyboard_guard_enabled | booleano/false | Almacenamiento USB / Protección de teclado BadUSB (desactivada de forma predeterminada) |
usb_zero_trust_enabled | booleano/false | Bus USB autorizado_default=0 |
bluetooth_guard_enabled | bool / true | Desactiva 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_enabled | booleano/true | Detener/restaurar automáticamente SSH/Samba/RDP |
scan_exclusions | [string] | Rutas absolutas excluidas del escaneo |
link_guard | objeto | {enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns} |
vpn_on_untrusted_enabled | booleano/false | Túnel VPN de inicio automático en redes que no son de confianza |
vpn_backend | cadena / wireguard | wireguard / tailscale |
active_vuln_scan_enabled | bool / false | Permite 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_enabled | bool / false | Permite la confianza mutua mediante código de emparejamiento con RoamSwitch Sensor (desactivado por defecto). Necesario para usar el comando sensor |
port_scan_detect_enabled | bool / true | Protección de detección de escaneo de puertos entrantes |
port_scan_detect_min_distinct_ports | int / 15 | Un 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_secs | int / 300 | Ventana de agregación para la detección de escaneo (segundos) |
port_scan_block_enabled | bool / true | Bloquea automáticamente la IP de origen del escaneo detectado |
port_scan_block_duration_secs | int / 600 | Duración del bloqueo automático (segundos) |
airgap_low_confidence_secs | int / 600 | Segundos 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_secs | int / 3600 | Segundos 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_rfkill | bool / false | Si el modo DEGRADED también levanta el rfkill del Wi-Fi (de forma predeterminada no lo hace) |
airgapAutoRfkill | bool / true | Si Air-Gap también bloquea la radio Wi-Fi con rfkill (se restaura al liberar) |
arp_recheck_consecutive | int / 3 | Nú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_secs | int / 60 | El número mínimo de segundos que debe abarcar la coincidencia consecutiva |
arp_recheck_active_probe | bool / true | En 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_enabled | bool / true | Notifica 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_enabled | bool / true | Añ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) |
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.service | Cliente | Registros del demonio del cliente (cambios de perfil, detecciones, errores) |
journalctl -u roamswitch-server.service | Servidor | Registros del demonio del servidor (eventos FIM, detecciones de Falco, aislamientos) |
/run/roamswitch/roamswitch.sock | Cliente | Demonio cliente IPC Socket de dominio Unix |
/run/roamswitch/events.sock | Servidor | El 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.json | Cliente | Estado del ciclo: {active_level, network_trusted, fanotify_ready} |
/run/roamswitch/alerts.json | Cliente | Cola de alertas recientes |
/run/roamswitch/approvals.json | Cliente | Cola de aprobación pendiente |
/run/roamswitch/fanotify.ready | Cliente | Archivo de marca que indica que fanotify guard se está ejecutando |
/var/lib/roamswitch/fim.db | Servidor | Base de datos de hash de referencia FIM SHA-256 |
~/.local/share/roamswitch/quarantine/ | ambos | Bóveda de cuarentena (0700, muestras 0400) + .metadata.json |
/var/lib/roamswitch/exec_log/ | ambos | Los 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.json | ambos | El 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 |