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) 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.

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
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.

Advertencias y limitaciones
  • 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_override en config.json o llame directamente al IPC set_security_level (§5).
  • status devuelve 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
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)
entropy_freeze_enabledbooleano/trueCongelación rápida de ransomware (SIGSTOP)
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_enabledbooleano/falseDeshabilite la radio Bluetooth en redes que no sean de confianza
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)
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)

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.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.sockServidorSocket 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.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_baseline.dbServidorBase de datos de hash de referencia FIM SHA-256
~/.local/share/roamswitch/quarantine/ambosBó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

9. Referencias