LINUX용 ROAMSWITCH · 작동 참조

CLI/헤드리스 운영 가이드

GUI 없이 Linux용 RoamSwitch를 작동하는 방법 — 클라우드 VPS 인스턴스, SSH, cron, 모니터링 스크립트 및 프로그래밍 방식 AI 에이전트(MCP)에서.

에디션 선택
  • 클라이언트 에디션(roamswitch): 노트북, 모바일 워크스테이션 및 개발자 장치용으로 설계되었습니다. 연결된 네트워크의 신뢰 수준에 따라 nftables 방화벽 프로필을 자동으로 전환합니다. 이 가이드는 주로 Client Edition의 헤드리스/CLI 관리에 중점을 둡니다.
  • Server Edition(roamswitch-server): 클라우드 VPS 인스턴스(AWS, GCP, DigitalOcean, Linode 등) 및 인터넷에 직접 노출되는 온프레미스 서버용으로 설계되었습니다. 인바운드 기본 삭제 필터링, SSH 잠금 방지, 중요 경로 파일 무결성 모니터링(FIM), eBPF/Falco 런타임 통합 및 즉시 알림(Telegram/LINE/Webhooks) 기능을 제공합니다. 전체 설치 및 관리 지침은 RoamSwitch Server Edition Operations ManualServer Security Whitepaper.
  • 을 참조하세요.

1. 구성품

구성 요소 다음으로 실행 역할
roamswitch-daemon (클라이언트) 루트(시스템 Type=notify) 모든 클라이언트 권한 작업: nftables 제어, 네트워크 탐지, 랜섬웨어/맬웨어 모니터링, fanotify, ARP/NDP 고정, DNS 시행. TCP/UDP 청취 소켓을 열지 않습니다.
roamswitch-server-daemon (서버) 루트(시스템 Type=notify) 모든 서버 권한 있는 작업: 인바운드 기본 삭제, SSH 및 관리 요새 보존, FIM(150개 이상의 중요한 바이너리 해시), 자율 SIGSTOP 동결 기능이 있는 Falco eBPF UNIX 소켓 리스너, 경고 발송.
roamswitch(CLI) 로그인 사용자(일부 작업에는 sudo가 필요함) 씬 클라이언트가 데몬 상태를 읽고 있습니다. Client Edition에서 /run/roamswitch/roamswitch.sock IPC를 사용하거나 Server Edition에서 --server, server, fimemergency-restore 하위 명령을 제공합니다.
roamswitch-mcp AI 클라이언트에 의해 생성됨 AI 에이전트의 프로그래밍 방식 상태 검색을 위한 읽기 전용 MCP 서버(stdio/JSON-RPC)입니다. MCP 설정을 참조하세요.
roamswitch-app 로그인 사용자 GTK GUI(클라이언트 에디션에만 해당). 헤드리스 환경에서는 필요하지 않습니다.

A 헤드리스 배포는 데몬 + roamswitch CLI(원하는 경우 roamswitch-mcp 추가)에서 실행됩니다. 모든 자율 방어 메커니즘은 GUI 없이 작동합니다.

상호 배타적인 패키지
Client Edition(roamswitch)과 Server Edition(roamswitch-server)은 상호 배타적인 패키지(Conflicts)입니다. 서버 환경에 roamswitch-server을 배포합니다.

2. 데몬(시스템 서비스)

클라이언트 에디션

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 엔트로피 + 카나리아)
  • 온액세스 악성 코드 검사(fanotify, 선택적으로 ClamAV)
  • ARP 스푸핑 모니터링 및 신뢰할 수 없는 네트워크에 대한 예방 게이트웨이 ARP/NDP 고정
  • 프로필당 커널 강화(sysctl / Yama / 코어 덤프 / /tmp noexec)
  • 위협 방지 DNS 적용(dns_enabled + dns_scope)
  • 피싱 차단을 위한 링크 가드(NFQUEUE)
  • /run/roamswitch/state.json에 대한 런타임 상태 출력

서버 에디션

sudo systemctl status  roamswitch-server.service      # 가동 상태
sudo systemctl restart roamswitch-server.service      # 재시작
sudo systemctl reload  roamswitch-server.service      # 설정 파일 재로드
journalctl -u roamswitch-server.service -f            # 로그 추적

3. CLI 명령 참조

기본 구문: roamswitch <command> [options]. 인수 없이 실행하면 기본값은 status입니다. 출력 언어는 자동으로 OS 로케일(LC_ALL / LC_MESSAGES / LANG)을 따릅니다.

명령 권한 설명
status [--server](별칭 report / server-status) 사용자 보안 상태 평가(클라이언트에 대한 검사 24개, --server에 대한 검사 30개), 0~100점, 등급 및 항목별 권장 사항
server [config|setup|test-notify|restart|ebpf] 사용자/루트 Server Edition 구성 관리, 대화형 설정 마법사 및 테스트 알림. ebpf(별칭 incidents)는 eBPF 런타임 가드의 현재 격리 상태와 감지된 인시던트 기록을 표시합니다
fim [verify|update] 사용자/루트 중요 경로 파일 무결성 모니터링 확인(verify) 및 기준 해시 데이터베이스 업데이트(update)
emergency-restore 뿌리 모든 긴급 eBPF/방화벽 격리를 해제하고 네트워크 기준을 복원합니다.
ports [-a|--all] 사용자 0.0.0.0, 인증되지 않은 DB 및 개발 서버의 수신 포트입니다. -a에는 루프백 전용 포트가 포함됩니다.
guards 사용자 자동 방어 가드 상태(포트 이상, ARP, USB 저장소, 다운로드, DNS 위협, 카나리아, 개발 서버 격리기, Bluetooth)
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은 모든 외부 트래픽 삭제)
help (--help / -h) 사용자 도움말 표시(하위 명령 도움말의 경우 roamswitch <command> --help)
scan-packages [폴더...] 일반 설치된 OS 패키지(dpkg/pacman/dnf/zypper 자동 판별)를 알려진 CVE 맵과 대조합니다. 폴더 인자를 전달하면 해당 프로젝트의 종속성(npm/PyPI/crates.io 등 7개 에코시스템) 잠금 파일도 대상에 추가됩니다. 네트워크 활동은 전혀 발생하지 않습니다
scan-vulns [--confirm] 일반 active_vuln_scan_enabled: true(기본 OFF)인 경우에만 127.0.0.1 한정으로 Redis/Memcached/MongoDB/dockerd의 무인증 도달 확인, 감지된 개발 서버에 대한 CORS 설정 오류·경로 탐색·오픈 리다이렉트 진단, SMTP 오픈 릴레이 진단, Telnet/FTP/SSH 실증형 노출 진단을 실행합니다. --confirm 없이는 드라이런입니다
notifications(별칭 notification-history) 사용자 RoamSwitch가 보낸 알림(로그 감사 이상, ClickFix 탐지 등)의 기록(최근 1주일, 최신순)
frozen [list|resume <PID>|resume all] 사용자/root 각 가드(랜섬웨어 고속 암호화 감지·카나리 파일 변조·커널 취약점 공격 감지)가 SIGSTOP으로 동결 중인 프로세스를 나열하고, 오탐이었다면 해제(SIGCONT). 동결은 강제 종료가 아니므로 해제하면 멈춘 지점부터 그대로 재개된다. resume all은 전체 해제. root 소유 프로세스 해제에는 sudo 필요
resource-guard (별칭 leak-guard) 사용자 리소스 고갈·프로세스 이상 탐지 가드(Server Edition 전용)의 탐지 인시던트 이력. 네트워크 공개 서비스의 지속적인 RSS 증가(메모리 누수/DoS)나 크래시 루프를 신뢰도 등급과 함께 표시
timeline (별칭 incident-timeline) 사용자 링크 가드(ARP 스푸핑)·랜섬웨어 카나리아·eBPF 런타임 가드·리소스 가드의 탐지를 하나의 시계열로 통합. 프로세스 계보와 MITRE ATT&CK 태그 포함(실험적)
xdp-gate [status|enable|disable] 사용자/root XDP 부팅 시 게이트(실험적)의 상태 표시 및 활성화·비활성화. statusroamswitch-xdp-gate.service의 활성 여부와 현재 프로그램 상태를 표시. 기본값은 비활성
sensor [key|list|pair|unpair|request-audit|results] 일반/root 별도 저장소의, 범용 기기에 설치하는 네트워크 센서 「RoamSwitch Sensor」와의 페어링 코드 방식 상호 신뢰. pair --addr <IP> --code <코드>로 Sensor 측이 발급한 코드를 사용해 페어링(Sensor는 고정 IP로 운용되는 것을 전제로 합니다), key로 자신의 공개 키/주소를 표시, unpair로 페어링 해제, request-audit로 Sensor에 능동적 취약점 감사를 요청(결과는 results로 취득). sensor_pairing_enabled: true(기본 OFF)가 필요합니다. 자세한 내용은 Sensor 운영 매뉴얼을 참조하십시오
port-scan (alias portscan) 일반 착신 포트 스캔 탐지 가드의 탐지 이력(송신 IP, 자동 차단 여부·지속 시간)을 표시합니다. 신규 미지 포트 「노출」을 탐지하는 port-anomaly와는 별개의 기능입니다

sudo roamswitch status                 # 클라이언트 종합 진단(24개 항목)
sudo roamswitch status --server        # 서버판 종합 진단(30개 항목)
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             # 세이프티 타이머 확인 응답(자동 복귀 중지)
roamswitch canary                      # 카나리아 인시던트 기록
roamswitch port-anomaly                # 미확인 포트 노출 가드 인시던트 기록
roamswitch server ebpf                 # eBPF 가드의 격리 상태와 인시던트 기록
roamswitch notifications               # 최근 1주일간의 알림 기록
roamswitch frozen                      # 동결 중인 프로세스 목록
sudo roamswitch frozen resume 12345    # 오탐 프로세스를 해제
sudo roamswitch sensor pair --addr 192.168.1.50 --code AB3DFGH2  # 페어링 코드로 Sensor와 페어링
sudo roamswitch sensor key             # 자신의 공개 키/주소를 표시
roamswitch port-scan                   # 포트 스캔 탐지 이력

서버 에디션 데몬은 root 권한으로 실행되므로, nftables 규칙 세트를 읽거나 프로세스 소유자를 확인해야 하는 명령(status / status --server / ports -a)은 sudo 없이 실행하면 부정확한 결과(잘못된 '비활성' 판정이나 프로세스 정보 누락)를 반환합니다. 설정을 변경하는 명령(sharing / fim update / airgap / emergency-restore 등)도 마찬가지로 sudo가 필요합니다. 그 외의 읽기 전용 명령은 sudo 없이도 정확하게 동작합니다.

주의사항 및 제한사항
  • 하위 명령 관련 도움말은 roamswitch <command> --help.
  • 을 통해 지원됩니다.
  • 기계 판독 가능 상태는 MCP(§6) 또는 /run/roamswitch/state.json(§5)을 통해 쿼리되어야 합니다.
  • Client Edition에는 방화벽 프로필을 강제 적용하는 직접적인 명령이 없습니다. 데몬은 네트워크 신뢰를 기반으로 이를 자율적으로 관리합니다. 레벨을 강제하려면 config.json에서 manual_override를 구성하거나 set_security_level IPC를 직접 호출하십시오(§5).
  • status는 점수에 관계없이 종료 코드 0을 반환합니다. 자동화된 모니터링을 위해 점수 라인을 구문 분석합니다(§7 참조).

4. 구성 파일

클라이언트 에디션(~/.config/roamswitch/config.json)

데몬은 루트로 실행되며 찾은 첫 번째 유효한 파일(또는 루트 전용 환경에서는 /root/.config/roamswitch/config.json)을 사용하여 /home/*/.config/roamswitch/config.json을 검색합니다.

열쇠 유형 / 기본값 설명
language문자열 / OS 로케일UI 및 CLI 언어(ja / en / ko / zh-Hans / zh-Hant / de / fr / es / it / pt-PT)
trusted_networks[{name, mac, level}]신뢰할 수 있는 네트워크 mac은 게이트웨이 MAC이고, levelopen / balanced / lockdown입니다.
away_protection_level문자열 / lockdown알 수 없는 네트워크의 기본 프로필
manual_override문자열 / 널강제 open / balanced / lockdown(자동의 경우 null)
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)
entropy_freeze_enabled부울 / true랜섬웨어 급속 정지(SIGSTOP)
mount_hardening_enabled부울 / true/tmp/dev/shmnoexec(비공개 프로필에 적용됨)
yama_memory_protect_enabled부울 / trueYama ptrace 제한 사항
usb_storage_guard_enabled / usb_keyboard_guard_enabled부울 / falseUSB 저장소/BadUSB 키보드 가드(기본적으로 꺼져 있음)
usb_zero_trust_enabled부울 / falseUSB 버스 authenticate_default=0
bluetooth_guard_enabled부울 / false신뢰할 수 없는 네트워크에서 Bluetooth 라디오 비활성화
sharing_service_control_enabled부울 / trueSSH / 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 / falsescan-vulns 실행을 허용합니다(기본 OFF). 127.0.0.1 한정 도달 확인 프로브를 전송하므로 명시적인 옵트인이 필요합니다
pkgcve_watched_folders[string]GUI판의 종속성 대조가 대상으로 하는 프로젝트 폴더 목록(절대 경로). CLI의 scan-packages는 이 설정을 참조하지 않고 명령줄 인자로 전달된 폴더만 대상으로 합니다
sensor_pairing_enabledbool / falseRoamSwitch Sensor와의 페어링 코드 방식 상호 신뢰를 허가합니다(기본 OFF). 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자동 차단의 지속 시간(초)
원격 SSH 주의
sharing_service_control_enabled: true을(를) 사용하면 신뢰할 수 없는 네트워크에 연결하면 활성 SSH 세션의 연결이 끊어집니다. 헤드리스 서버에서는 비활성화된 상태로 둡니다.

서버 에디션(/etc/roamswitch/server.conf)

Server Edition은 엄격한 권한(0600, 루트 전용)이 있는 INI 형식 구성 파일을 사용합니다. Server Edition 운영 설명서를 참조하세요.

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 통합 소켓(루트:루트, 모드 0660, Falco는 기본적으로 루트로 실행되어 제로 구성 직접 소켓 쓰기가 가능함)
/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_baseline.db서버FIM SHA-256 기준 해시 데이터베이스
~/.local/share/roamswitch/quarantine/둘 다검역소(0700, 샘플 0400) + .metadata.json

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(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)에서 JSON-RPC를 통해 읽기 전용 도구를 노출합니다.

외부 네트워크 통신을 사용하지 않고 로컬로 데몬 소켓에 연결하거나 roamswitch-core을 호출합니다. MCP 설정 가이드를 참조하세요.

7. 자동화 레시피

일일 크론 상태 확인 → 점수가 임계값 미만으로 떨어지면 이메일을 보냅니다.

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

경고 대기열 모니터링(poll 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은 "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가 level: open을(를) 사용하여 trusted_networks에 등록되어 있는지 확인하세요.
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. 참고자료