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).
- 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.
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 atrusted_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 /
/tmpnoexec) 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.
- 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_overrideinconfig.jsono chiamare direttamente l'IPCset_security_level(§5). statusrestituisce 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 |
|---|---|---|
language | stringa/impostazione locale del sistema operativo | Lingua 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_level | stringa / lockdown | Profilo predefinito su reti sconosciute |
manual_override | stringa / nullo | Forza open / balanced / lockdown (null per automatico) |
dns_enabled | bool / true | Applicazione DNS di protezione dalle minacce |
dns_provider | stringa / quad9 | quad9 / cloudflare / adguard / cleanBrowsing |
dns_scope | stringa / untrusted_only | untrusted_only / always_on |
arp_spoof_guard_enabled | bool / true | Monitoraggio dello spoofing ARP |
gateway_arp_lock_enabled | bool / true | Blocco preventivo ARP/NDP del gateway su reti non attendibili |
port_anomaly_guard_enabled | bool / true | Blocca automaticamente le nuove porte di ascolto |
system_wide_fanotify_enabled | bool / true | Fanotify protezione malware a livello di sistema |
pre_exec_blocking_enabled | bool / true | Blocco pre-esecuzione (FAN_DENY) |
entropy_freeze_enabled | bool / true | Blocco rapido del ransomware (SIGSTOP) |
mount_hardening_enabled | bool / true | noexec su /tmp e /dev/shm (applicato su profili non aperti) |
yama_memory_protect_enabled | bool / true | Restrizioni sulla traccia Yama |
usb_storage_guard_enabled / usb_keyboard_guard_enabled | bool / false | Memoria USB/protezione tastiera USB difettosa (disattivata per impostazione predefinita) |
usb_zero_trust_enabled | bool / false | Bus USB autorizzato_default=0 |
bluetooth_guard_enabled | bool / false | Disattiva la radio Bluetooth su reti non attendibili |
sharing_service_control_enabled | bool / true | Arresto/ripristino automatico SSH/Samba/RDP |
scan_exclusions | [string] | Percorsi assoluti esclusi dalla scansione |
link_guard | oggetto | {enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns} |
vpn_on_untrusted_enabled | bool / false | Avvio automatico del tunnel VPN su reti non attendibili |
vpn_backend | stringa / wireguard | wireguard / tailscale |
active_vuln_scan_enabled | bool / false | Consente 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_enabled | bool / false | Consente la fiducia reciproca tramite codice di abbinamento con RoamSwitch Sensor (disattivato per impostazione predefinita). Necessario per usare il comando sensor |
port_scan_detect_enabled | bool / true | Protezione di rilevamento delle scansioni delle porte in ingresso |
port_scan_detect_min_distinct_ports | int / 15 | Una sorgente che si connette ad almeno questo numero di porte distinte entro la finestra di rilevamento viene considerata una scansione |
port_scan_detect_window_secs | int / 300 | Finestra di aggregazione per il rilevamento delle scansioni (secondi) |
port_scan_block_enabled | bool / true | Blocca automaticamente l'IP di origine della scansione rilevata |
port_scan_block_duration_secs | int / 600 | Durata del blocco automatico (secondi) |
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.service | Cliente | Registri del demone client (cambiamenti di profilo, rilevamenti, errori) |
journalctl -u roamswitch-server.service | Server | Registri del demone del server (eventi FIM, rilevamenti Falco, isolamenti) |
/run/roamswitch/roamswitch.sock | Cliente | Socket del dominio Unix IPC del demone client |
/run/roamswitch/events.sock | Server | Socket 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.json | Cliente | Stato del ciclo: {active_level, network_trusted, fanotify_ready} |
/run/roamswitch/alerts.json | Cliente | Coda di avvisi recenti |
/run/roamswitch/approvals.json | Cliente | Coda di approvazione in sospeso |
/run/roamswitch/fanotify.ready | Cliente | File flag che indica che Fanotify Guard è in esecuzione |
/var/lib/roamswitch/fim_baseline.db | Server | Database hash di base FIM SHA-256 |
~/.local/share/roamswitch/quarantine/ | Entrambi | Deposito 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 |