SCGIS-Wales/ebpf-tls-tracer
GitHub: SCGIS-Wales/ebpf-tls-tracer
基于 eBPF 的 Linux TLS 明文捕获工具,通过 uprobes 挂钩 OpenSSL 实现无需修改应用的实时加密流量可见性。
Stars: 0 | Forks: 0
# TLS Tracer
一个基于 eBPF 的 CLI 工具,用于在 Linux 上实时拦截和检查 TLS/SSL 流量。它将 uprobes 附加到 OpenSSL 的 `SSL_read` 和 `SSL_write` 函数,以捕获流经 TLS 连接的明文数据——无需修改应用程序或终止 TLS 会话。
每个捕获的事件包括连接的**远程 IP 地址**(IPv4 或 IPv6)和**端口**,通过内核级别的 kprobes 对 `connect()` syscall 进行关联获取。
## 功能特性
- **追踪 TLS 连接**并从 `SSL_read`/`SSL_write` 捕获明文数据
- **捕获远程 IP 地址**(IPv4 和 IPv6),通过 connect() kprobe 关联获取主机名背后的 IP
- **过滤**捕获的数据,支持按 PID、UID 或其他条件
- **输出**支持人类可读的文本或结构化的 JSON 格式
- **十六进制转储**模式,用于二进制协议检查
- **自动检测**系统的 OpenSSL 库路径
- **低开销**——使用 eBPF perf buffers 实现高效的内核到用户数据传输
- **优雅关闭**,支持 Ctrl+C / SIGTERM 时的正确资源清理
## 快速开始
**选项 1 —— 预编译二进制文件** (x86_64 Linux):
从 [GitHub Releases](https://github.com/SCGIS-Wales/ebpf-tls-tracer/releases) 下载,然后:
```
tar xzf tls_tracer-linux-x86_64.tar.gz
sudo ./tls_tracer -v
```
**选项 2 —— Docker** (任何内核 5.5+ 的 Linux):
```
docker pull ghcr.io/scgis-wales/ebpf-tls-tracer:latest
sudo docker run --rm --privileged --pid=host ghcr.io/scgis-wales/ebpf-tls-tracer:latest -v
```
**选项 3 —— 从源码构建** (见下方 [从源码构建](#building-from-source))。
## 运行环境要求 (CLI)
这些是**目标机器**上运行该工具所需的条件:
| 需求 | 详情 |
|---|---|
| **操作系统** | Linux (x86_64) |
| **内核** | 最低 5.5,**推荐 6.1+** |
| **权限** | Root,或 `CAP_BPF` + `CAP_PERFMON` + `CAP_SYS_ADMIN` |
| **OpenSSL** | 必须安装 `libssl.so` (自动检测) |
| **运行时库** | `libbpf`, `libelf`, `zlib` |
| **文件系统** | 挂载 debugfs/tracefs (现代发行版标配) |
必须启用以下内核配置选项(Ubuntu, Debian, AL2023, Fedora, RHEL 9+ 默认已启用):
| 配置选项 | 用途 |
|---|---|
| `CONFIG_BPF=y` | 核心 BPF 子系统 |
| `CONFIG_BPF_SYSCALL=y` | `bpf()` 系统调用 |
| `CONFIG_BPF_JIT=y` | BPF 程序的 JIT 编译器 |
| `CONFIG_KPROBE_EVENTS=y` | 基于 kprobe 的追踪 (用于 IP 捕获) |
| `CONFIG_UPROBE_EVENTS=y` | 基于 uprobe 的追踪 (用于 SSL 挂钩) |
| `CONFIG_DEBUG_INFO_BTF=y` | BTF 类型信息 |
**验证系统:**
```
uname -r # Kernel version (need 5.5+)
ls /sys/kernel/btf/vmlinux # BTF support
cat /proc/sys/net/core/bpf_jit_enable # BPF JIT (should be 1 or 2)
```
**安装运行时依赖:**
```
# Debian/Ubuntu
sudo apt-get install libbpf1 libelf1 zlib1g libssl3
# AL2023/RHEL/Fedora
sudo dnf install libbpf elfutils-libelf zlib openssl-libs
```
## 从源码构建
这些是**构建机器**上所需的条件(可以与目标机器不同):
| 软件包 (Debian/Ubuntu) | 软件包 (RHEL/AL2023/Fedora) | 用途 |
|---|---|---|
| `clang` | `clang` | BPF 程序编译器 |
| `llvm` | `llvm` | BPF 目标支持 |
| `gcc` | `gcc` | 用户空间编译器 |
| `make` | `make` | 构建系统 |
| `libbpf-dev` | `libbpf-devel` | BPF 用户空间库 (头文件 + .so) |
| `libelf-dev` | `elfutils-libelf-devel` | ELF 解析 |
| `zlib1g-dev` | `zlib-devel` | 压缩 |
| `linux-libc-dev` | `kernel-headers` | BPF 编译所需的内核头文件 |
```
# Debian/Ubuntu
sudo apt-get install clang llvm gcc make libbpf-dev libelf-dev zlib1g-dev linux-libc-dev
# RHEL/AL2023/Fedora
sudo dnf install clang llvm gcc make libbpf-devel elfutils-libelf-devel zlib-devel kernel-devel kernel-headers
# 构建
make
# 运行测试
make test
# 安装到全局 (可选)
sudo make install
```
## 使用方法
```
# 追踪所有 TLS 流量 (需要 root)
sudo ./bin/tls_tracer
# 按进程 ID 过滤
sudo ./bin/tls_tracer -p 1234
# 以 JSON 格式输出
sudo ./bin/tls_tracer -f json
# 捕获数据的十六进制转储
sudo ./bin/tls_tracer -x
# 按 UID 过滤并显示详细输出
sudo ./bin/tls_tracer -u 1000 -v
# 指定自定义 OpenSSL 库路径
sudo ./bin/tls_tracer -l /path/to/libssl.so
```
### 选项
| 短选项 | 长选项 | 描述 |
|------|-----------|-------------|
| `-p` | `--pid PID` | 按进程 ID 过滤 |
| `-u` | `--uid UID` | 按用户 ID 过滤 |
| `-l` | `--lib PATH` | libssl.so 的路径 (默认自动检测) |
| `-f` | `--format FMT` | 输出格式:`text` (默认) 或 `json` |
| `-x` | `--hex` | 显示捕获数据的十六进制转储 |
| `-d` | `--data-only` | 仅打印捕获的数据 (无标题头) |
| `-s` | `--sanitize REGEX` | 过滤匹配 REGEX 的 URL (不区分大小写,可重复) |
| `-v` | `--verbose` | 详细输出 (显示库路径、探针状态) |
| `-h` | `--help` | 显示帮助信息 |
### 输出示例
**文本模式 (默认):**
```
12:34:56 REQUEST PID=1234 TID=1234 UID=1000 COMM=curl ADDR=93.184.216.34:443 LEN=78
GET /api/v1/status HTTP/1.1
Host: example.com
12:34:56 RESPONSE PID=1234 TID=1234 UID=1000 COMM=curl ADDR=93.184.216.34:443 LEN=256
HTTP/1.1 200 OK
Content-Type: application/json
```
**JSON 模式 (`-f json`):**
```
{"timestamp":"2026-03-15T10:30:00.123456Z","timestamp_ns":123456789,"pid":1234,"tid":1234,"uid":1000,"comm":"curl","direction":"REQUEST","src_ip":"10.0.5.23","src_port":54321,"dst_ip":"93.184.216.34","dst_port":443,"data_len":78,"transport":"tls","protocol":"https","http_method":"GET","http_path":"/api/v1/status","http_host":"example.com"}
```
## Docker
每次推送到 `main` 分支时,容器镜像都会发布到 GitHub Container Registry。
```
# 从 GHCR 拉取
docker pull ghcr.io/scgis-wales/ebpf-tls-tracer:latest
# 或本地构建
docker build -t tls_tracer .
# 运行 (eBPF 访问需要 --privileged)
docker run --rm --privileged \
-v /sys/kernel/debug:/sys/kernel/debug:ro \
-v /sys/kernel/tracing:/sys/kernel/tracing:ro \
-v /sys/fs/bpf:/sys/fs/bpf \
--pid=host \
ghcr.io/scgis-wales/ebpf-tls-tracer:latest -v -f json
```
## Amazon Linux 2023 (AL2023)
AL2023 附带内核 6.1+,并且**开箱即完全支持 eBPF**——无需内核重编译或功能标志。BTF、uprobes、kprobes 和 BPF JIT 在原版内核中均已启用。
### 在 AL2023 上安装
```
sudo dnf install -y \
clang llvm gcc make \
libbpf-devel elfutils-libelf-devel zlib-devel \
kernel-devel-$(uname -r) kernel-headers-$(uname -r) \
openssl-devel bpftool
git clone https://github.com/SCGIS-Wales/ebpf-tls-tracer.git
cd ebpf-tls-tracer
make && make test
sudo ./bin/tls_tracer -v
```
### EC2 用户数据 (自动设置)
使用此用户数据脚本在 AL2023 EC2 实例上自动安装并启动 TLS Tracer:
```
#!/bin/bash
set -euo pipefail
# 安装构建依赖
dnf install -y \
clang llvm gcc make \
libbpf-devel elfutils-libelf-devel zlib-devel \
kernel-devel-$(uname -r) kernel-headers-$(uname -r) \
openssl-devel bpftool git
# 克隆并构建
cd /opt
git clone https://github.com/SCGIS-Wales/ebpf-tls-tracer.git
cd ebpf-tls-tracer
make && make test
make install
# 验证 eBPF 支持
echo "=== Kernel: $(uname -r) ==="
ls -la /sys/kernel/btf/vmlinux && echo "BTF: OK"
cat /proc/sys/net/core/bpf_jit_enable && echo "BPF JIT: OK"
bpftool feature probe kernel 2>/dev/null | head -20 || true
```
### AL2023 内核配置 (预启用)
以下配置在 AL2023 的原版内核中**已启用**——无需任何操作:
```
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_DEBUG_INFO_BTF=y
CONFIG_BPF_EVENTS=y
CONFIG_KPROBE_EVENTS=y
CONFIG_UPROBE_EVENTS=y
```
## Kubernetes 部署 (v1.34+)
TLS Tracer 作为 **DaemonSet** 运行,用于监控每个节点上所有进程的出站 TLS 流量。它在内核级别使用 eBPF,这意味着它可以捕获节点上**所有 Pod 和容器**的 TLS 流量——包括任何命名空间(例如 `apigee`、`default` 等)中的 Pod——而无需 sidecar 或更改应用程序。
### 在 Kubernetes 上的工作原理
- 作为 **DaemonSet** 部署(每个节点一个 Pod),配置 `hostPID: true` 和 `privileged: true`
- eBPF 挂钩进入**主机内核的** `SSL_read`/`SSL_write` 和 `connect()` syscall
- 捕获节点上**所有 Pod/容器**的出站 TLS 流量,跨所有命名空间(例如 `apigee`、`default`)
- 通过 Downward API 环境变量自动为事件注入 **K8s 元数据**(Pod 名称、命名空间、容器 ID)
- 从 TLS 明文中解析 **HTTP Layer 7** 详情(方法、路径、Host 头)
- 捕获每个连接的**源和目的 IP:端口**
- 日志以 **JSON 格式**输出到 stdout,每行一个独立事件
### Kubernetes 前置条件
| 需求 | 详情 |
|---|---|
| **Kubernetes 版本** | 1.34+ |
| **节点操作系统** | 内核 6.1+ 的 Linux (推荐 AL2023 —— EKS 1.34 附带内核 6.12) |
| **节点内核配置** | eBPF、kprobes、uprobes 已启用 (见上方前置条件) |
| **容器运行时** | 支持特权容器的 containerd 或 CRI-O |
| **RBAC** | 创建特权 DaemonSets 的集群管理员权限 |
| **节点上的 OpenSSL** | 每个节点上必须存在 `libssl.so` |
### 最低容器权限
TLS Tracer 容器运行**需要**以下权限:
| 权限 | 原因 |
|---|---|
| `privileged: true` | eBPF 程序加载需要完全内核访问权限 |
| `hostPID: true` | 必须查看节点上的所有进程以捕获 TLS 流量 |
| `hostNetwork: true` | connect() kprobe 关联所需 |
| 卷:`/sys/kernel/debug` | uprobe/kprobe 事件的 debugfs 访问 |
| 卷:`/sys/kernel/tracing` | 追踪基础设施的 tracefs 访问 |
| 卷:`/sys/fs/bpf` | 用于 map pinning 的 BPF 文件系统 |
| 卷:`/usr/lib64` (主机) | 访问主机的 `libssl.so` 以进行 uprobe 附加 |
| PSA:`privileged` | 命名空间必须允许特权 Pod |
### 使用 Helm 部署 (推荐)
```
# 创建带有 AL2023 节点的 EKS 集群
eksctl create cluster \
--name my-cluster \
--version 1.34 \
--nodegroup-name al2023-nodes \
--node-type m5.large \
--node-ami-family AmazonLinux2023
# 部署 TLS Tracer (默认 JSON 输出)
helm install tls-tracer helm/tls-tracer \
--namespace tls-tracer --create-namespace
# 检查状态
kubectl -n tls-tracer get pods -o wide
# 查看 JSON 日志 (节点上所有出站 TLS 流量)
kubectl -n tls-tracer logs -l app.kubernetes.io/name=tls-tracer --tail=50 -f
```
#### Helm 值
| 值 | 默认值 | 描述 |
|---|---|---|
| `outputFormat` | `json` | 输出格式:`json` 或 `text` |
| `verbose` | `true` | 启用详细日志记录 |
| `filterPid` | `0` | 按 PID 过滤 (0 = 全部) |
| `filterUid` | `0` | 按 UID 过滤 (0 = 全部) |
| `sslLibPath` | `""` | 自定义 libssl.so 路径 (空 = 自动检测) |
| `sanitizePatterns` | `["apikey=[^&]*"]` | URL 过滤正则模式 (不区分大小写) |
| `companyPrefix` | `""` | 所有资源名称的前缀 (例如 `acme-`) |
| `metadata.awsAccountId` | `""` | AWS 账户 ID (用于 S3/Kinesis 路径) |
| `metadata.awsRegion` | `eu-west-1` | AWS 区域 |
| `metadata.clusterName` | `""` | EKS 集群名称 |
| `metadata.targetNamespace` | `""` | 被监控的 K8s 命名空间 |
| `metadata.applicationName` | `""` | 应用程序名称 (例如 `apigee`) |
| `metadata.environment` | `""` | 环境标签 (例如 `production`) |
| `image.repository` | `ghcr.io/scgis-wales/ebpf-tls-tracer` | 容器镜像 |
| `image.tag` | `latest` | 镜像标签 |
#### AWS S3 日志传输
使用 Apache Hive 风格的目录分区将 JSON 日志传输到 S3。使用带 IRSA 认证的 Python (boto3) sidecar。**默认禁用。**
| 值 | 默认值 | 描述 |
|---|---|---|
| `s3.enabled` | `false` | 启用 S3 日志传输 sidecar |
| `s3.bucket` | `""` | S3 存储桶名称 |
| `s3.prefix` | `tls-tracer-logs` | S3 键前缀 |
| `s3.flushIntervalSeconds` | `60` | 刷新间隔 |
| `s3.batchSize` | `1000` | 每次上传的最大记录数 |
S3 路径格式 (Apache Hive 分区):
```
s3:////account=/region=/cluster=/
namespace=/app=/env=/year=YYYY/month=MM/day=DD/
hour=HH/-.json
```
#### AWS Kinesis Firehose
将 JSON 日志转发到 Kinesis Firehose 传输流。使用带 IRSA 认证的 Python (boto3) sidecar。**默认禁用。**
| 值 | 默认值 | 描述 |
|---|---|---|
| `kinesis.enabled` | `false` | 启用 Kinesis Firehose sidecar |
| `kinesis.deliveryStreamName` | `""` | Firehose 传输流名称 |
| `kinesis.batchSize` | `500` | 每次 PutRecordBatch 调用的记录数 |
| `kinesis.flushIntervalSeconds` | `30` | 刷新间隔 |
#### IRSA (IAM Roles for Service Accounts)
S3 和 Kinesis sidecar 均使用 IRSA 进行 AWS 认证。在 Service Account 注解中配置 IAM 角色 ARN:
```
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789012:role/tls-tracer-role"
```
所需的 IAM 权限:
- **S3**:`s3:PutObject`, `s3:GetBucketLocation`
- **Kinesis**:`firehose:PutRecord`, `firehose:PutRecordBatch`
#### URL 过滤
HTTP 路径和 Host 头中的敏感数据可以使用正则模式自动编辑。匹配项将被替换为 `[REDACTED]`。模式不区分大小写 (POSIX ERE)。
**CLI 用法:**
```
# 从记录的 URL 中编校 API 密钥和令牌
sudo ./bin/tls_tracer -f json -s 'apikey=[^&]*' -s 'token=[^&]*' -s 'password=[^&]*'
```
**Helm 值:**
```
sanitizePatterns:
- "apikey=[^&]*"
- "secret=[^&]*"
- "password=[^&]*"
- "token=[^&]*"
- "access_key=[^&]*"
```
处理前:`GET /api/v1/data?apikey=sk_live_abc123&format=json`
处理后: `GET /api/v1/data?[REDACTED]&format=json`
### JSON 日志输出
每个捕获的 TLS 事件都是**单独的一行完整 JSON**:
```
{"timestamp":"2026-03-15T10:30:00.123456Z","timestamp_ns":1710500000000000,"pid":12345,"tid":12345,"uid":1000,"comm":"curl","direction":"REQUEST","src_ip":"10.0.5.23","src_port":54321,"dst_ip":"93.184.216.34","dst_port":443,"data_len":78,"transport":"tls","protocol":"https","k8s_pod":"apigee-runtime-7b8f9c6d4-x2k9m","k8s_namespace":"apigee","container_id":"a1b2c3d4e5f6","http_method":"GET","http_path":"/api/v1/status","http_host":"example.com"}
{"timestamp":"2026-03-15T10:30:00.234567Z","timestamp_ns":1710500000100000,"pid":12345,"tid":12345,"uid":1000,"comm":"curl","direction":"RESPONSE","src_ip":"10.0.5.23","src_port":54321,"dst_ip":"93.184.216.34","dst_port":443,"data_len":256,"transport":"tls","protocol":"https","k8s_pod":"apigee-runtime-7b8f9c6d4-x2k9m","k8s_namespace":"apigee","container_id":"a1b2c3d4e5f6"}
{"timestamp":"2026-03-15T10:30:01.000000Z","timestamp_ns":1710500001000000,"pid":23456,"tid":23456,"uid":0,"comm":"java","direction":"REQUEST","src_ip":"10.0.5.24","src_port":38901,"dst_ip":"10.0.1.50","dst_port":8443,"data_len":142,"transport":"tls","protocol":"https","k8s_pod":"apigee-cassandra-0","k8s_namespace":"apigee","container_id":"f6e5d4c3b2a1","http_method":"POST","http_path":"/v1/organizations","http_host":"management.apigee.internal"}
```
| 字段 | 描述 |
|---|---|
| `timestamp` | 带微秒的 ISO8601 挂钟时间戳 |
| `timestamp_ns` | 内核单调时间戳 (纳秒) |
| `pid`/`tid` | 进程和线程 ID |
| `comm` | 进程命令名 (例如 `curl`, `java`, `node`, `python3`) |
| `direction` | `REQUEST` (发送到服务器的出站请求) 或 `RESPONSE` (来自服务器的入站响应) |
| `src_ip`/`src_port` | 源 (本地) IP 地址和端口 |
| `dst_ip`/`dst_port` | 目的 (远程) IP 地址和端口 |
| `transport` | 传输层:`tls` (所有捕获的流量都经过 SSL) |
| `protocol` | 应用层协议:`https` (检测到 HTTP) 或 `unknown` |
| `k8s_pod` | Kubernetes Pod 名称 (来自 downward API `POD_NAME` 或 `HOSTNAME`) |
| `k8s_namespace` | Kubernetes 命名空间 (来自 downward API `POD_NAMESPACE`) |
| `container_id` | 短容器 ID (来自 cgroup) |
| `http_method` | HTTP 方法:GET, POST, PUT, DELETE, PATCH 等 |
| `http_path` | HTTP 请求路径 (例如 `/api/v1/status`) |
| `http_host` | HTTP Host 头值 (DNS 主机名) |
| `data_len` | 捕获的明文数据长度 |
K8s 和 HTTP 字段仅在检测到时存在。要在受监控的 Pod 上启用 K8s 元数据,请配置 downward API:
```
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
```
### 使用 kubectl 部署 (替代方案)
```
kubectl apply -f deploy/kubernetes/namespace.yaml
kubectl apply -f deploy/kubernetes/rbac.yaml
kubectl apply -f deploy/kubernetes/daemonset.yaml
kubectl -n tls-tracer get pods -o wide
kubectl -n tls-tracer logs -l app=tls-tracer --tail=50
```
### 通过 EKS Userdata 配置节点
如果节点需要运行时库(通常 AL2023 上已预装):
```
#!/bin/bash
dnf install -y libbpf openssl-libs bpftool
```
### 需要配置的内容
对于 Linux 内核 6.x 上的 Kubernetes 1.34+,每个节点必须满足以下条件。
**EKS 1.34 with AL2023**:EKS 优化的 AL2023 AMI 附带**内核 6.12**(例如 `6.12.73-95.123.amzn2023`)。所有 eBPF 功能——BTF、uprobes、kprobes、BPF JIT、debugfs、tracefs 和 BPF 文件系统——均**完全启用并开箱自动挂载**。无需内核配置、模块加载或文件系统挂载。直接部署 Helm chart 即可。
对于非 AL2023 或自定义 AMI,请验证:
1. **内核模块已加载**(AL2023 上通常自动加载):
lsmod | grep -E 'bpf|uprobe|kprobe'
2. **BPF 文件系统已挂载**(AL2023 上自动挂载):
mount -t bpf bpf /sys/fs/bpf
3. **debugfs / tracefs 已挂载**(AL2023 上自动挂载):
mount -t debugfs debugfs /sys/kernel/debug
mount -t tracefs tracefs /sys/kernel/tracing
4. **Pod Security Admission 中允许特权容器**:
apiVersion: v1
kind: Namespace
metadata:
name: tls-tracer
labels:
pod-security.kubernetes.io/enforce: privileged
### 移除
```
# Helm
helm uninstall tls-tracer -n tls-tracer
# 或 kubectl
kubectl delete -f deploy/kubernetes/daemonset.yaml
kubectl delete -f deploy/kubernetes/rbac.yaml
kubectl delete -f deploy/kubernetes/namespace.yaml
```
## 架构
```
┌──────────────────────────────────────────────────────────┐
│ User Space │
│ │
│ tls_tracer (CLI) │
│ ├── Argument parsing (getopt_long) │
│ ├── BPF object loading (libbpf) │
│ ├── Kprobe attach → connect() for IP capture │
│ ├── Uprobe attach → SSL_read/SSL_write │
│ ├── Perf buffer polling │
│ └── Event formatting (text/json) with IP:port │
│ │
├───────────────── perf buffer ────────────────────────────┤
│ │
│ Kernel Space │
│ │
│ bpf_program.o (eBPF probes) │
│ ├── kprobe/__sys_connect → save sockaddr │
│ ├── kretprobe/__sys_connect → store IP:port in map │
│ ├── uprobe/SSL_read → save buffer ptr │
│ ├── uretprobe/SSL_read → capture data + IP │
│ ├── uprobe/SSL_write → save buffer ptr │
│ └── uretprobe/SSL_write → capture data + IP │
│ │
│ BPF Maps: │
│ ├── ssl_args_map (HASH) → per-thread SSL args │
│ ├── conn_info_map (HASH) → pid_tgid → remote addr │
│ ├── connect_args_map (HASH) → connect() args │
│ └── tls_events (PERF_EVENT_ARRAY) → user-space │
│ │
└──────────────────────────────────────────────────────────┘
```
### IP 捕获工作原理
1. **kprobe on `connect()`** 在 syscall 入口保存 `sockaddr`(包含远程 IP 和端口)
2. **kretprobe on `connect()`** 在成功返回时读取保存的地址,并将 `{pid_tgid} → {remote_ip, remote_port}` 存储在 `conn_info_map` 中
3. 当 **SSL_read/SSL_write** 触发时,uretprobe 通过 `pid_tgid` 在 `conn_info_map` 中查找,以便用连接的远程 IP 地址和端口丰富 TLS 事件
这将捕获连接建立的实际 IP 地址——解析主机名背后的 IP。
## 项目结构
```
ebpf-tls-tracer/
├── include/
│ └── tracer.h # Shared data structures (kernel + user space)
├── src/
│ ├── bpf_program.c # eBPF kernel probes (compiled to BPF bytecode)
│ └── tls_tracer.c # User-space CLI tool
├── tests/
│ └── test_tracer.c # Unit tests
├── deploy/
│ └── kubernetes/
│ ├── namespace.yaml # Namespace definition
│ ├── rbac.yaml # ServiceAccount and RBAC
│ └── daemonset.yaml # DaemonSet for per-node deployment
├── .github/
│ └── workflows/
│ └── build.yml # CI: build, test, functional test, Docker publish
├── helm/
│ └── tls-tracer/ # Helm chart for Kubernetes deployment
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
├── Dockerfile # Multi-stage build (Debian trixie)
├── Makefile # Build system
├── LICENSE # MIT License
└── README.md
```
## 许可证
MIT 许可证。详见 [LICENSE](LICENSE)。
标签:API集成, CLI, DLL注入, Docker镜像, IP 地址批量处理, Kprobe, Linux内核, OpenSSL, TLS/SSL, Uprobe, WiFi技术, 内核态编程, 协议分析, 可观测性, 子域名突变, 客户端加密, 明文抓包, 权限提升, 流量审计, 流量拦截, 网络安全, 请求拦截, 逆向工具, 防御绕过, 隐私保护, 隐私合规检测