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) |
Todas las operaciones privilegiadas del servidor: caída predeterminada de entrada, SSH y preservación del bastión de administración, FIM (más de 150 hashes binarios críticos), escucha de socket Falco eBPF UNIX con congelación autónoma SIGSTOP, envío de alertas. |
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-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
sudo systemctl reload roamswitch-server.service # Recargar archivo de configuración
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 del estado de seguridad (24 comprobaciones del cliente, 30 comprobaciones con --server), puntuación de 0 a 100, calificación y recomendaciones por elemento |
server [config|setup|test-notify|restart|ebpf] |
Usuario/raíz | Gestión de configuración de Server Edition, asistente de configuración interactivo y notificaciones de prueba. ebpf (alias incidents) muestra el estado de aislamiento actual del eBPF Runtime Guard y el historial de incidentes detectados |
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) |
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 | Activar o levantar el aislamiento Air-Gap de emergencia (enable elimina todo el tráfico externo) |
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). 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 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 |
notifications (alias notification-history) |
Usuario | Historial de las notificaciones enviadas por RoamSwitch (anomalías de auditoría de registros, detecciones de ClickFix, etc.) — últimos 7 días, las más recientes primero |
frozen [list|resume <PID>|resume all] |
Usuario / root | Lista los procesos que los guardias (detección de ráfaga de ransomware, manipulación de archivo canario, detección de exploit del kernel) mantienen en SIGSTOP, y libera (SIGCONT) uno que resultó un falso positivo. Congelar no es matar: el proceso liberado se reanuda justo donde se detuvo. resume all los libera todos. Liberar un proceso 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 | Unifica las detecciones del guardián de enlaces (suplantación ARP), el canary antiransomware, el guardián de ejecución eBPF y el guardián de recursos en una única línea temporal, con ascendencia de procesos y etiquetas MITRE ATT&CK (experimental) |
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|unpair|request-audit|results] |
Usuario/root | Confianza mutua mediante código de emparejamiento con RoamSwitch Sensor, un sensor de red de un repositorio independiente que se instala en hardware genérico. pair --addr <ip> --code <code> canjea un código emitido por Sensor para emparejarse (se asume que Sensor se ejecuta con una IP fija), key muestra la clave pública/dirección propias de este endpoint, unpair elimina el emparejamiento, y request-audit pide a Sensor que ejecute una auditoría activa de vulnerabilidades (obtenga el resultado con results). Requiere sensor_pairing_enabled: true (desactivado por defecto). Consulte el Manual de Operaciones de 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» |
Ejemplos
sudo roamswitch status # Diagnóstico integral del cliente (24 elementos)
sudo roamswitch status --server # Diagnóstico integral de Server Edition (30 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 # Confirmar el temporizador de seguridad (detener la recuperación automática)
roamswitch canary # Historial de incidentes del canario
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 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 # 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
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.
- La ayuda específica del subcomando se admite a través de
roamswitch <command> --help. - El estado legible por máquina debe consultarse a través de MCP (§6) o
/run/roamswitch/state.json(§5). - En Client Edition, no existe ningún comando directo para forzar un perfil de firewall; el demonio gestiona esto de forma autónoma basándose en la confianza de la red. Para forzar un nivel, configure
manual_overrideenconfig.jsono llame directamente al IPCset_security_level(§5). statusdevuelve el código de salida 0 independientemente de la puntuación. Para monitoreo automatizado, analice la línea de puntuación (ver §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) |
entropy_freeze_enabled | booleano/true | Congelación rápida de ransomware (SIGSTOP) |
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 | booleano/false | Deshabilite la radio Bluetooth en redes que no sean de confianza |
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) |
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)
Server Edition utiliza un archivo de configuración en formato INI con permisos estrictos (0600, solo raíz). Consulte Manual de operaciones de Server Edition
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 | Socket de integración Falco/Tetragon eBPF (raíz: raíz, modo 0660; Falco se ejecuta como root de forma predeterminada, lo que permite escrituras directas de socket sin configuración) |
/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_baseline.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 |
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 / get_exposed_ports / get_guard_status / audit_url_safety / audit_secrets / audit_security_logs / 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_canary_status / get_notification_history / get_incident_timeline / run_active_vuln_scan / run_package_cve_scan / run_package_cve_scan_languages).
No utiliza comunicación de red externa, se conecta localmente al socket del demonio o llama a roamswitch-core. 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 |