SNInsight是一个Go应用程序,可以被动监控网络流量,从TLS握手中提取服务器名称指示(SNI),将TCP连接流量与相应的SNI关联,并计算每个SNI域的实时流量。
- 使用
gopacket
库进行被动数据包捕获 - 使用BPF规则进行高效的数据包过滤
- 从TLS ClientHello消息中提取SNI
- 连接跟踪和SNI关联
- 每个SNI域的实时流量统计
- 以格式良好的表格或JSON显示结果
- Go 1.23
- 数据包捕获需要root权限或CAP_NET_RAW、CAP_NET_ADMIN能力
- 安装了libpcap的Linux、macOS或Windows
# 基本用法
sudo ./SNInsight -i eth0
# 监控多个接口
sudo ./SNInsight -i eth0,eth1
# 监控自定义端口
sudo ./SNInsight -i eth0 -p 443,8443
# 使用自定义BPF过滤器
sudo ./SNInsight -i eth0 -f "tcp and port 443"
# 更改刷新间隔
sudo ./SNInsight -i eth0 -r 2s
# 以JSON格式输出
sudo ./SNInsight -i eth0 --output-format json
# 按主机名排序
sudo ./SNInsight -i eth0 --sort-by name
# 启用详细日志记录
sudo ./SNInsight -i eth0 -v
# 跟踪非SNI流量(以IP为键)
sudo ./SNInsight -i eth0 --track-non-sni
# 使用TZSP监听RouterOS镜像流量
sudo ./SNInsight --tzsp
# 从PCAP文件读取数据包
sudo ./SNInsight --read-pcap capture.pcap
-i, --interface
: 要监听的网络接口(逗号分隔)-p, --port
: 要监控的TLS端口(逗号分隔,默认值:"443")-f, --filter
: 自定义BPF过滤器字符串(覆盖默认端口过滤器)-r, --refresh-interval
: 显示刷新速率(默认值:"1s")--cleanup-timeout
: 非活动连接清理超时(默认值:"120s")--resolve-ip
: 尝试对IP进行反向DNS查找(默认值:false)--output-format
: 指定输出格式(table, json,默认值:"table")-v, --verbose
: 启用详细/调试日志记录(默认值:false)--sort-by
: 结果排序的列(traffic, rate, name,默认值:"traffic")--track-non-sni
: 是否跟踪没有SNI的TCP连接,使用IP地址(默认值:false)
--tzsp
: 启用TZSP监听器接收RouterOS镜像流量(默认值:false)--tzsp-address
: TZSP监听地址(默认值:"0.0.0.0")--tzsp-port
: TZSP监听端口(默认值:37008)
--pcap-file
: 与接口或TZSP捕获一起使用时,将捕获的数据包保存到pcap文件--log-file
: 将数据包摘要保存到日志文件--read-pcap
: 从pcap文件读取数据包作为输入源
tcp port 443
: 仅监控HTTPS流量tcp port 80 or tcp port 443
: 监控HTTP和HTTPS流量host 192.168.1.1
: 监控特定IP的所有流量tcp dst port 443 and not src net 192.168.0.0/16
: 监控来自非本地网络到HTTPS的流量tcp port not 443 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x16030103
: 监控非标准端口上的TLS流量
- 无法从使用加密客户端Hello(ECH)或加密SNI(ESNI)的连接中提取SNI
- 需要足够的权限来捕获数据包
- 性能可能会随网络流量的变化而变化
git clone https://github.com/yourusername/SNInsight.git
cd SNInsight
go build
go install github.com/yourusername/SNInsight@latest
要从ARM Mac为Debian x86系统构建:
- 安装GoReleaser v2或更高版本和Docker:
brew install goreleaser/tap/goreleaser
从docker.com安装Docker Desktop。
确保您拥有GoReleaser 2.x或更高版本:
goreleaser --version
并验证Docker是否正在运行:
docker info
- 运行构建脚本:
./build-debian.sh
编译好的二进制文件将在dist/
目录中。
- 将二进制文件传输到Debian系统,安装依赖项并设置所需的功能:
# 在目标Debian系统上安装libpcap
sudo apt-get update
sudo apt-get install -y libpcap-dev
# 为二进制文件设置功能
sudo setcap cap_net_raw,cap_net_admin=eip SNInsight