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 |