- Snitch là công cụ kiểm tra kết nối mạng dễ đọc hơn cho con người so với
ss hay netstat, hỗ trợ giao diện terminal UI (TUI) và định dạng bảng có kiểu dáng
- Hiển thị trạng thái kết nối qua màn hình tương tác thời gian thực hoặc định dạng bảng in ra một lần, đồng thời cung cấp nhiều bộ lọc như TCP/UDP, lắng nghe, đã kết nối
- Bao gồm các tính năng xuất JSON·CSV, phân giải DNS/tên dịch vụ, giám sát và kết thúc tiến trình, tự động cập nhật
- Hỗ trợ nhiều cách cài đặt như Homebrew, Go, Nix, Arch Linux, Shell Script, Binary, đồng thời có tính năng tự động gỡ cảnh báo Gatekeeper trên macOS
- Là công cụ hữu ích để nhà phát triển và quản trị viên hệ thống giám sát kết nối mạng một cách trực quan và dùng trong tự động hóa bằng script
Tổng quan
- Snitch là công cụ cho phép khám phá kết nối mạng theo cách trực quan, được thiết kế như công cụ thay thế cho
ss hoặc netstat
- Hiển thị trạng thái kết nối thông qua giao diện TUI hoặc đầu ra bảng có định dạng
- Chạy trên Linux và macOS, và có thể cần quyền root hoặc quyền CAP_NET_ADMIN
Cách cài đặt
- Homebrew: có thể cài bằng lệnh
brew install snitch
- Go:
go install github.com/karol-broda/snitch@latest
- Nix/NixOS:
nix-env -iA nixpkgs.snitch hoặc thêm dưới dạng input flake
- Arch Linux (AUR) :
yay -S snitch-bin hoặc paru -S snitch-bin
- Shell Script: cài bằng lệnh
curl -sSL ... | sh, đường dẫn mặc định là ~/.local/bin hoặc /usr/local/bin
- Trên macOS, script cài đặt sẽ tự động xóa thuộc tính quarantine
- Tải binary: GitHub Releases cung cấp bản cho Linux (.tar.gz, .deb, .rpm, .apk) và macOS (.tar.gz)
Bắt đầu nhanh
- Chạy
snitch để mở TUI tương tác
snitch -l chỉ hiển thị socket đang lắng nghe, còn snitch ls sẽ in ra dạng bảng rồi thoát
snitch ls -t -e chỉ hiển thị các phiên TCP đã kết nối, còn snitch ls -p cho đầu ra đơn giản có thể parse
Các lệnh chính
snitch / snitch top : hiển thị danh sách kết nối được cập nhật theo thời gian thực
- Tùy chọn:
-l(lắng nghe), -t(TCP), -e(đã kết nối), -i(chu kỳ cập nhật)
- Phím tắt: di chuyển
j/k, chuyển TCP·UDP bằng t/u, K kết thúc tiến trình, / tìm kiếm, q thoát, v.v.
snitch ls : in bảng một lần, tự động dùng pager nếu vượt quá chiều cao terminal
- Định dạng đầu ra: bảng mặc định,
-o json, -o csv, -p(đơn giản), --no-headers(bỏ header)
snitch json : xuất định dạng JSON để dùng trong script
snitch watch : stream các khung JSON theo khoảng thời gian nhất định
snitch upgrade : kiểm tra phiên bản và tự động cập nhật
Tùy chọn lọc và phân giải
- Cờ dùng chung:
-t(TCP), -u(UDP), -l(lắng nghe), -e(đã kết nối), -4(IPv4), -6(IPv6)
- Phân giải DNS và tên dịch vụ:
- Hỗ trợ các tùy chọn
--resolve-addrs, --resolve-ports, --no-cache
- Thực hiện truy vấn DNS song song và lưu cache, có thể tắt cache bằng
--no-cache
- Lọc chi tiết: chỉ định tên tiến trình, cổng, trạng thái... bằng định dạng
key=value
- Ví dụ:
snitch ls proto=tcp state=listen, snitch ls proc=nginx
Định dạng đầu ra
- Đầu ra bảng mặc định: hiển thị tên tiến trình, PID, giao thức, trạng thái, địa chỉ cục bộ·cổng
- Đầu ra đơn giản(-p) : văn bản có thể parse
- Đầu ra JSON/CSV: phù hợp cho tự động hóa bằng script và phân tích log
Cấu hình và biến môi trường
- Tệp cấu hình:
~/.config/snitch/snitch.toml
- Có thể thiết lập
numeric, dns_cache, theme(auto/dark/light/mono)
- Biến môi trường:
- Hỗ trợ
SNITCH_THEME, SNITCH_RESOLVE, SNITCH_DNS_CACHE, SNITCH_NO_COLOR, SNITCH_CONFIG, v.v.
Yêu cầu hệ thống
- Cần môi trường Linux hoặc macOS
- Linux: đọc dữ liệu từ
/proc/net/*, cần quyền root hoặc CAP_NET_ADMIN để lấy đầy đủ thông tin tiến trình
- macOS: dùng API hệ thống, cần
sudo để lấy đầy đủ thông tin tiến trình
1 bình luận
Bình luận trên Hacker News
lsofvàssquá bất tiệnsstrong đầu ra mặc định lại hiển thị những thông tin hiếm khi cần như kích thước hàng đợi gửi/nhận, nhưng lại không cho biết socket đó thuộc về ứng dụng nàoNgoài ra nó còn mặc định bỏ qua các socket đang lắng nghe, trong khi đó lại chính là một trong những mục đích sử dụng chính của kiểu công cụ này
Tôi hiểu việc chọn mặc định tốt là khó, nhưng đây gần như là một ví dụ chọn sai gần hết mọi thứ
Theo thời gian, người dùng và các trường hợp sử dụng thay đổi nên mặc định cũng cần thay đổi, nhưng với các công cụ Unix thì định dạng đầu ra cũng chính là API, nên nếu thay đổi sẽ phát sinh vấn đề tương thích ngược
Ví dụ như việc
ps auxcắt tên tiến trình dài xuống còn khoảng 7 ký tự cũng vì lý do đóBài viết liên quan: sh and the separation of data and representation
sshaylsof, họ chưa thực sự hiểu rõ các vấn đề về khả năng sử dụng như thế nàyTôi nghĩ tính dễ dùng trực quan quan trọng hơn rất nhiều so với tốc độ hay tính năng
netstat -utanvàss -utancó vẻ hiển thị gần như cùng một loại thông tinVì tên bị trùng nên có lẽ dùng tên khác sẽ tốt hơn
Trang chính thức của Little Snitch
Snitch chỉ đơn giản là công cụ hiển thị dữ liệu từ
ss/netstattrong terminal theo cách dễ nhìn hơnTrong cùng lĩnh vực IT đã có một công cụ tên gần giống rồi, nên tôi không hiểu vì sao lại nhất quyết dùng tiếp tên đó
Liên kết demo
Các thư viện GUI có nhiều tính năng cho người dùng như người khiếm thị, còn TUI có thể còn thiếu ở điểm này
ssvà dùng khá tốt. Chỉ là tôi không muốn nhìn các con số hàng đợi gửi/nhậnChúng làm chiều rộng màn hình bị kéo quá lớn, nên khi chia dọc trên laptop thì gần như không vừa
Tôi không định cài Snitch.
ssđã có sẵn mặc định trên mọi máy chủ rồi, và tôi cũng không cần TUISnitch có thể ổn cho máy cá nhân hoặc workstation, nhưng trên server thì
ssvẫn là mặc địnhssvì nó đã được cài sẵnSnitch phù hợp hơn cho workstation hoặc debug homelab
Hiện nó chưa hiển thị hàng đợi gửi/nhận, nhưng sau này tôi định thêm bằng chế độ compact hoặc nút bật/tắt
Có tính năng nào trong video demo mà tôi đã bỏ lỡ không?
ss/netstathơn là công cụ giám sát lưu lượngTính năng giám sát lưu lượng có trong kế hoạch nhưng hiện vẫn chưa được triển khai
Khá lạ là Go lại cho phép
module barename. Với cả dự án cá nhân thì cuối cùng vẫn sẽ dùng URL, nên tôi nghĩ đây là một kiểu làm không tốtLiên kết commit
@latestthì sẽ hoạt động bình thườngVí dụ, nếu mã độc được thiết kế để chờ một khoảng thời gian nhất định hoặc chỉ giao tiếp với C&C khi người dùng đang có hoạt động mạng, thì có vẻ sẽ rất khó bị phát hiện
/procRootkit
LD_PRELOADcó thể thao túng đầu ra của các hàm libc để che giấu hoạt động của nósscó phần đáng tin hơn một chút, còn Snitch được viết bằng Go nên không dùng libc, vì vậy có thể chống chịu tốt hơn trước rootkitLD_PRELOADDù vậy, các công cụ này không phải để phát hiện lưu lượng độc hại mà là để debug cục bộ
Tài liệu tham khảo: decloaker, bài báo arXiv, bài báo ACM, giải thích cấu trúc proc
Kẻ tấn công có tay nghề thì kiểu gì cũng có thể trà trộn vào lưu lượng hợp lệ
Ngay cả các công cụ mạng thực sự dùng để ứng phó kẻ tấn công cũng không hoàn hảo (từ khóa tìm kiếm: bro vantage point problem)
Hiện tôi dùng jnettop nhưng không thích UI của nó