ROAMSwitch for LINUX · 操作參考
CLI/無頭操作指南
如何在沒有 GUI 的情況下在雲端 VPS 實例上透過 SSH、從 cron、監控腳本和編程式 AI 代理程式 (MCP) 操作適用於 Linux 的 RoamSwitch。
- 客戶端版本 (
roamswitch):專為筆記型電腦、行動工作站和開發人員設備而設計。根據連接網路的信任等級自動切換 nftables 防火牆設定檔。本指南主要關注客戶端版本的無頭/CLI 管理。 - 伺服器版 (
roamswitch-server):專為雲端 VPS 實例(AWS、GCP、DigitalOcean、Linode 等)和直接暴露於 Internet 的本機伺服器而設計。具有入站預設丟棄過濾、SSH 鎖定預防、關鍵路徑檔案完整性監控 (FIM)、eBPF / Falco 運行時整合和即時通知(Telegram / LINE / Webhooks)的功能。有關完整的安裝和管理說明,請參閱RoamSwitch 伺服器版操作手冊 和伺服器安全性白皮書.
1. 組件
| 組件 | 運行為 | 角色 |
|---|---|---|
roamswitch-daemon(客戶端) |
根(systemd Type=notify) |
所有客户端特权操作:nftables 控制、网络检测、勒索软件/恶意软件监控、fanotify、ARP/NDP 固定、DNS 强制。不開啟 TCP/UDP 偵聽套接字。 |
roamswitch-server-daemon(伺服器) |
根(systemd Type=notify) |
所有伺服器特權處理。入站預設全部丟棄、SSH/管理來源 IP 例外保護、FIM(150+ 個重要檔案與目錄集合的竄改偵測)、Falco eBPF UNIX 通訊端接收與行程凍結(SIGSTOP)、執行(exec)記錄器、事件轉送(需主動開啟)、通知傳送 |
roamswitch (命令列) |
登入使用者(某些操作需要 sudo) | 瘦客戶端讀取守護程式狀態。在客户端版本上使用 /run/roamswitch/roamswitch.sock IPC,或在服务器版本上提供 --server、server、fim 和 emergency-restore 子命令。 |
roamswitch-mcp |
人工智慧客戶端催生 | 只讀 MCP 伺服器(stdio / JSON-RPC),用於 AI 代理程式以程式方式檢索狀態。請參閱 MCP 設定 |
roamswitch-ransomware-rollback |
root(watch 由 systemd 的 roamswitch-ransomware-rollback-watch.service 執行) |
勒索軟體復原工具。為 btrfs 子卷與 LVM 邏輯卷建立快照,並只取出所需檔案。包含在用戶端套件中,也可從 GUI 的「入侵應變」分頁使用 |
roamswitch-app |
登入用戶 | GTK GUI(僅限客戶端版)。在無頭環境中不需要。 |
無頭部署在守護程序 + roamswitch CLI 上執行(如果需要,也可新增 roamswitch-mcp)。 所有自主防禦機制都無需任何 GUI 即可運作。
roamswitch) 和伺服器版 (roamswitch-server) 是互斥的套件 (Conflicts)。在伺服器環境上部署 roamswitch-server。2.守護程式(systemd服務)
客戶端版
sudo systemctl status roamswitch.service # 運作狀態
sudo systemctl enable roamswitch.service # 開機自動啟動(安裝時已啟用)
sudo systemctl restart roamswitch.service # 重新啟動
journalctl -u roamswitch.service -f # 日誌追蹤
journalctl -u roamswitch.service --since "1h ago"
客戶端守護程式在啟動時和每個週期(3 秒)自主執行的操作:
- 識別連線的閘道 MAC 並針對
trusted_networks套用 nftables 設定檔 (open/balanced/lockdown) - 行為勒索軟體檢測(fanotify + Shannon entropy + canary)
- 按存取惡意軟體掃描(fanotify,可選 ClamAV)
- ARP 欺騙監控和預防性閘道 ARP/NDP 固定在不受信任的網路上
- 每個設定檔的核心強化(sysctl / Yama / core dumps /
/tmpnoexec) - 威胁防护 DNS 强制执行 (
dns_enabled+dns_scope) - 用於網路釣魚攔截的連結防護 (NFQUEUE)
- 运行时状态输出到
/run/roamswitch/state.json
伺服器版
sudo systemctl status roamswitch-server.service # 運作狀態
sudo systemctl restart roamswitch-server.service # 重新啟動
journalctl -u roamswitch-server.service -f # 日誌追蹤
3. CLI 指令參考
基本語法:roamswitch <command> [options]。不带参数运行默认为 status。輸出語言會自動遵循作業系統區域設定 (LC_ALL / LC_MESSAGES / LANG)。
| 命令 | 權限 | 描述 |
|---|---|---|
status [--server](别名 report / server-status) |
使用者 | 安全健康診斷(通常 27 項,指定 --server 時為伺服器版 34 項)、分數(0–100)、等級與改善建議。使用 --json 可將相同內容以機器可讀的 JSON 輸出到標準輸出 |
server [status|config|setup|tui|test-notify|restart|ack|ebpf|bans|unban|allowlist] |
用戶/根用戶 | Server Edition 的管理。config 用於顯示與修改設定,setup 是互動式精靈,tui 是全功能 TUI(roamswitch-server-tui。root 可進行全部操作,一般使用者為唯讀),test-notify 用於通知測試,restart 用於重新啟動服務(不支援設定的重新載入)。ack 對目前的緊急隔離做出確認回應(FULL 隔離期間維持嚴格隔離,降級模式期間則解除。參見 §3 的隔離原則)。ebpf(別名 incidents)顯示 eBPF 執行階段防護目前的隔離狀態與已偵測事件的歷程。allowlist [list|add <rule> <process> [--exe <絕對路徑>]|remove] 用於管理誤判的永久允許清單,透過 --exe 與執行檔綁定後,無法透過偽造行程名稱來規避。bans [--json] 顯示 SSH 暴力破解防護的狀態和被封鎖的來源位址(清單只有 root 能讀取),unban <IP|IPv6 的 /64|--all> 用於解除封鎖(root) |
fim [verify|update] |
用戶/根用戶 | 關鍵路徑檔案完整性監控驗證 (verify) 和基線雜湊資料庫更新 (update) |
bans [--json] |
用戶/根用戶 | 顯示 SSH 暴力破解防護的狀態(阻斷/僅偵測/已停止及其原因)、目前正在阻斷的來源及剩餘時間,以及最近的記錄。阻斷清單只有 root 能讀取,所以要加 sudo。支援 --json。與伺服器版的 server bans 相同 |
unban <IP | IPv6 /64 | --all> |
根 | 解除 SSH 暴力破解防護的阻斷,並清除該來源的失敗次數。--all 表示全部解除。與伺服器版的 server unban 相同 |
emergency-restore |
根 | 解除所有緊急 eBPF/防火牆隔離並恢復網路基線 |
ports [-a|--all] |
使用者 | 監聽 0.0.0.0、未經身份驗證的資料庫和開發伺服器上的連接埠。 -a 包含僅環回端口 |
guards |
使用者 | 自動防禦衛士的狀態(連接埠異常、ARP、USB儲存、下載、DNS威脅、金絲雀、開發伺服器隔離器、藍牙) |
wifi |
使用者 | Wi-Fi 加密強度(開放/WEP/WPA/有線)和 SSID |
sharing [status|on|off] |
使用者 | 在不受信任的網路上自動停止/恢復 SSH/Samba/RDP(on 在不受信任時斷開活動的 SSH) |
audit-url <URL> |
使用者 | 透過本地來源 + 啟發式檢查 URL 網路釣魚和威脅風險(從不獲取目標) |
audit-secrets <text|path|directory> |
使用者 | 偵測文字、檔案或目錄(遞迴掃描,自動跳過 .git/node_modules 等)中的 API 金鑰、私鑰和令牌(從不傳輸資料) |
audit-logs [hours] |
使用者 | 聚合並分類過去 N 小時的系統日誌/身份驗證日誌(預設 24)。API 金鑰和權杖會自動遮罩。同時顯示記錄模式異常偵測結果(新模式與統計頻率激增) |
canary |
使用者 | 勒索軟體金絲雀誘餌文件狀態與完整性,以及已偵測到的事件記錄(最近50筆) |
port-anomaly(別名 port-guard) |
一般 | 未知連接埠暴露防護的基準線取得狀態、目前自動阻擋的連接埠,以及已偵測到的事件記錄(最近50筆) |
quarantine [list] |
使用者 | 惡意軟體隔離庫的內容(樣本、原始路徑、威脅名稱、日期) |
knowledge [query](別名 faq) |
使用者 | 搜尋離線知識庫 |
airgap [enable|disable] |
用戶/根用戶 | Air-Gap 緊急阻斷的觸發 / 解除(僅限用戶端版)。enable 會丟棄所有對外通訊(已建立的連線也會被切斷),disable 則復原。自動解除的機制請參見下文的「隔離(Air-Gap)原則」 |
help (--help / -h) |
使用者 | 顯示幫助(roamswitch <command> --help 表示子命令幫助) |
scan-packages [資料夾...] |
一般 | 將已安裝的OS軟體包(自動判定dpkg/pacman/dnf/zypper)與本機已知CVE對照表進行比對。傳入資料夾參數後,還會將該專案的相依關係(npm/PyPI/crates.io等7個生態系統)的鎖定檔案一併納入比對。在 Ubuntu(20.04、22.04、24.04、26.04)上使用 Ubuntu 專用資料,只比對 Ubuntu 已發布修復、CVSS 7.0 以上的 CVE(「無符合項目」不代表沒有已知 CVE)。Ubuntu 衍生版與不支援的版本會顯示為「不在範圍內」,不會改用 Debian 的資料。完全不進行任何網路活動 |
scan-vulns [--confirm] |
一般 | 僅當 active_vuln_scan_enabled: true(預設關閉)時執行:僅限127.0.0.1的Redis/Memcached/MongoDB/dockerd無驗證可達性確認、對偵測到的開發伺服器進行CORS設定錯誤・路徑遍歷・開放重新導向・SSRF診斷、SMTP開放轉發診斷,以及Telnet/FTP/SSH的實證型暴露診斷。未帶 --confirm 則為演練模式 |
vuln-status |
一般 | 列出 scan-vulns --confirm 記錄的每個探測項目的最新結果與經過天數(pass_age)。判定分為存在漏洞/安全/無法判定三種狀態,經過天數顯示為“今天”、“N 天前”或“未知”(從未執行)。若從未執行過掃描,會提示先執行 scan-vulns --confirm 然後結束(目前沒有排程自動重新掃描機制,經過天數僅反映實際手動執行掃描的頻率)。相同資料也可透過 GUI(ports 分頁)與 MCP 工具 get_vulnerability_scan_history 取得 |
notifications(別名 notification-history) |
使用者 | RoamSwitch 傳送的通知(日誌稽核異常、ClickFix 偵測等)的歷程(最近一週,依最新排序)。使用 --json 輸出 JSON 陣列,使用 --export <檔案> 輸出 JSON Lines |
frozen [list|resume <PID>|resume all] |
使用者/root | 列出被各防護(勒索軟體高速加密偵測、金絲雀竄改、核心弱點利用偵測、eBPF 防護的精準阻斷)以 SIGSTOP 凍結的行程,並在屬於誤判時解除(SIGCONT)。凍結不是強制終止,因此解除後會從停止的位置原樣繼續執行。使用 resume all 可全部解除。解除 root 所有的行程需要 sudo |
resource-guard(別名: leak-guard) |
使用者 | 資源耗盡/行程異常偵測防護(僅 Server Edition)的偵測事件歷程。以信心等級顯示網路公開服務的持續 RSS 成長(記憶體洩漏/DoS)與當機迴圈 |
timeline(別名: incident-timeline) |
使用者 | 將連結防護(ARP 偽冒)、勒索軟體金絲雀、eBPF 執行階段防護與資源防護的偵測整合為一條時間軸。附帶行程譜系與 MITRE ATT&CK 標籤(實驗性)。使用 --json 將全部內容以 JSON 陣列輸出到標準輸出,使用 --export <檔案> 將 JSON Lines(每行一筆)寫入檔案 |
xdp-gate [status|enable|disable] |
使用者/root | 顯示或切換 XDP 啟動時閘門(實驗性)。status 顯示 roamswitch-xdp-gate.service 是否啟用及目前程式狀態。預設關閉 |
sensor [key|list|pair|repin|unpair|request-audit|results] |
一般使用者/root | 與安裝在另一個儲存庫的通用設備上的網路感測器「RoamSwitch Sensor」,透過配對碼方式建立相互信任。pair --addr <IP> --code <配對碼> --fingerprint <SHA-256> 使用 Sensor 端發放的配對碼進行配對(前提是 Sensor 以固定 IP 運作。指紋為 Sensor 畫面 / roamswitch-sensor pairing show 上顯示的值,用於固定透過 TLS 1.3 通訊的憑證。不會從網路取得,也不會退回為明文),repin 在 Sensor 重新產生憑證後重新輸入新的指紋,key 顯示本端點的公開金鑰/位址,unpair 解除配對,request-audit 向 Sensor 請求主動弱點稽核(透過 results 取得結果)。需要 sensor_pairing_enabled: true(預設關閉)。詳情請參閱 Sensor 維運手冊 |
port-scan (alias portscan) |
一般使用者 | 顯示入站連接埠掃描偵測防護的偵測歷史(來源 IP、是否自動封鎖及封鎖時長)。與偵測新增「暴露」未知連接埠的 port-anomaly 是不同的功能 |
lockfile-fim [verify|update] [--quiet|-q] |
根 | 驗證相依性鎖定檔的竄改監控(verify)並更新基準(update)。需要 root 權限。監控對象為專案資料夾(伺服器版為 lockfile_watch_dirs) |
scan-scripts <FOLDER...> |
使用者 | 從指定專案資料夾下的 node_modules 中,靜態列舉 package.json 的 preinstall / install / postinstall / prepare 指令碼(屬於清冊,不是威脅判定。無網路連線) |
scan-typosquat <FOLDER...> |
使用者 | 將 package.json 中的相依套件名稱與內建的知名 npm 套件名稱清單以編輯距離 1〜2 進行比對,提示疑似 typosquatting 的項目(僅供參考。無網路連線) |
web-scan [FOLDER...] [--quarantine] [--json] |
用戶/根用戶 | 以 Web 應用層偵測規則(內建、簽章的每日更新、/etc/roamswitch/rules.d 中的自訂規則)檢查 PHP、JavaScript、JSP、ASP 的 Web Shell、被注入的惡意程式碼、偽裝成圖片的 PHP 以及 .htaccess 濫用。省略資料夾時檢查 Web 伺服器設定中的文件根目錄。預設只檢查,--quarantine(root)才會隔離。結束碼:0 = 無發現,2 = 有 critical 或 high,1 = 無法執行 |
web-rules [status|list|validate <file.json>|locked|unlock-account <user>|example] |
用戶/根用戶 | 顯示 Web 應用層規則的狀態(版本、已推送的版本、自訂規則目錄、隔離等級、帳號處置、偵測後掛鉤)(status)、已載入規則的清單(list)、驗證自訂規則檔(validate)、查看被帳號處置停用的登入 shell(locked)並還原(unlock-account,root),以及設定與掛鉤的範例(example) |
kernel-modules [--json] [--apply [MODULE...]] [--remove] |
用戶/根用戶 | 僅透過讀取檔案(不通訊)檢查曾成為 Copy Fail、Dirty Frag 與 act_pedit 攻擊路徑的核心模組(algif_aead、esp4、esp6、rxrpc、act_pedit)是否仍可載入。--apply(root)只對未使用的模組在 modprobe.d 寫入 install … /bin/false,--remove 可還原。不計入診斷評分 |
audit-agent-setup [FOLDER...] [--json] |
用戶/根用戶 | 以唯讀方式檢查(不進行網路通訊)提供給 AI 代理的指示檔與技能(~/.claude、~/.codex、~/.cursor、~/.gemini、~/.agents、~/.openclaw,以及為套件 CVE 比對登錄的專案資料夾(和指定的 FOLDER)中的 CLAUDE.md、AGENTS.md 等)和 OpenClaw 的 openclaw.json。可發現不可見的 Unicode 字元、指示覆蓋、下載後直接執行、機密檔案的引用與外送、技能中的已編譯程式碼、OpenClaw 驗證被關閉或權杖過短等問題,HTML 註解中的內容以較高風險處理。不會輸出檔案本文或機密。符合只表示「需要人來讀一讀」,並不斷定為惡意。--json 輸出 JSON |
bluetooth-audit [--json] |
使用者 | 檢查 BlueZ 設定(/etc/bluetooth/input.conf 與 main.conf)中是否有允許未配對裝置作為鍵盤連線的設定,並列出已連線的藍牙鍵盤與滑鼠(唯讀) |
audit-npm-signatures <DIR> [--confirm] |
使用者 | 使用 npm audit signatures 驗證已安裝套件的簽章與 provenance(RoamSwitch 中唯一會與 npmjs.com 通訊的指令。不帶 --confirm 時為試執行。伺服器版還需要啟用 npm_audit_signatures_enabled) |
install [--pm npm|pnpm] [--yes] |
使用者 | 包裝 npm / pnpm 的 install,僅將生命週期指令碼的執行限制在 bwrap 沙箱中(套件的下載仍照常連線網路進行) |
forward status|test|queue (alias event-forward) |
用戶/根用戶 | 事件轉送(syslog RFC 5424 / CEF、JSON Lines、帶 HMAC 簽章的結構化 Webhook)的狀態檢視(status)、連線測試(test)與重送佇列顯示(queue)。需主動開啟,預設關閉,僅傳送到所設定的目的地(伺服器版維運手冊 §16) |
events search|tree|export|verify|status (alias exec-events) |
根 | 搜尋本機執行(exec)記錄器的日誌(search: --since 2h --pid N --exe S --user U --parent P --text S --json)、顯示行程樹(tree <pid>)、匯出(export)、雜湊鏈驗證(verify。用於偵測竄改而非防止)、狀態顯示(status)。日誌僅 root 可讀,通常需要 sudo(伺服器版維運手冊 §15) |
隔離(Air-Gap)原則
如果僅靠固定計時器解除,會被只需等待的攻擊者突破,因此隔離的觸發條件依信賴度分類(用戶端版與伺服器版通用)。
- 低信賴度(手動 Air-Gap、通用異常、eBPF 的 Error / Warning 及以下等):經過較短的計時器後全部復原(用戶端:
airgap_low_confidence_secs,預設 600 秒。伺服器:guard.yaml的safety_timer_secs,預設 300 秒。0表示停用計時器)。 - 高信賴度(金絲雀竄改、勒索軟體式的大量改寫、lockdown 期間的 ARP 偽冒、eBPF 的 Critical / Emergency / Alert、同一規則的重複觸發等):不會靜默復原。計時器之後會重新確認原因(已凍結的 PID、金絲雀、ARP、規則的再次觸發),僅在確認原因消失時才會附帶通知解除。如果無法確認、也沒有 ack,並達到上限(用戶端:
airgap_hard_cap_secs,伺服器:server.conf的isolation_hard_cap_secs。兩者預設均為 3600 秒,0= 無上限),則進入降級(DEGRADED)模式。 - 降級模式絕不會因時間流逝而自動放開(用戶端僅允許迴路,伺服器僅允許維護 SSH 與白名單 IP 的管理路徑)。解除的方式只有:重新確認原因消失、明確的確認回應(伺服器:
roamswitch server ack),或手動解除(GUI 的解除按鈕 /roamswitch emergency-restore)。在用戶端的降級模式下,除非將airgap_degraded_lift_rfkill設為true,否則 Wi-Fi 的 rfkill 也不會被解除。 - 管理路徑以外的已建立連線會被切斷(伺服器:維護 SSH 連接埠與白名單 IP 以外。攻擊者已經建立的 C2 或反向 Shell 也會被阻斷)。手動 Air-Gap:透過無警告的選單 / GUI /
roamswitch airgap enable觸發時為低信賴度;但如果是從 ARP 偽冒警告的「立即阻斷」觸發,則繼承該警告的信賴度(高),並在不傳送任何網路資料的情況下重新確認閘道的 MAC 是否連續與受信任的 MAC 一致(arp_recheck_consecutive次、arp_recheck_min_secs秒以上)。每次狀態轉換都會記錄到事件時間軸。
勒索軟體復原(快照與依檔案復原)
以下指令屬於 roamswitch-ransomware-rollback(不是 roamswitch 的子指令)。其狀態儲存在 /var/lib/roamswitch。
| 命令 | 權限 | 描述 |
|---|---|---|
roamswitch-ransomware-rollback snapshot [--path PATH] [--label TEXT] |
root | 立即為目標(預設 $HOME)建立快照。目標為 btrfs 子卷或 LVM 邏輯卷 |
roamswitch-ransomware-rollback watch [--path PATH] [--periodic-interval-secs N] |
root | 常駐監控。在短時間內檔案被大量改寫,或其他防護記錄了 Critical 事件時,自動建立快照;同時依排程建立預先快照(預設每 6 小時,btrfs 保留 4 代,LVM 保留 2 代;建立偵測時快照後,定期快照預設暫停 7 天) |
roamswitch-ransomware-rollback list [--path PATH] [--json] |
root | 列出本工具建立的快照(類型、是否仍存在、推薦的預先快照)。--json 為機器可讀輸出 |
roamswitch-ransomware-rollback restore-files <ID> <PATH> [--dest DIR] |
root | 只把指定的檔案或目錄從快照取出到另一位置,不覆寫目前狀態(預設 <目標>/RoamSwitch-Recovered/<ID>/)。復原的首選方式 |
roamswitch-ransomware-rollback mount-for-browsing <ID> / unmount-browse <MOUNT_POINT> |
root | 為了選擇傳給 restore-files 的路徑,讓快照內容可見(btrfs 直接可見,LVM 為唯讀臨時掛載)。用完後以 unmount-browse 卸載 |
roamswitch-ransomware-rollback config get|set --periodic-interval-secs N |
root | 預先快照的間隔(秒;0 表示關閉,其他值須不小於 300)。無需重新啟動即可套用到執行中的 watch。沒有關閉偵測時快照的設定 |
roamswitch-ransomware-rollback restore <ID> [--yes] [--accept-tampered] |
root | 把整個目標回復到快照的狀態(破壞性操作)。偵測時快照包含已被加密的檔案,因此沒有 --accept-tampered 會被拒絕。請先嘗試 restore-files |
範例
sudo roamswitch status # 用戶端綜合診斷(27項)
sudo roamswitch status --server # 伺服器版綜合診斷(34項)
sudo roamswitch ports -a # 全部監聽埠
roamswitch guards # 守護程式運作狀態
roamswitch audit-url https://examp1e-login.com
roamswitch audit-secrets ./deploy.env
roamswitch audit-secrets . # 遞迴掃描目前目錄
roamswitch audit-logs 72 # 分析最近72小時的日誌
sudo roamswitch sharing on # 在非信任網路下自動停止 SSH/Samba/RDP
sudo roamswitch fim verify # FIM 檔案完整性驗證
sudo roamswitch fim update # 更新 FIM 基準線
sudo roamswitch emergency-restore # 完全解除緊急遮斷並復原
sudo roamswitch airgap enable # 緊急遮斷
sudo roamswitch airgap disable # 解除
sudo roamswitch server ack # 對緊急隔離做出確認回應(FULL 隔離期間維持嚴格隔離,降級期間解除)
roamswitch canary # 金絲雀誘餌事件記錄
roamswitch vuln-status # 顯示最近一次掃描結果與經過天數(pass_age)
roamswitch port-anomaly # 未知連接埠暴露防護事件記錄
roamswitch server ebpf # eBPF 防護的隔離狀態和事件記錄
roamswitch server bans # SSH 暴力破解防護的狀態與目前被封鎖的來源位址清單
sudo roamswitch server unban 203.0.113.9 # 解除 SSH 暴力破解防護的封鎖(需要 root)
roamswitch notifications # 過去1週的通知歷史
roamswitch frozen # 列出被凍結的行程
sudo roamswitch frozen resume 12345 # 解除誤判凍結的行程
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2 --fingerprint 3F:45:89:E1:...:36:10 # 使用配對碼與 Sensor 配對
sudo roamswitch sensor key # 顯示本端點自身的公鑰/位址
roamswitch port-scan # 連接埠掃描偵測歷史
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
伺服器版守護行程以root權限運行,因此需要讀取nftables規則集或識別行程擁有者的命令(status / status --server / ports -a)在沒有sudo的情況下會傳回不準確的結果(錯誤的「未執行」判定或行程資訊缺失)。變更設定的命令(sharing / fim update / airgap / emergency-restore等)同樣需要sudo。其他唯讀命令即使不使用sudo也能正確運作。
- 支援各子指令單獨使用
--help(例如:roamswitch ports --help)。 - 如需機器可讀的取得方式,請使用
status --json、timeline/notifications的--json(JSON 陣列)與--export <檔案>(JSON Lines)、events search --json、MCP(§6)或/run/roamswitch/state.json(§5)。 - 用戶端版中沒有透過 CLI 直接切換設定檔(profile)的指令(由常駐程式自主判定)。如需強制指定,請設定
config.json的manual_override,或直接呼叫 IPC 的set_security_level(§5)。 - 無論診斷結果如何,
status都回傳結束碼 0。用於監控時,請解析輸出中的分數行(範例見 §7)。
4. 設定檔
客戶端版本 (~/.config/roamswitch/config.json)
該守護程式以 root 身分執行,並使用它找到的第一個有效檔案(或僅 root 環境中的 /root/.config/roamswitch/config.json)掃描 /home/*/.config/roamswitch/config.json。
| 鑰匙 | 類型/預設 | 描述 |
|---|---|---|
language | 字串/作業系統區域設置 | UI 和 CLI 語言(ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT) |
trusted_networks | [{name, mac, level}] | 值得信賴的網路; mac 是閘道 MAC,level 是 open / balanced / lockdown |
away_protection_level | 字串/lockdown | 未知網路上的預設設定檔 |
manual_override | 字串/空 | 強制 open / balanced / lockdown (自動為空) |
dns_enabled | 布爾 / true | 威脅防護 DNS 實施 |
dns_provider | 字串/quad9 | quad9 / cloudflare / adguard / cleanBrowsing |
dns_scope | 字串/untrusted_only | untrusted_only / always_on |
arp_spoof_guard_enabled | 布爾 / true | ARP欺騙監控 |
gateway_arp_lock_enabled | 布爾 / true | 不受信任網路上的預防性閘道 ARP/NDP 鎖定 |
port_anomaly_guard_enabled | 布爾 / true | 自動阻止新的監聽端口 |
system_wide_fanotify_enabled | 布爾 / true | 系統範圍內的 fanotify 惡意軟體防護 |
pre_exec_blocking_enabled | 布爾 / true | 執行前阻塞 (FAN_DENY) |
mount_hardening_enabled | 布爾 / true | /tmp 和 /dev/shm 上的 noexec(套用於非開放式設定檔) |
yama_memory_protect_enabled | 布爾 / true | Yama ptrace 限制 |
usb_storage_guard_enabled / usb_keyboard_guard_enabled | 布爾 / false | USB 儲存 / BadUSB 鍵盤防護(預設為關閉) |
usb_zero_trust_enabled | 布爾 / false | USB匯流排authorized_default=0 |
bluetooth_guard_enabled | bool / true | 在不受信任網路中關閉藍牙的「可被探索」(預設 ON。不關閉電源,已連線的裝置維持連線) |
sharing_service_control_enabled | 布爾 / true | 自動停止/恢復 SSH / Samba / RDP |
scan_exclusions | [string] | 排除掃描的絕對路徑 |
link_guard | 物件 | {enabled, mode: "off"|"warn"|"block", allowlist, blocklist_extra, use_threat_dns} |
vpn_on_untrusted_enabled | 布爾 / false | 在不受信任的網路上自動啟動 VPN 隧道 |
vpn_backend | 字串/wireguard | wireguard / tailscale |
active_vuln_scan_enabled | bool / false | 允許執行 scan-vulns(預設關閉)。因會傳送僅限127.0.0.1的可達性探測,需要明確啟用 |
pkgcve_watched_folders | [string] | GUI版相依關係比對所鎖定的專案資料夾清單(絕對路徑)。CLI的 scan-packages 不參照此設定,僅以命令列參數指定的資料夾為對象 |
sensor_pairing_enabled | bool / false | 允許與 RoamSwitch Sensor 之間基於配對碼的相互信任(預設關閉)。使用 sensor 指令的前提條件 |
port_scan_detect_enabled | bool / true | 入站連接埠掃描偵測防護 |
port_scan_detect_min_distinct_ports | int / 15 | 在偵測視窗內連線到不少於此數量不同連接埠的來源將被判定為掃描 |
port_scan_detect_window_secs | int / 300 | 掃描判定的統計視窗(秒) |
port_scan_block_enabled | bool / true | 自動封鎖偵測到的掃描來源 IP |
port_scan_block_duration_secs | int / 600 | 自動封鎖的持續時間(秒) |
airgap_low_confidence_secs | int / 600 | 低信賴度 Air-Gap 自動全部復原前的秒數(0 = 不自動解除)。不適用於高信賴度隔離(§3「隔離(Air-Gap)原則」) |
airgap_hard_cap_secs | int / 3600 | 高信賴度隔離進入降級(DEGRADED)模式前的秒數(0 = 無上限)。降級模式不會因時間流逝而放開 |
airgap_degraded_lift_rfkill | bool / false | 在降級模式下是否也解除 Wi-Fi 的 rfkill(預設不解除) |
airgapAutoRfkill | bool / true | Air-Gap 期間是否用 rfkill 封鎖 Wi-Fi 無線電(解除時還原) |
arp_recheck_consecutive | int / 3 | 認定 ARP 偽冒導致的隔離原因已消失所需的閘道 MAC 連續一致檢查次數(1 以上) |
arp_recheck_min_secs | int / 60 | 上述連續一致必須持續的最短秒數 |
arp_recheck_active_probe | bool / true | 對於由 ARP 觸發的隔離,當閘道沒有鄰居快取項目時(連結正常),是否直接送出 1 次 ARP 請求來驗證閘道 MAC。只要回應中出現受信 MAC 以外的 MAC 即視為不一致。每 20 秒最多 1 次 |
credential_access_watch_enabled | bool / true | 意料之外的行程開啟憑證檔案(~/.ssh 中的私密金鑰、~/.aws/credentials、~/.config/gcloud、瀏覽器憑證儲存區)時發出通知(僅通知,預設 ON。備份工具和索引器從一開始就被排除,其他請用 credential_access_watch_allow 排除。設定約 30 秒內生效。對於 cat 或 head 這類極短的讀取,若程式在 RoamSwitch 識別出其可執行檔之前就已結束,可能不會通知) |
ssh_guard_* | — | SSH 暴力破解防護的設定。10 個鍵及其預設值與伺服器版(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(空,IP / CIDR 陣列或逗號分隔的字串)、ssh_guard_log_source(auto)、ssh_guard_yield_to_fail2ban(true)、ssh_guard_trust_key_days(30)。只在 sshd 執行時運作。超出範圍的值會回到預設值。約 1 分鐘內生效(無須重新啟動)。封鎖的清單與解除使用 roamswitch bans 與 roamswitch unban |
fim_intrusion_context_enabled | bool / true | 在檔案竄改(FIM)與鎖定檔竄改的通知中,附上寫入檔案的行程的帳號、可執行檔,以及該行程所屬的 SSH 登入(來源、時間、驗證方式);憑證檔案的通知只有在屬於某個 SSH 登入時才會附上。常駐程式重新啟動後生效。不會向外部傳送任何內容 |
forward_* | — | 事件轉送(syslog / JSON Lines / 簽章 Webhook)的設定。需主動開啟,預設關閉。鍵包括 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、forward_queue_max_age_hours(型別與預設值見伺服器版維運手冊 §18) |
exec_recorder_* / exec_rule* | — | 本機執行(exec)記錄器與僅通知的關聯規則 EXR-001〜007 的設定。預設啟用(記憶體不足 1 GiB 的主機上停用。明確設定優先)。鍵包括 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、exec_rules_isolation_optin(預設 false。僅在設為 true 時,嚴重程度高的規則才會成為隔離的觸發條件) |
sharing_service_control_enabled: true,連線到不受信任的網路 會中斷活動的 SSH 會話。在無頭伺服器上將其停用。伺服器版 (/etc/roamswitch/server.conf)
伺服器版使用 INI 格式的設定檔,並以權限 0600(僅 root)保護。所有鍵的型別、可用值、預設值與是否需要重新啟動,請參閱 伺服器版 維運手冊 §18。可透過 roamswitch server config show|get|set 修改,也可以在 roamswitch server tui 的設定編輯器(server.conf 與 guard.yaml 的全部 146 個鍵)中編輯。伺服器版不支援設定的重新載入,因此修改後請透過 sudo roamswitch server restart 使其生效。
共享機器:僅管理員模式
在多人共用的機器上,可以用 sudo touch /etc/roamswitch/admin-only 開啟「僅管理員」模式。防火牆、DNS、VPN、USB、核心與掛載強化、無線電、Sensor 信任等影響整台機器的變更,只允許 root 或 sudo / wheel / roamswitch 群組的使用者執行。與自己的檔案和行程相關的操作(隔離、kill、freeze、掃描)與以前相同。/etc/roamswitch/admin-only 僅在由 root 擁有且其他使用者無法寫入時才有效(使用者不能自己建立它來切換模式)。預設關閉(沒有該檔案)。
5. 日誌和運行時狀態文件
| 路徑 | 目標 | 描述 |
|---|---|---|
journalctl -u roamswitch.service | 客戶 | 客戶端守護程序日誌(設定檔切換、偵測、錯誤) |
journalctl -u roamswitch-server.service | 伺服器 | 伺服器守護程序日誌(FIM 事件、Falco 偵測、隔離) |
/run/roamswitch/roamswitch.sock | 客戶 | 客戶端守護程式 IPC Unix 域套接字 |
/run/roamswitch/events.sock | 伺服器 | Falco / Tetragon eBPF 連動通訊端(root:root,mode 0600。Falco 同樣以 root 執行,因此無須額外的權限設定) |
/run/roamswitch/state.json | 客戶 | 循環狀態:{active_level, network_trusted, fanotify_ready} |
/run/roamswitch/alerts.json | 客戶 | 最近的警報佇列 |
/run/roamswitch/approvals.json | 客戶 | 待批准隊列 |
/run/roamswitch/fanotify.ready | 客戶 | 指示 fanotify 防護正在運作的標誌文件 |
/var/lib/roamswitch/fim.db | 伺服器 | FIM SHA-256 基線哈希資料庫 |
~/.local/share/roamswitch/quarantine/ | 兩者都 | 隔離庫(0700,樣本 0400)+ .metadata.json |
/var/lib/roamswitch/exec_log/ | 兩者都 | 執行(exec)記錄器的帶雜湊鏈的 JSON Lines(僅 root,0600)。使用 roamswitch events 搜尋與驗證 |
/run/roamswitch/airgap_isolation.json / host_isolation.json | 兩者都 | 隔離(Air-Gap)的狀態(FULL / 降級)與觸發條件的記錄。即使重新啟動常駐程式,隔離也會持續 |
直接呼叫IPC(進階)
守護程式在 /run/roamswitch/roamswitch.sock 上接受換行符號分隔的 JSON:
# 強制切換設定檔(用戶端版)
printf '{"id":1,"method":"set_security_level","params":{"level":"lockdown"}}\n' \
| sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock
# 立即核對閘道器 ARP 鎖定
printf '{"id":1,"method":"reconcile_gateway_lock","params":null}\n' \
| sudo socat - UNIX-CONNECT:/run/roamswitch/roamswitch.sock
6. 程序化狀態 (MCP)
roamswitch-mcp 在 stdio 上透過 JSON-RPC 公開唯讀工具 (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)。
它不會連線外部主機,而是在本機連接常駐程式的套接字或直接呼叫 roamswitch-core。get_security_report 與 verify_security_findings 也不會向區域網路傳送任何內容(閘道只從 ARP 快取等資訊中讀取)。請參閱 MCP 設定指南
7. 自動化食譜
每日 cron 健康檢查 → 如果分數低於閾值則發送電子郵件
#!/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
監控警報隊列(輪詢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
驗證 fanotify 防護健康狀況 (state.json)
jq -e '.fanotify_ready == true' /run/roamswitch/state.json >/dev/null \
|| echo "WARNING: fanotify guard is not running" >&2
8. 故障排除
| 症狀 | 解析度 |
|---|---|
roamswitch 退出並顯示“檢查漫遊交換器-mcp 是否已安裝” |
守護程式未執行 → sudo systemctl start roamswitch.service(或 roamswitch-server.service)。驗證套接字是否存在 |
roamswitch status 顯示 fanotify 🔴 “守衛停了下來” |
短暫的 fs.fanotify.max_user_groups 疲憊。使用 sudo systemctl restart roamswitch.service 重新啟動並在日誌中驗證 |
設定檔停留在 balanced,永遠不會達到 open |
驗證網關 MAC 已在 trusted_networks 中註冊到 level: open |
| SSH 意外斷開 | 客戶端版本在不受信任的網路上有 sharing_service_control_enabled: true。透過 roamswitch sharing off 停用 |
| 配置更改不生效 | 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). |
| 伺服器通訊意外被阻止 | 存取雲端控制台(VNC/串列埠)並執行sudo roamswitch emergency-restore |