
rustnet v1.5.0
터미널에서 프로세스별 네트워크 모니터링과 심층 패킷 검사(DPI)를 제공합니다. 크로스 플랫폼이며 샌드박스 환경에서 실행됩니다.
RustNet
터미널용 프로세스별 네트워크 모니터링: 딥 패킷 검사가 포함된 실시간 TCP, UDP, QUIC 연결, 기본적으로 샌드박싱됨
머신이 만드는 모든 연결, 누가 소유하는지, 어떤 프로토콜을 사용하는지 실시간으로 확인하세요. tcpdump, X11 포워딩, root 파이핑이 필요 없습니다.
기능
- 프로세스별 귀속: 모든 TCP, UDP, QUIC 연결을 소유 프로세스에 매핑합니다. Linux에서는 eBPF, macOS에서는 PKTAP, Windows에서는 자동 IP Helper 폴백이 포함된 ETW, FreeBSD에서는 네이티브 API를 사용합니다. 세부 정보에는 PID, 실행 파일, 사용자/그룹 이름, 일치 신뢰도, 모든 플랫폼에서 제한된 상위 프로세스 체인이 포함됩니다. Wireshark와 tcpdump는 이 작업을 수행할 수 없으며,
netstat/ss는 실시간 상태를 표시할 수 없습니다. - 딥 패킷 검사: 외부 디섹터 없이 HTTP, SNI가 포함된 HTTPS/TLS, DNS, SSH, FTP, QUIC, MQTT, BitTorrent, STUN, NTP, mDNS, LLMNR, DHCP, SNMP, SSDP, NetBIOS를 식별합니다.
- 주석이 포함된 PCAPNG 내보내기:
--pcapng-export는 프로세스, PID, 방향, DPI/SNI, GeoIP를 패킷별 주석으로 포함한 Wireshark 호환 캡처를 작성합니다. Wireshark에서 열면 사후 처리 없이 모든 패킷에 소유 프로세스가 이미 표시됩니다. 오프라인 상관 분석을 위한 JSONL 사이드카가 포함된 기존--pcap-export도 사용할 수 있습니다. - 보안 샌드박싱: Landlock(Linux 5.13+), Seatbelt(macOS), 토큰 권한 강등 + 작업 개체 자식 프로세스 차단(Windows). libpcap이 초기화된 직후 권한을 강등합니다. SECURITY.md를 참조하세요.
- 네트워크 분석: TCP, QUIC 핸드셰이크, DNS 응답, ICMP 에코의 실시간 왕복 시간(RTT)과 TCP 재전송, 순서 어긋남, 빠른 재전송 감지를 제공합니다.
- 스마트 연결 수명 주기: 흰색 → 노란색 → 빨간색 오래됨 표시기가 있는 프로토콜 인식 타임아웃.
t를 눌러 포렌식 분석을 위해 과거(닫힌) 연결을 계속 표시할 수 있습니다. - Vim/fzf 스타일 필터링:
port:,src:,dst:,sni:,process:,state:,proto:및/(?i)pattern/정규식을 지원합니다. - GeoIP 보강: 로컬 MaxMind GeoLite2를 통한 국가 조회. 네트워크 호출 없음.
- LAN 장치 식별: 링크상의 피어와 게이트웨이에 대한 MAC 주소와 벤더(내장 IEEE OUI 데이터베이스에서 가져옴). ARP 트래픽에서 수동적으로 학습하여 세부 정보 창에 표시합니다.
- Kubernetes 귀속(선택적
kubernetes기능): 연결을 해당 파드, 네임스페이스, 컨테이너에 매핑하여 세부 정보 창, JSON/PCAPNG 내보내기,pod:,ns:,container:필터에 표시합니다. 공식 Docker 이미지에서 활성화되어 있으며, 클러스터에서는 kubectl-rustnet 플러그인을 사용해 임시 디버그 파드로 실행할 수 있습니다. USAGE.md를 참조하세요. - 크로스 플랫폼: Linux, macOS, Windows, FreeBSD.
왜 RustNet인가?
RustNet은 간단한 연결 도구(netstat, ss)와 패킷 분석기(Wireshark, tcpdump) 사이의 간극을 메웁니다:
- 프로세스 귀속: 각 연결을 소유한 애플리케이션을 확인하세요. Wireshark는 패킷만 볼 수 있고 소켓은 볼 수 없기 때문에 이를 제공할 수 없습니다.
- 연결 중심 보기: 연결별 상태, 대역폭, 프로토콜을 실시간으로 추적
- SSH 친화적: TUI가 SSH를 통해 작동하므로 X11 포워딩이나 트래픽 캡처 없이 원격 서버에서 무슨 일이 일어나고 있는지 빠르게 확인할 수 있습니다
RustNet은 패킷 캡처 도구를 보완합니다. RustNet으로 무엇이 연결을 만드는지 확인하세요. Wireshark에서 직접 검사해야 한다면 --pcapng-export가 PID/프로세스 컨텍스트가 포함된 실시간 베스트 에포트 패킷 주석을 작성합니다. 정리 시점의 상관 분석에는 --pcap-export와 JSONL 사이드카, 선택적 scripts/pcap_enrich.py를 사용하세요. 자세한 내용은 PCAP 내보내기 및 유사 도구와의 비교를 참조하세요.
ratatui, libpcap, eBPF(libbpf-rs), DashMap, crossbeam, ring, MaxMind GeoLite2, Landlock 기반으로 구축되었습니다. 전체 종속성 분석은 ARCHITECTURE.md를 참조하세요.
eBPF 강화 프로세스 식별(Linux 기본값)
RustNet은 Linux에서 기본적으로 커널 eBPF 프로그램을 사용하여 향상된 성능과 낮은 오버헤드의 프로세스 식별을 제공합니다.
프로세스 이름:
- eBPF는 실행 중인 스레드 이름 대신 프로세스 그룹 리더의 TGID와
comm이름(16자로 제한된 커널 필드)을 기록하므로 다중 스레드 애플리케이션은 "Socket Thread" 같은 스레드 이름 대신 메인 프로세스 이름을 표시합니다 - 그런 다음 RustNet은
/proc/<tgid>/comm을 통해 현재 이름을 다시 확인하고, 실행 파일 이름에서 comm으로 잘린 이름을 복구하며(예: "chromium-browse"가 "chromium-browser"가 됨), 세부 정보 뷰에 표시되는 전체 실행 파일 경로를 확인합니다 - 이 강화 단계가 실행되기 전에 종료되는 수명이 짧은 프로세스는 eBPF로 기록된 16자 이름을 유지합니다
폴백 동작:
- eBPF를 로드하지 못하거나 권한이 충분하지 않으면 RustNet은 자동으로 표준 procfs 기반 프로세스 식별로 폴백합니다
- 표준 모드는 procfs 스캔을 통해 동일한 방식으로 이름을 확인하지만 CPU 오버헤드가 더 높습니다
- eBPF는 기본적으로 활성화되어 있으며 특별한 빌드 플래그가 필요하지 않습니다
eBPF를 비활성화하고 procfs 전용 모드를 사용하려면 다음과 같이 빌드하세요:
cargo build --release --no-default-features
기술 정보는 ARCHITECTURE.md를 참조하세요.
프로세스 활동 및 인터페이스 모니터링
RustNet은 프로세스 수준 트래픽 집계와 실시간 네트워크 인터페이스 통계를 결합합니다:
- 개요 탭: 현재 속도, 오류, 드롭이 포함된 활성 인터페이스를 표시합니다
- 활동 탭(
3누르기): 유지 및 롤링 트래픽, 속도, 점유율, 연결, 대상지를 포함하여 Egress(TX) 또는 Ingress(RX) 기준으로 프로세스 순위를 매깁니다 - 보안 워크플로: Egress로 정렬하여 예상치 못한 업로더를 식별한 다음, 연결이 닫힌 후에도 해당 업로더의 상위 원격 피어와 유지된 트래픽을 검사합니다
- 인터페이스 세부 정보(활동에서
i누르기): 모든 인터페이스의 원래 종합 메트릭을 표시합니다 - 크로스 플랫폼: Linux(sysfs), macOS/FreeBSD(getifaddrs), Windows(GetIfTable2 API)
- 스마트 필터링: Windows에서 가상/필터 어댑터를 자동으로 제외합니다
인터페이스 통계 해석 및 플랫폼별 동작에 대한 자세한 문서는 USAGE.md를 참조하세요.
사용 가능한 메트릭:
- 총 바이트 및 패킷(RX/TX)
- 오류 카운터(수신 및 전송)
- 패킷 드롭(큐 오버플로우)
- 충돌(레거시, 최신 네트워크에서는 거의 사용되지 않음)
통계는 백그라운드 스레드에서 2초마다 수집되며 성능 영향이 최소화됩니다.
스크린샷
| 개요 실시간 통계와 스파크라인이 포함된 연결 테이블 ![]() | 세부 정보 연결별 SNI, 암호화, GeoIP, DPI ![]() |
| 그래프 트래픽 차트, 앱 분포, 상위 프로세스 ![]() | 활동 프로세스 Egress/Ingress, 60초 커버리지, 귀속 정보, 원격 피어 ![]() |
빠른 시작
설치
Homebrew (macOS / Linux):
brew install rustnet
Ubuntu (22.04 LTS+) / Linux Mint 21+ / Pop!_OS 22.04+:
sudo add-apt-repository ppa:domcyrus/rustnet
# on Pop!_OS: sudo apt-manage add ppa:domcyrus/rustnet
sudo apt update && sudo apt install rustnet
Fedora (42+):
sudo dnf copr enable domcyrus/rustnet
sudo dnf install rustnet
openSUSE Tumbleweed:
sudo zypper addrepo https://download.opensuse.org/repositories/home:/domcyrus:/rustnet/openSUSE_Tumbleweed/home:domcyrus:rustnet.repo
sudo zypper refresh
sudo zypper install rustnet
Arch Linux:
sudo pacman -S rustnet
Nix / NixOS:
nix-shell -p rustnet
# Then inside the shell: sudo rustnet
crates.io에서:
cargo install rustnet-monitor
Windows (Chocolatey):
# Run in Administrator PowerShell
# Requires Npcap (https://npcap.com) installed with "WinPcap API-compatible Mode" enabled
choco install rustnet
기타 플랫폼:
- FreeBSD: rustnet-bsd releases에서 다운로드
- Docker, 소스 빌드, 기타 Linux 배포판: 자세한 지침은 INSTALL.md를 참조하세요
RustNet 실행
패킷 캡처에는 상승된 권한이 필요합니다:
# Quick start (all platforms)
sudo rustnet
# Linux: Grant capabilities to run without sudo (recommended)
sudo setcap 'cap_net_raw,cap_bpf,cap_perfmon+eip' $(which rustnet)
rustnet
일반 옵션:
rustnet -i eth0 # Specify network interface
rustnet --show-localhost # Show localhost connections
rustnet --no-resolve-dns # Disable reverse DNS lookups (enabled by default)
rustnet -r 500 # Set refresh interval (ms)
rustnet --theme tokyo-night # Theme: muted (default), vivid, catppuccin-mocha, tokyo-night, gruvbox, nord
rustnet --pcapng-export capture.pcapng # Annotated PCAPNG for Wireshark
테마 및 색상별 재정의는 ~/.config/rustnet/config.toml에서도 설정할 수 있으며, --theme가 우선합니다. 스키마는 USAGE.md를 참조하세요.
자세한 권한 설정은 INSTALL.md, 전체 옵션은 USAGE.md를 참조하세요.
캐퍼빌리티를 설정했는데도 TUI에 여전히
eBPF unavailable이 표시되면 문제 해결 섹션의 캐퍼빌리티 설정에도 eBPF를 사용할 수 없음을 참조하세요.
키보드 컨트롤
| 키 | 동작 |
|---|---|
q | 종료(두 번 누르면 확인) |
Ctrl+C | 즉시 종료 |
x | 모든 연결 지우기(두 번 누르면 확인) |
Tab 또는 ] | 다음 탭 |
Shift+Tab 또는 [ | 이전 탭 |
1–5 | 개요 / 세부 정보 / 활동 / 그래프 / 도움말로 이동 |
↑/k ↓/j | 위/아래로 이동 |
g G | 첫 번째/마지막 연결로 이동 |
Enter | 연결 세부 정보 보기 |
Esc | 뒤로 가기 또는 필터 지우기 |
c | 원격 주소 복사 |
p | 서비스 이름/포트 전환 |
d | 개요에서 호스트 이름/IP 또는 활동에서 Egress/Ingress 전환 |
s S | 정렬 열 순환 / 방향 전환 |
a | 프로세스 그룹화 전환 |
Space | 프로세스 그룹 펼치기/접기 |
←/→ 또는 h/l | 그룹 접기/펼치기 |
PageUp/PageDown 또는 Ctrl+B/F | 페이지 탐색 |
t | 과거(닫힌) 연결 표시 전환 |
i | 개요에서 시스템 정보 또는 활동에서 인터페이스 세부 정보 전환 |
r | 보기 재설정(그룹화, 정렬, 필터) |
/ | 필터 모드 진입 |
h | 도움말 전환 |
자세한 키보드 컨트롤과 탐색 팁은 USAGE.md를 참조하세요.
필터링 및 정렬
빠른 필터링 예시:
/google # Search for "google" anywhere
/port:443 # Filter by port
/process:firefox # Filter by process
/state:established # Filter by connection state
/dport:443 sni:github.com # Combine filters
정렬:
s를 눌러 정렬 가능한 열(프로세스, 주소, 서비스, 애플리케이션, 상태, 대역폭)을 순환합니다S(Shift+s)를 눌러 정렬 방향을 전환합니다- 대역폭 과다 사용자 찾기: "Bandwidth Total ↓"이 표시될 때까지
s를 누릅니다(업+다운 결합 속도 기준 정렬)
전체 필터링 구문과 정렬 가이드는 USAGE.md를 참조하세요.
고급 필터링 예시
키워드 필터:
port:44- "44"를 포함하는 포트(443, 8080, 4433)sport:80- "80"을 포함하는 소스 포트dport:443- "443"을 포함하는 대상 포트src:192.168- "192.168"을 포함하는 소스 IPdst:github.com- "github.com"을 포함하는 대상process:ssh- "ssh"를 포함하는 프로세스 이름sni:api- "api"를 포함하는 SNI 호스트 이름app:openssh- OpenSSH를 사용하는 SSH 연결state:established- 프로토콜 상태별 필터proto:tcp- 프로토콜 유형별 필터
상태 필터링:
state:syn_recv- 반열린(Half-open) 연결(SYN 플러드 감지)state:established- 설정된 연결만state:quic_connected- 활성 QUIC 연결state:dns_query- DNS 쿼리 연결
결합 예시:
sport:80 process:nginx- 포트 80에서의 Nginx 연결dport:443 sni:google.com- Google로의 HTTPSprocess:firefox state:quic_connected- Firefox QUIC 연결dport:22 app:openssh state:established- 설정된 OpenSSH 연결
연결 수명 주기 및 시각적 표시기
RustNet은 연결을 제거하기 전에 스마트 타임아웃과 시각적 경고를 사용합니다:
시각적 오래됨 표시기:
- 흰색: 활성(타임아웃의 75% 미만)
- 노란색: 오래됨(타임아웃의 75-90%)
- 빨간색: 심각(타임아웃의 90% 초과)
프로토콜 인식 타임아웃:
- HTTP/HTTPS: 10분(keep-alive 지원)
- SSH: 30분(긴 세션)
- 일반 TCP 설정됨: 5분
- QUIC 연결됨: 3분(또는 피어의 전송 파라미터 유휴 타임아웃이 있는 경우 해당 값);
Initial/Handshaking: 60초 - DNS: 30초
- TCP CLOSED: 15초 보관 유예
예: HTTP 연결은 7.5분에 노란색, 9분에 빨간색으로 바뀌고 10분에 제거됩니다.
전체 타임아웃 세부 정보는 USAGE.md를 참조하세요.
문서
- INSTALL.md - 모든 플랫폼에 대한 자세한 설치 지침, 권한 설정, 문제 해결
- USAGE.md - 명령줄 옵션, 필터링, 정렬, 로깅을 포함한 전체 사용 가이드
- SECURITY.md - Landlock 샌드박싱과 권한 관리를 포함한 보안 기능
- ARCHITECTURE.md - 기술 아키텍처, 플랫폼 구현, 성능 세부 정보
- CONTRIBUTING.md - 기여 워크플로, 품질 요구 사항, 프로젝트 지침
- PROFILING.md - flamegraph 설정과 최적화 팁이 포함된 성능 프로파일링 가이드
- ROADMAP.md - 계획된 기능과 향후 개선 사항
- RELEASE.md - 유지관리자를 위한 릴리스 프로세스
기여
기여는 언제나 환영합니다! 기여 방법에 대한 지침은 CONTRIBUTING.md를 참조하세요.
이 프로젝트에 기여한 사람들의 목록은 CONTRIBUTORS.md를 참조하세요.
라이선스
이 프로젝트는 Apache License, Version 2.0에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
감사의 말
- 터미널 UI는 ratatui로 구축되었습니다
- 패킷 캡처는 libpcap으로 구동됩니다
tshark/wireshark/tcpdump,sniffnet,netstat,ss,iftop, bandwhich 같은 도구에서 영감을 받았습니다- 일부 코드는 바이브 코딩되었습니다(OMG) / LLM 신들이 함께하시길
문서 이전
더 나은 구성을 위해 일부 섹션이 전용 파일로 이동되었습니다:
- 권한 설정: 이제 INSTALL.md - 권한 설정에 있습니다
- 설치 지침: 이제 INSTALL.md에 있습니다
- 상세 사용법: 이제 USAGE.md에 있습니다
- 아키텍처 세부 정보: 이제 ARCHITECTURE.md에 있습니다



