7 điểm bởi GN⁺ 2025-12-25 | 1 bình luận | Chia sẻ qua WhatsApp
  • Snitchcô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

 
GN⁺ 2025-12-25
Bình luận trên Hacker News
  • Thiết lập mặc định của lsof ss quá bất tiện
    ss trong đầ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ào
    Ngoà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ứ
    • Hoàn toàn đồng ý. Các công cụ Unix về lâu dài có giới hạn mang tính cấu trúc trong việc duy trì các mặc định hợp lý
      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 aux cắ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
    • Giờ đây người ta đã hiểu UX sâu sắc hơn rất nhiều. Có vẻ như khi các lập trình viên thập niên 70 tạo ra ss hay lsof, họ chưa thực sự hiểu rõ các vấn đề về khả năng sử dụng như thế này
    • Các công cụ CLI thế hệ mới như fd, ag, rg ngày nay cũng gặp vấn đề tương tự
      Tô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 -utanss -utan có vẻ hiển thị gần như cùng một loại thông tin
  • Lúc nhìn tiêu đề, ban đầu tôi tưởng đang nói về Little Snitch, công cụ giám sát mạng cho Mac
    Vì 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
    • Cũng có một bản clone tên là OpenSnitch cho Linux
    • Tôi thấy cái tên ổn. Không nhất thiết phải đổi chỉ vì đã có Little Snitch
    • Có lẽ chưa đến mức phải đổi tên. Nó khác hoàn toàn về mục đích sử dụng so với Little Snitch
      Snitch chỉ đơn giản là công cụ hiển thị dữ liệu từ ss/netstat trong terminal theo cách dễ nhìn hơn
    • Ồ, hay đấy. Không biết có công cụ thay thế cho Windows hoặc Linux nào không nhỉ
    • Tôi cũng nghĩ vậy lúc đầu. Cái tên nghe khá ngượng
      Trong 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 đó
  • Cách làm recording-as-code trong bản demo khá thú vị
    Liên kết demo
    • Cảm ơn :) Tôi hầu như chưa thấy cách tiếp cận này ở các dự án khác
  • Tôi rất thích việc dạo này có nhiều công cụ dựa trên TUI hơn. Dự án này cũng trông rất ổn nên tôi chắc chắn sẽ thử dùng
    • Nhưng tôi tự hỏi liệu TUI có tốt về mặt khả năng tiếp cận như GUI không
      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
  • Tôi đã quen với ss và 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ận
    Chú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 TUI
    Snitch có thể ổn cho máy cá nhân hoặc workstation, nhưng trên server thì ss vẫn là mặc định
    • Đúng vậy. Trên server thì cứ dùng ss vì nó đã được cài sẵn
      Snitch 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
  • Trông có vẻ ổn, nhưng tôi đã dùng iptraf-ng từ rất lâu và vẫn thấy nó nhỉnh hơn một chút
    Có tính năng nào trong video demo mà tôi đã bỏ lỡ không?
    • Cảm ơn! Snitch gần với vai trò thay thế ss/netstat hơn là công cụ giám sát lưu lượng
      Tí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
  • Tôi không thích cái tên, nhưng việc giám sát trạng thái kết nối bằng TUI thì thực sự rất hợp
    • Cảm ơn. Tôi tò mò không biết chính xác bạn không thích điểm nào ở cái tên đó
  • Tôi thử cài bằng Go thì gặp lỗi bên dưới
    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
    
    • Vấn đề là do phần khai báo module chỉ dùng tên thay vì URL. Tôi đã sửa nó vài giờ trước rồi
      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ốt
    • Đã sửa nhưng vẫn chưa được phản ánh trong bản phát hành
      Liên kết commit
    • Giờ tôi đã sửa và phát hành xong rồi. Nếu build bằng @latest thì sẽ hoạt động bình thường
  • Tôi luôn tự hỏi các công cụ như thế này hữu ích đến mức nào với kẻ tấn công có tay nghề cao
    Ví 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
    • Ít nhất thì các công cụ như vậy không nên tự parse trực tiếp /proc
      Rootkit LD_PRELOAD có thể thao túng đầu ra của các hàm libc để che giấu hoạt động của nó
      ss có 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 rootkit LD_PRELOAD
      Dù 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
    • Đúng vậy. Snitch không dành cho phát hiện bảo mật mà cho debug/kiểm tra cục bộ
      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ệ
    • Những công cụ như thế này không dành cho môi trường đối kháng
      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)
  • Sẽ hay nếu có tính năng hiển thị tốc độ truyền hiện tại và tích lũy theo từng socket/tiến trình
    Hiện tôi dùng jnettop nhưng không thích UI của nó
    • Tính năng đó được lên kế hoạch thêm trong các phiên bản tương lai