ROAMSWITCH PER LINUX · RIFERIMENTO OPERAZIONI

CLI/Guida alle operazioni senza testa

Come utilizzare RoamSwitch per Linux senza GUI: su istanze VPS cloud, su SSH, da cron, script di monitoraggio e agenti AI programmatici (MCP).

Scelta dell'edizione
  • Client Edition (roamswitch): progettato per laptop, workstation mobili e dispositivi per sviluppatori. Cambia autonomamente i profili firewall di nftables in base al livello di fiducia della rete connessa. Questa guida si concentra principalmente sulla gestione headless/CLI dell'edizione client.
  • Server Edition (roamswitch-server): progettato per istanze VPS cloud (AWS, GCP, DigitalOcean, Linode, ecc.) e server locali esposti direttamente a Internet. Dispone di filtro anti-drop predefinito in entrata, prevenzione del blocco SSH, monitoraggio dell'integrità dei file del percorso critico (FIM), integrazione runtime eBPF/Falco e notifiche istantanee (Telegram/LINE/Webhook). Per istruzioni complete sull'installazione e sulla gestione, consultare il Manuale operativo di RoamSwitch Server Edition e il Server Security Whitepaper.

1. Componenti

Componente Funziona come Ruolo
roamswitch-daemon (Cliente) root (sistemaType=notify) Tutte le operazioni privilegiate del client: controllo nftables, rilevamento della rete, monitoraggio ransomware/malware, fanotify, blocco ARP/NDP, imposizione DNS. Non apre alcun socket di ascolto TCP/UDP.
roamswitch-server-daemon (Server) root (sistemaType=notify) Tutte le operazioni privilegiate del server: drop predefinito in entrata, conservazione SSH e bastioni amministrativi, FIM (oltre 150 hash binari critici), listener socket UNIX Falco eBPF con congelamento autonomo SIGSTOP, invio avvisi.
roamswitch (CLI) utente di accesso (alcune azioni richiedono sudo) Stato del demone di lettura del thin client. Utilizza /run/roamswitch/roamswitch.sock IPC su Client Edition o fornisce i sottocomandi --server, server, fim e emergency-restore su Server Edition.
roamswitch-mcp generato dai client AI Server MCP di sola lettura (stdio/JSON-RPC) per il recupero dello stato programmatico da parte degli agenti AI. Vedi configurazione MCP
roamswitch-app utente di accesso GUI GTK (solo edizione client). Non necessario in ambienti senza testa.

Una distribuzione headless viene eseguita sul demone + roamswitch CLI (più roamswitch-mcp se lo si desidera). Tutti i meccanismi di difesa autonomi funzionano senza alcuna GUI.

Pacchetti reciprocamente esclusivi
Client Edition (roamswitch) e Server Edition (roamswitch-server) sono pacchetti che si escludono a vicenda (Conflicts). Distribuisci roamswitch-server su ambienti server.

2. Demone (servizi di sistema)

Edizione cliente

sudo systemctl status  roamswitch.service      # Stato di funzionamento
sudo systemctl enable  roamswitch.service      # Avvio automatico al boot (abilitato all'installazione)
sudo systemctl restart roamswitch.service      # Riavvia
journalctl -u roamswitch.service -f            # Segui i log
journalctl -u roamswitch.service --since "1h ago"

Cosa fa il demone client in modo autonomo all'avvio e ad ogni ciclo (3 s):

  • Identifica il MAC del gateway connesso e applica i profili nftables (open / balanced / lockdown) rispetto a trusted_networks
  • Rilevamento ransomware comportamentale (fanotify + entropia di Shannon + canarini)
  • Scansione malware in accesso (fanotify, facoltativamente ClamAV)
  • Monitoraggio dello spoofing ARP e blocco preventivo ARP/NDP del gateway su reti non attendibili
  • Rafforzamento del kernel (sysctl / Yama / core dump / /tmp noexec) per profilo
  • Applicazione DNS di protezione dalle minacce (dns_enabled + dns_scope)
  • Link guard (NFQUEUE) per l'intercettazione del phishing
  • Uscita dello stato di runtime su /run/roamswitch/state.json

Edizione server

sudo systemctl status  roamswitch-server.service      # Stato di funzionamento
sudo systemctl restart roamswitch-server.service      # Riavvia
sudo systemctl reload  roamswitch-server.service      # Ricarica il file di configurazione
journalctl -u roamswitch-server.service -f            # Segui i log

3. Riferimento ai comandi CLI

Sintassi di base: roamswitch <command> [options]. L'esecuzione senza argomenti viene eseguita per impostazione predefinita su status. La lingua di output segue automaticamente le impostazioni internazionali del sistema operativo (LC_ALL / LC_MESSAGES / LANG).

Comando Autorizzazioni Descrizione
status [--server] (alias report / server-status) Utente Valutazione dell'integrità della sicurezza (24 controlli sul client, 30 controlli con --server), punteggio da 0 a 100, voto e consigli per elemento
server [config|setup|test-notify|restart|ebpf] Utente/root Gestione della configurazione di Server Edition, procedura guidata di configurazione interattiva e notifiche di test. ebpf (alias incidents) mostra lo stato di isolamento attuale dell'eBPF Runtime Guard e la cronologia degli incidenti rilevati
fim [verify|update] Utente/root Verifica del monitoraggio dell'integrità dei file del percorso critico (verify) e aggiornamento del database hash di base (update)
emergency-restore radice Rimuovere tutti gli isolamenti eBPF/firewall di emergenza e ripristinare la linea di base della rete
ports [-a|--all] Utente Porte in ascolto su 0.0.0.0, DB non autenticati e server di sviluppo. -a include porte di solo loopback
guards Utente Stato delle protezioni di difesa automatiche (anomalia porta, ARP, archiviazione USB, download, minaccia DNS, canary, isolatore dev-server, Bluetooth)
wifi Utente Livello di crittografia Wi-Fi (aperto/WEP/WPA/cablato) e SSID
sharing [status|on|off] Utente Arresto/ripristino automatico di SSH/Samba/RDP su reti non attendibili (on disconnette SSH attivo quando non attendibile)
audit-url <URL> Utente Ispeziona il phishing degli URL e il rischio di minacce tramite feed locale ed euristica (non recupera mai il target)
audit-secrets <text|path|directory> Utente Rileva chiavi API, chiavi private e token in testo, un file o una directory (ricorsivo; esclude .git/node_modules, ecc.) — non trasmette mai dati
audit-logs [hours] Utente Aggrega e classifica i log journald/auth del sistema delle ultime N ore (impostazione predefinita 24). Le chiavi API e i token vengono mascherati automaticamente. Mostra anche i risultati del rilevamento di anomalie nei pattern dei log (nuovi pattern e picchi di frequenza statistici).
canary Utente Stato e integrità del file esca canary ransomware, e cronologia degli incidenti rilevati (fino agli ultimi 50)
port-anomaly (alias port-guard) Generale Stato della baseline del Port Anomaly Guard, porte attualmente auto-isolate, e cronologia degli incidenti rilevati (fino agli ultimi 50)
quarantine [list] Utente Contenuto del deposito di quarantena malware (campione, percorso originale, nome della minaccia, data)
knowledge [query] (alias faq) Utente Cerca nella knowledge base offline
airgap [enable|disable] Utente/root Attiva o solleva l'isolamento Air-Gap di emergenza (enable interrompe tutto il traffico esterno)
help (--help / -h) Utente Mostra aiuto (roamswitch <command> --help per la guida del sottocomando)
scan-packages [CARTELLA...] Generale Confronta i pacchetti del sistema operativo installati (rileva automaticamente dpkg/pacman/dnf/zypper) con la mappa CVE nota locale. Se vengono passate cartelle come argomento, controlla anche i file di lock delle dipendenze di quel progetto (npm/PyPI/crates.io e altri 4 ecosistemi). Nessuna attività di rete
scan-vulns [--confirm] Generale Viene eseguito solo se active_vuln_scan_enabled: true (disattivato per impostazione predefinita): verifiche di raggiungibilità non autenticata limitate a 127.0.0.1 per Redis/Memcached/MongoDB/dockerd, controlli su configurazione CORS errata/path traversal/open redirect sui server di sviluppo rilevati, diagnosi di open relay SMTP e diagnosi di esposizione basate su prove per Telnet/FTP/SSH. Senza --confirm è una simulazione
notifications (alias notification-history) Utente Cronologia delle notifiche inviate da RoamSwitch (anomalie di controllo dei log, rilevamenti ClickFix e altro) — ultimi 7 giorni, le più recenti per prime
frozen [list|resume <PID>|resume all] Utente / root Elenca i processi che le guardie (rilevamento raffica ransomware, manomissione file canary, rilevamento exploit del kernel) tengono in SIGSTOP e rilascia (SIGCONT) un falso positivo. Congelare non è terminare: il processo rilasciato riprende esattamente da dove si era fermato. resume all li rilascia tutti. Rilasciare un processo di root richiede sudo
resource-guard (alias leak-guard) Utente Cronologia degli incidenti della guardia contro l'esaurimento delle risorse e le anomalie di processo (solo Server Edition): crescita persistente dell'RSS (memory leak / DoS) o crash loop nei servizi esposti, con un livello di confidenza
timeline (alias incident-timeline) Utente Unisce i rilevamenti di link guard (ARP spoofing), canary anti-ransomware, guardia runtime eBPF e guardia risorse in un’unica linea temporale, con genealogia dei processi e tag MITRE ATT&CK (sperimentale)
xdp-gate [status|enable|disable] Utente / root Mostra o commuta il gate XDP all’avvio (sperimentale). status indica se roamswitch-xdp-gate.service è abilitato e lo stato attuale del programma. Disattivato per impostazione predefinita
sensor [key|list|pair|unpair|request-audit|results] Utente/root Fiducia reciproca tramite codice di abbinamento con RoamSwitch Sensor, un sensore di rete di un repository separato che si installa su hardware comune. pair --addr <ip> --code <code> riscatta un codice rilasciato da Sensor per abbinarsi (si presume che Sensor sia in esecuzione con un IP fisso), key mostra la chiave pubblica/indirizzo propri di questo endpoint, unpair rimuove l'abbinamento, e request-audit chiede a Sensor di eseguire un controllo attivo delle vulnerabilità (recuperare il risultato con results). Richiede sensor_pairing_enabled: true (disattivato per impostazione predefinita). Per i dettagli vedere il Manuale Operativo di Sensor
port-scan (alias portscan) Utente Mostra la cronologia di rilevamento della protezione di rilevamento delle scansioni delle porte in ingresso (IP di origine, se bloccato automaticamente e durata del blocco). Una funzione diversa da port-anomaly, che rileva porte sconosciute appena «esposte»

Esempi

sudo roamswitch status                 # Diagnostica completa client (24 voci)
sudo roamswitch status --server        # Diagnostica completa Server Edition (30 voci)
sudo roamswitch ports -a               # Tutte le porte in ascolto
roamswitch guards                      # Stato delle guardie
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-secrets .                          # Scansione ricorsiva della directory corrente
roamswitch audit-logs 72               # Analizza i log delle ultime 72 ore
sudo roamswitch sharing on             # Arresto automatico di SSH/Samba/RDP su reti non attendibili
sudo roamswitch fim verify             # Verifica dell'integrità dei file FIM
sudo roamswitch fim update             # Aggiorna la baseline FIM
sudo roamswitch emergency-restore      # Rimuovi completamente il blocco di emergenza e ripristina
sudo roamswitch airgap enable          # Blocco di emergenza
sudo roamswitch airgap disable         # Rimuovi
sudo roamswitch server ack             # Conferma il timer di sicurezza (arresta il ripristino automatico)
roamswitch canary                      # Cronologia degli incidenti del canary
roamswitch port-anomaly                # Cronologia degli incidenti del Port Anomaly Guard
roamswitch server ebpf                 # Stato di isolamento e cronologia degli incidenti della guardia eBPF
roamswitch notifications               # Cronologia delle notifiche degli ultimi 7 giorni
roamswitch frozen                      # Elenca i processi congelati
sudo roamswitch frozen resume 12345    # Rilascia un falso positivo
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2  # Si abbina a Sensor tramite un codice di abbinamento
sudo roamswitch sensor key             # Mostra la chiave pubblica/indirizzo propri di questo endpoint
roamswitch port-scan                   # Cronologia di rilevamento delle scansioni delle porte

Il demone dell'edizione server viene eseguito come root, quindi i comandi che devono leggere il set di regole nftables o identificare il proprietario di un processo (status / status --server / ports -a) restituiscono risultati imprecisi senza sudo (un falso verdetto “inattivo”, o informazioni di processo mancanti). Anche i comandi che modificano la configurazione (sharing / fim update / airgap / emergency-restore, ecc.) richiedono sudo. Tutti gli altri comandi, di sola lettura, funzionano correttamente senza di esso.

Avvertenze e limitazioni
  • La guida specifica per i sottocomandi è supportata tramite roamswitch <command> --help.
  • Lo stato leggibile dalla macchina deve essere interrogato tramite MCP (§6) o /run/roamswitch/state.json (§5).
  • Nella Client Edition non esiste un comando diretto per forzare un profilo firewall; il demone lo gestisce autonomamente in base alla fiducia della rete. Per forzare un livello, configurare manual_override in config.json o chiamare direttamente l'IPC set_security_level (§5).
  • status restituisce il codice di uscita 0 indipendentemente dal punteggio. Per il monitoraggio automatizzato, analizzare la linea del punteggio (vedere §7).

4. File di configurazione

Edizione client (~/.config/roamswitch/config.json)

Il demone viene eseguito come root ed esegue la scansione di /home/*/.config/roamswitch/config.json, utilizzando il primo file valido che trova (o /root/.config/roamswitch/config.json in ambienti solo root).

Chiave Tipo/Predefinito Descrizione
languagestringa/impostazione locale del sistema operativoLingua dell'interfaccia utente e della CLI (ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT)
trusted_networks[{name, mac, level}]Reti affidabili; mac è il MAC del gateway, level è open / balanced / lockdown
away_protection_levelstringa / lockdownProfilo predefinito su reti sconosciute
manual_overridestringa / nulloForza open / balanced / lockdown (null per automatico)
dns_enabledbool / trueApplicazione DNS di protezione dalle minacce
dns_providerstringa / quad9quad9 / cloudflare / adguard / cleanBrowsing
dns_scopestringa / untrusted_onlyuntrusted_only / always_on
arp_spoof_guard_enabledbool / trueMonitoraggio dello spoofing ARP
gateway_arp_lock_enabledbool / trueBlocco preventivo ARP/NDP del gateway su reti non attendibili
port_anomaly_guard_enabledbool / trueBlocca automaticamente le nuove porte di ascolto
system_wide_fanotify_enabledbool / trueFanotify protezione malware a livello di sistema
pre_exec_blocking_enabledbool / trueBlocco pre-esecuzione (FAN_DENY)
entropy_freeze_enabledbool / trueBlocco rapido del ransomware (SIGSTOP)
mount_hardening_enabledbool / truenoexec su /tmp e /dev/shm (applicato su profili non aperti)
yama_memory_protect_enabledbool / trueRestrizioni sulla traccia Yama
usb_storage_guard_enabled / usb_keyboard_guard_enabledbool / falseMemoria USB/protezione tastiera USB difettosa (disattivata per impostazione predefinita)
usb_zero_trust_enabledbool / falseBus USB autorizzato_default=0
bluetooth_guard_enabledbool / falseDisattiva la radio Bluetooth su reti non attendibili
sharing_service_control_enabledbool / trueArresto/ripristino automatico SSH/Samba/RDP
scan_exclusions[string]Percorsi assoluti esclusi dalla scansione
link_guardoggetto{enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns}
vpn_on_untrusted_enabledbool / falseAvvio automatico del tunnel VPN su reti non attendibili
vpn_backendstringa / wireguardwireguard / tailscale
active_vuln_scan_enabledbool / falseConsente l'esecuzione di scan-vulns (disattivato per impostazione predefinita). Richiede un'attivazione esplicita poiché invia sonde di raggiungibilità limitate a 127.0.0.1
pkgcve_watched_folders[string]Cartelle di progetto (percorsi assoluti) controllate dalla verifica delle dipendenze della GUI. Il comando CLI scan-packages ignora questa impostazione e usa solo le cartelle passate come argomenti da riga di comando
sensor_pairing_enabledbool / falseConsente la fiducia reciproca tramite codice di abbinamento con RoamSwitch Sensor (disattivato per impostazione predefinita). Necessario per usare il comando sensor
port_scan_detect_enabledbool / trueProtezione di rilevamento delle scansioni delle porte in ingresso
port_scan_detect_min_distinct_portsint / 15Una sorgente che si connette ad almeno questo numero di porte distinte entro la finestra di rilevamento viene considerata una scansione
port_scan_detect_window_secsint / 300Finestra di aggregazione per il rilevamento delle scansioni (secondi)
port_scan_block_enabledbool / trueBlocca automaticamente l'IP di origine della scansione rilevata
port_scan_block_duration_secsint / 600Durata del blocco automatico (secondi)
Attenzione SSH remoto
Con sharing_service_control_enabled: true, la connessione a una rete non attendibile disconnette le sessioni SSH attive. Lascialo disabilitato sui server headless.

Edizione server (/etc/roamswitch/server.conf)

Server Edition utilizza un file di configurazione in formato INI con autorizzazioni rigide (0600, solo root). Fare riferimento al Manuale operativo Server Edition

5. Registri e file di stato di runtime

Percorso Obiettivo Descrizione
journalctl -u roamswitch.serviceClienteRegistri del demone client (cambiamenti di profilo, rilevamenti, errori)
journalctl -u roamswitch-server.serviceServerRegistri del demone del server (eventi FIM, rilevamenti Falco, isolamenti)
/run/roamswitch/roamswitch.sockClienteSocket del dominio Unix IPC del demone client
/run/roamswitch/events.sockServerSocket di integrazione eBPF Falco/Tetragon (root:root, modalità 0660; Falco viene eseguito come root per impostazione predefinita, abilitando le scritture socket dirette a configurazione zero)
/run/roamswitch/state.jsonClienteStato del ciclo: {active_level, network_trusted, fanotify_ready}
/run/roamswitch/alerts.jsonClienteCoda di avvisi recenti
/run/roamswitch/approvals.jsonClienteCoda di approvazione in sospeso
/run/roamswitch/fanotify.readyClienteFile flag che indica che Fanotify Guard è in esecuzione
/var/lib/roamswitch/fim_baseline.dbServerDatabase hash di base FIM SHA-256
~/.local/share/roamswitch/quarantine/EntrambiDeposito di quarantena (0700, campioni 0400) + .metadata.json

Chiamata diretta IPC (avanzata)

Il demone accetta JSON delimitato da nuova riga su /run/roamswitch/roamswitch.sock:

# Forza il cambio di profilo (edizione client)
printf '{"id":1,"method":"set_security_level","params":{"level":"lockdown"}}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

# Riconcilia subito il blocco ARP del gateway
printf '{"id":1,"method":"reconcile_gateway_lock","params":null}\n' \
  | sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock

6. Stato programmatico (MCP)

roamswitch-mcp espone strumenti di sola lettura su JSON-RPC su 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).

Non utilizza alcuna comunicazione di rete esterna, si connette localmente al socket del demone o chiama roamswitch-core. Vedere la Guida all'installazione del sistema MCP

7. Ricette di automazione

Controllo giornaliero dello stato del cron → Invia un'e-mail se il punteggio scende al di sotto della soglia

#!/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

Monitorare la coda degli avvisi (sondaggio 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

Verifica l'integrità di fanotify guard (state.json)

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

8. Risoluzione dei problemi

Sintomo Risoluzione
roamswitch esce con "verifica che roamswitch-mcp sia installato" Il demone non è in esecuzione → sudo systemctl start roamswitch.service (o roamswitch-server.service). Verificare che il socket esista
roamswitch status mostra fanotify 🔴 "la guardia si è fermata" Esaurimento transitorio fs.fanotify.max_user_groups. Riavvia con sudo systemctl restart roamswitch.service e verifica nel diario
Il profilo rimane in balanced, non raggiunge mai open Verifica che il MAC del gateway sia registrato in trusted_networks con level: open
SSH si disconnette inaspettatamente L'edizione client ha sharing_service_control_enabled: true su una rete non attendibile. Disabilita tramite roamswitch sharing off
Le modifiche alla configurazione non hanno effetto 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).
Comunicazioni del server bloccate accidentalmente Accedi alla console cloud (VNC/Seriale) ed esegui sudo roamswitch emergency-restore

9. Riferimenti