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 / /tmp noexec)
  • 威胁防护 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字符串/quad9quad9 / cloudflare / adguard / cleanBrowsing
dns_scope字符串/untrusted_onlyuntrusted_only / always_on
arp_spoof_guard_enabled布尔 / trueARP欺骗监控
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布尔 / trueYama ptrace 限制
usb_storage_guard_enabled / usb_keyboard_guard_enabled布尔 / falseUSB 存储 / BadUSB 键盘防护(默认关闭)
usb_zero_trust_enabled布尔 / falseUSB总线authorized_default=0
bluetooth_guard_enabledbool / 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字符串/wireguardwireguard / tailscale
active_vuln_scan_enabledbool / false允许执行 scan-vulns(默认关闭)。因会发送仅限127.0.0.1的可达性探测,需要明确启用
pkgcve_watched_folders[string]GUI版依赖关系照合所对象的项目文件夹列表(绝对路径)。CLI的 scan-packages 不参照此设置,仅以命令行参数指定的文件夹为对象
sensor_pairing_enabledbool / false允许与 RoamSwitch Sensor 之间基于配对码的相互信任(默认关闭)。使用 sensor 命令的前提条件
port_scan_detect_enabledbool / true入站端口扫描检测防护
port_scan_detect_min_distinct_portsint / 15在检测窗口内连接到不少于此数量不同端口的来源将被判定为扫描
port_scan_detect_window_secsint / 300扫描判定的统计窗口(秒)
port_scan_block_enabledbool / true自动封锁检测到的扫描来源 IP
port_scan_block_duration_secsint / 600自动封锁的持续时间(秒)
airgap_low_confidence_secsint / 600低置信度 Air-Gap 自动全部恢复前的秒数(0 = 不自动解除)。不适用于高置信度隔离(§3「隔离(Air-Gap)策略」)
airgap_hard_cap_secsint / 3600高置信度隔离进入降级(DEGRADED)模式前的秒数(0 = 无上限)。降级模式不会因时间流逝而放开
airgap_degraded_lift_rfkillbool / false在降级模式下是否也解除 Wi-Fi 的 rfkill(默认不解除)
airgapAutoRfkillbool / trueAir-Gap 期间是否用 rfkill 阻断 Wi-Fi 无线(解除时恢复原状)
arp_recheck_consecutiveint / 3认定 ARP 欺骗导致的隔离原因已消失所需的网关 MAC 连续一致检查次数(1 以上)
arp_recheck_min_secsint / 60上述连续一致必须持续的最短秒数
arp_recheck_active_probebool / true对于由 ARP 触发的隔离,当网关没有邻居缓存条目时(链路正常),是否直接发送 1 次 ARP 请求来验证网关 MAC。只要回应中出现受信 MAC 以外的 MAC 即视为不一致。每 20 秒最多 1 次
credential_access_watch_enabledbool / 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_enabledbool / 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 时,严重程度高的规则才会成为隔离的触发条件)
远程 SSH 注意
使用 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

9. 参考文献