# Snitch – 더 친숙한 ss/netstat 도구

> Clean Markdown view of GeekNews topic #25311. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=25311](https://news.hada.io/topic?id=25311)
- GeekNews Markdown: [https://news.hada.io/topic/25311.md](https://news.hada.io/topic/25311.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-12-25T03:37:09+09:00
- Updated: 2025-12-25T03:37:09+09:00
- Original source: [github.com/karol-broda](https://github.com/karol-broda/snitch)
- Points: 7
- Comments: 1

## Summary

**Snitch**는 `ss`나 `netstat`보다 훨씬 읽기 쉬운 **네트워크 연결 시각화 도구**로, 터미널 UI와 스타일링된 표 출력을 지원합니다. 실시간으로 연결 상태를 탐색하거나 JSON·CSV 형식으로 내보낼 수 있어, **시스템 관리자와 개발자가 네트워크 트래픽을 직관적으로 모니터링하고 자동화 스크립트에 통합**하기에 적합합니다. Linux와 macOS를 지원하며, Homebrew·Go·Nix 등 다양한 설치 경로를 제공합니다.

## Topic Body

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

---

### 개요
- Snitch는 **네트워크 연결을 시각적으로 탐색**할 수 있는 도구로, `ss`나 `netstat`의 대체 도구로 설계  
- **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 -e`는 **TCP 연결된 세션만 표시**, `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` 필요

## Comments



### Comment 48224

- Author: neo
- Created: 2025-12-25T03:37:10+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=46361229) 
- lsof와 ss의 **기본 설정이 너무 불편함**  
  ss는 기본 출력에서 송수신 큐 크기 같은 드물게 필요한 정보는 보여주면서, 정작 **소켓이 어떤 애플리케이션에 속하는지**는 안 보여줌  
  또 기본적으로 리스닝 소켓을 생략하는데, 이런 도구의 주요 용도는 바로 그걸 보는 것임  
  기본값을 잘 고르는 게 어렵다는 건 알지만, 이건 거의 모든 걸 잘못 고른 사례임
  - 완전히 동의함. Unix 도구들은 장기적으로 **합리적인 기본값을 유지하기 어려운 구조적 한계**가 있음  
    시간이 지나면서 사용자와 사용 사례가 변하니 기본값도 바뀌어야 하지만, Unix 도구들은 출력 형식이 곧 API라서 바꾸면 **하위 호환성 문제**가 생김  
    예를 들어 `ps aux`가 긴 프로세스 이름을 7자 정도로 잘라버리는 것도 그런 이유임  
    관련 글: [sh and the separation of data and representation](https://www.cgl.sh/blog/posts/sh.html)
  - 지금은 UX에 대한 이해가 훨씬 깊어졌음. 70년대 개발자들이 ss나 lsof를 만들 때는 이런 **사용성 문제**를 잘 몰랐던 것 같음
  - 요즘의 fd, ag, rg 같은 **신세대 CLI 도구들**도 비슷한 문제를 겪음  
    속도나 기능보다 **직관적인 사용성**이 훨씬 중요하다고 생각함
  - `netstat -utan`과 `ss -utan`이 거의 같은 정보를 보여주는 것 같음
- 제목을 보고 처음엔 Mac용 네트워크 모니터링 툴 **Little Snitch** 얘기인 줄 알았음  
  이름이 겹치니 다른 이름을 쓰는 게 좋을 수도 있음  
  [Little Snitch 공식 사이트](https://www.obdev.at/products/littlesnitch/index.html)
  - Linux용 **OpenSnitch**라는 클론도 있음
  - 이름 괜찮다고 생각함. 기존 Little Snitch가 있다고 해서 꼭 바꿀 필요는 없다고 봄
  - 이름을 바꿀 필요까진 없을 듯함. Little Snitch와는 **용도가 완전히 다름**  
    Snitch는 단순히 ss/netstat 데이터를 터미널에서 보기 좋게 보여주는 도구임
  - 와, 멋지네. 혹시 **Windows나 Linux용 대체 도구**도 있을까 궁금함
  - 나도 처음엔 그 생각했음. 이름이 너무 부끄럽게 느껴짐  
    같은 IT 분야에 이미 비슷한 이름의 툴이 있는데 왜 굳이 또 그걸 쓰는지 이해가 안 됨
- 데모의 **recording-as-code** 방식이 흥미로움  
  [데모 링크](https://github.com/karol-broda/snitch/tree/master/demo)
  - 고마움 :) 다른 프로젝트에서는 이런 접근을 거의 못 봤음
- 요즘 **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을 쓰게 되는데, **좋지 않은 패턴**이라고 생각함
  - 수정은 됐지만 아직 릴리스에는 반영되지 않음  
    [커밋 링크](https://github.com/karol-broda/snitch/commit/7fdb1ed477894f1fc6e02205456bba7fa7663728)
  - 이제 수정하고 릴리스까지 완료했음. `@latest`로 빌드하면 잘 동작할 것임
- 이런 도구들이 **숙련된 공격자**에게 얼마나 유용할지 항상 궁금했음  
  예를 들어, 악성코드가 일정 시간 대기하거나 사용자가 네트워크 활동 중일 때만 C&C와 통신하도록 설계하면 탐지가 어려울 것 같음
  - 최소한 이런 도구들은 /proc을 직접 파싱하지 않는 게 좋음  
    LD_PRELOAD 루트킷은 libc 함수 출력을 조작해 활동을 숨기기 때문임  
    ss는 그나마 조금 더 신뢰할 수 있고, Snitch는 Go로 작성되어 libc를 사용하지 않으니 **LD_PRELOAD 루트킷에도 강할 가능성**이 있음  
    다만 이런 도구들은 **악성 트래픽 탐지용이 아니라 로컬 디버깅용**임  
    참고 자료: [decloaker](https://github.com/gustavo-iniguez-goya/decloaker), [arxiv 논문](https://arxiv.org), [ACM 논문](https://dl.acm.org/doi/10.1145/3688808), [proc 구조 설명](https://ops.tips/blog/how-is-proc-able-to-list-pids/)
  - 맞음. Snitch는 **보안 탐지용이 아니라 로컬 디버깅/점검용**임  
    숙련된 공격자는 어차피 정상 트래픽에 섞여서 동작할 수 있음
  - 이런 도구들은 **적대적 환경용**이 아님  
    실제 공격자 대응용 네트워크 도구들도 완벽하지 않음 (검색어: *bro vantage point problem*)
- 각 소켓/프로세스별로 **현재 및 누적 전송 속도**를 보여주는 기능이 있으면 좋겠음  
  지금은 jnettop을 쓰지만 UI가 마음에 안 듦
  - 그 기능은 **향후 버전에서 추가 예정**임
