5P by GN⁺ 3일전 | ★ favorite | 댓글 1개
  • Snitch는 기존 ssnetstat보다 사람이 보기 쉬운 네트워크 연결 검사 도구로, 터미널 UI(TUI)와 스타일링된 표 형식을 지원
  • 실시간 인터랙티브 화면 또는 한 번에 출력되는 표 형식으로 연결 상태를 표시하며, TCP/UDP, 리스닝, 연결됨 상태 등 다양한 필터 제공
  • JSON·CSV 출력, DNS/서비스명 해석, 프로세스 감시 및 종료, 자동 업데이트 기능을 포함
  • Homebrew, Go, Nix, Arch Linux, Shell Script, Binary 등 여러 설치 방법을 지원하며, macOS의 Gatekeeper 경고 자동 해제 기능 포함
  • 개발자와 시스템 관리자가 네트워크 연결을 직관적으로 모니터링하고 스크립트 자동화에 활용할 수 있는 유용한 도구

개요

  • Snitch는 네트워크 연결을 시각적으로 탐색할 수 있는 도구로, ssnetstat의 대체 도구로 설계
  • TUI 인터페이스 또는 스타일링된 표 출력을 통해 연결 상태를 표시
  • Linux와 macOS에서 동작하며, 루트 권한 또는 CAP_NET_ADMIN 권한이 필요할 수 있음

설치 방법

  • Homebrew: brew install snitch 명령으로 설치 가능
  • Go: go install github.com/karol-broda/snitch@latest
  • Nix/NixOS: nix-env -iA nixpkgs.snitch 또는 flake 입력으로 추가 가능
  • Arch Linux (AUR) : yay -S snitch-bin 또는 paru -S snitch-bin
  • Shell Script: curl -sSL ... | sh 명령으로 설치, 기본 경로는 ~/.local/bin 또는 /usr/local/bin
    • macOS에서는 설치 스크립트가 자동으로 quarantine 속성 제거
  • Binary 다운로드: GitHub Releases에서 Linux(.tar.gz, .deb, .rpm, .apk) 및 macOS(.tar.gz) 버전 제공

빠른 시작

  • snitch 실행 시 인터랙티브 TUI 실행
  • snitch -l리스닝 소켓만 표시, snitch ls표 형식으로 출력 후 종료
  • snitch ls -t -eTCP 연결된 세션만 표시, snitch ls -p파싱 가능한 단순 출력

주요 명령

  • snitch / snitch top : 실시간 갱신되는 연결 목록 표시
    • 옵션: -l(리스닝), -t(TCP), -e(연결됨), -i(갱신 주기)
    • 키 바인딩: j/k 이동, t/u TCP·UDP 전환, K 프로세스 종료, / 검색, q 종료 등
  • snitch ls : 한 번에 표 출력, 터미널 높이를 초과하면 자동으로 pager 사용
    • 출력 형식: 기본 표, -o json, -o csv, -p(단순), --no-headers(헤더 제거)
  • snitch json : JSON 형식 출력으로 스크립트 활용 가능
  • snitch watch : 일정 간격으로 JSON 프레임 스트리밍
  • snitch upgrade : 버전 확인 및 자동 업데이트

필터 및 해석 옵션

  • 공통 플래그: -t(TCP), -u(UDP), -l(리스닝), -e(연결됨), -4(IPv4), -6(IPv6)
  • DNS 및 서비스명 해석:
    • --resolve-addrs, --resolve-ports, --no-cache 옵션 지원
    • 병렬 DNS 조회 및 캐싱 수행, --no-cache로 캐시 비활성화 가능
  • 세부 필터링: key=value 형식으로 프로세스명, 포트, 상태 등 지정 가능
    • 예: snitch ls proto=tcp state=listen, snitch ls proc=nginx

출력 형식

  • 기본 표 출력: 프로세스명, PID, 프로토콜, 상태, 로컬 주소·포트 표시
  • 단순 출력(-p) : 파싱 가능한 텍스트 형태
  • JSON/CSV 출력: 스크립트 자동화 및 로그 분석에 활용 가능

설정 및 환경 변수

  • 설정 파일: ~/.config/snitch/snitch.toml
    • numeric, dns_cache, theme(auto/dark/light/mono) 설정 가능
  • 환경 변수:
    • SNITCH_THEME, SNITCH_RESOLVE, SNITCH_DNS_CACHE, SNITCH_NO_COLOR, SNITCH_CONFIG 등 지원

시스템 요구사항

  • Linux 또는 macOS 환경 필요
  • Linux: /proc/net/*에서 데이터 읽기, 전체 프로세스 정보에는 루트 또는 CAP_NET_ADMIN 권한 필요
  • macOS: 시스템 API 사용, 전체 프로세스 정보에는 sudo 필요
Hacker News 의견들
  • lsof와 ss의 기본 설정이 너무 불편함
    ss는 기본 출력에서 송수신 큐 크기 같은 드물게 필요한 정보는 보여주면서, 정작 소켓이 어떤 애플리케이션에 속하는지는 안 보여줌
    또 기본적으로 리스닝 소켓을 생략하는데, 이런 도구의 주요 용도는 바로 그걸 보는 것임
    기본값을 잘 고르는 게 어렵다는 건 알지만, 이건 거의 모든 걸 잘못 고른 사례임
    • 완전히 동의함. Unix 도구들은 장기적으로 합리적인 기본값을 유지하기 어려운 구조적 한계가 있음
      시간이 지나면서 사용자와 사용 사례가 변하니 기본값도 바뀌어야 하지만, Unix 도구들은 출력 형식이 곧 API라서 바꾸면 하위 호환성 문제가 생김
      예를 들어 ps aux가 긴 프로세스 이름을 7자 정도로 잘라버리는 것도 그런 이유임
      관련 글: sh and the separation of data and representation
    • 지금은 UX에 대한 이해가 훨씬 깊어졌음. 70년대 개발자들이 ss나 lsof를 만들 때는 이런 사용성 문제를 잘 몰랐던 것 같음
    • 요즘의 fd, ag, rg 같은 신세대 CLI 도구들도 비슷한 문제를 겪음
      속도나 기능보다 직관적인 사용성이 훨씬 중요하다고 생각함
    • netstat -utanss -utan이 거의 같은 정보를 보여주는 것 같음
  • 제목을 보고 처음엔 Mac용 네트워크 모니터링 툴 Little Snitch 얘기인 줄 알았음
    이름이 겹치니 다른 이름을 쓰는 게 좋을 수도 있음
    Little Snitch 공식 사이트
    • Linux용 OpenSnitch라는 클론도 있음
    • 이름 괜찮다고 생각함. 기존 Little Snitch가 있다고 해서 꼭 바꿀 필요는 없다고 봄
    • 이름을 바꿀 필요까진 없을 듯함. Little Snitch와는 용도가 완전히 다름
      Snitch는 단순히 ss/netstat 데이터를 터미널에서 보기 좋게 보여주는 도구임
    • 와, 멋지네. 혹시 Windows나 Linux용 대체 도구도 있을까 궁금함
    • 나도 처음엔 그 생각했음. 이름이 너무 부끄럽게 느껴짐
      같은 IT 분야에 이미 비슷한 이름의 툴이 있는데 왜 굳이 또 그걸 쓰는지 이해가 안 됨
  • 데모의 recording-as-code 방식이 흥미로움
    데모 링크
    • 고마움 :) 다른 프로젝트에서는 이런 접근을 거의 못 봤음
  • 요즘 TUI 기반 도구가 늘어나는 게 너무 좋음. 이 프로젝트도 멋져 보여서 꼭 써볼 생각임
    • 근데 TUI가 GUI만큼 접근성이 좋을까 궁금함
      GUI 라이브러리는 시각장애인 등 사용자를 위한 다양한 기능이 있는데, TUI는 그런 부분이 부족할 수도 있음
  • ss에 익숙해져서 잘 쓰고 있음. 다만 송수신 큐 숫자는 안 보고 싶음
    화면 폭이 너무 넓어져서 노트북에서 세로 분할하면 거의 안 들어감
    Snitch는 설치하지 않을 생각임. ss는 이미 모든 서버에 기본 설치되어 있고, TUI는 필요하지 않음
    Snitch는 개인용이나 워크스테이션용으로는 괜찮겠지만, 서버에서는 ss가 기본임
    • 맞음. 서버에서는 ss가 기본으로 깔려 있으니 그대로 쓰면 됨
      Snitch는 워크스테이션이나 homelab 디버깅용으로 더 적합함
      송수신 큐는 아직 표시하지 않지만, 나중에 compact 모드나 토글로 추가할 예정임
  • 보기엔 괜찮지만, 나는 오래전부터 iptraf-ng를 써왔고 여전히 약간 더 낫다고 느낌
    혹시 데모 영상에서 내가 놓친 기능이 있을까?
    • 고마움! Snitch는 트래픽 모니터링보다는 ss/netstat 대체에 가까움
      트래픽 모니터링 기능은 계획 중이지만 아직 구현되지 않음
  • 이름은 마음에 안 들지만, TUI로 연결 상태를 모니터링하는 건 정말 잘 어울림
    • 고마움. 혹시 이름의 어떤 부분이 마음에 안 드는지 궁금함
  • Go로 설치하려 했는데 아래 오류가 발생함
    go install github.com/karol-broda/snitch@latest
    go: github.com/karol-broda/snitch@latest: version constraints conflict:
    module declares its path as: snitch
    but was required as: github.com/karol-broda/snitch
    
    • 모듈 선언을 URL 없이 이름만 써서 생긴 문제였음. 몇 시간 전에 수정됨
      Go가 module barename을 허용하는 게 신기함. 개인 프로젝트에서도 결국 URL을 쓰게 되는데, 좋지 않은 패턴이라고 생각함
    • 수정은 됐지만 아직 릴리스에는 반영되지 않음
      커밋 링크
    • 이제 수정하고 릴리스까지 완료했음. @latest로 빌드하면 잘 동작할 것임
  • 이런 도구들이 숙련된 공격자에게 얼마나 유용할지 항상 궁금했음
    예를 들어, 악성코드가 일정 시간 대기하거나 사용자가 네트워크 활동 중일 때만 C&C와 통신하도록 설계하면 탐지가 어려울 것 같음
    • 최소한 이런 도구들은 /proc을 직접 파싱하지 않는 게 좋음
      LD_PRELOAD 루트킷은 libc 함수 출력을 조작해 활동을 숨기기 때문임
      ss는 그나마 조금 더 신뢰할 수 있고, Snitch는 Go로 작성되어 libc를 사용하지 않으니 LD_PRELOAD 루트킷에도 강할 가능성이 있음
      다만 이런 도구들은 악성 트래픽 탐지용이 아니라 로컬 디버깅용
      참고 자료: decloaker, arxiv 논문, ACM 논문, proc 구조 설명
    • 맞음. Snitch는 보안 탐지용이 아니라 로컬 디버깅/점검용
      숙련된 공격자는 어차피 정상 트래픽에 섞여서 동작할 수 있음
    • 이런 도구들은 적대적 환경용이 아님
      실제 공격자 대응용 네트워크 도구들도 완벽하지 않음 (검색어: bro vantage point problem)
  • 각 소켓/프로세스별로 현재 및 누적 전송 속도를 보여주는 기능이 있으면 좋겠음
    지금은 jnettop을 쓰지만 UI가 마음에 안 듦
    • 그 기능은 향후 버전에서 추가 예정