
我们在香港数据中心日常运维中,时常发现某些主机CPU占用飙升,但日志却无明显异常。这些“隐身”的入侵方式,往往绕过了传统的用户空间检测体系——无论是 Web 日志、Netflow,甚至 IDS 都无法捕捉。于是我开始研究如何借助 eBPF,从内核空间直接追踪 Socket 层连接行为,第一时间识别可疑活动并与已有IP信誉库、行为模型联动。
本文将围绕实际部署场景展开,详细讲述在香港高防服务器中如何用 eBPF 构建“Socket行为感知 + 动态响应”的实时威胁捕捉体系。
一、部署目标与核心组件
我们最终希望达到:
- 追踪所有 TCP/UDP socket 创建、连接、关闭行为
- 捕捉连接时的五元组(src/dst IP, port, protocol, timestamp)
- 实时判断连接是否异常(如突增、目标端口集中、连接持续时间极短)
- 将可疑连接IP即时写入高防封禁策略(iptables/ipset/Cloudflare API)
架构如下:
[eBPF kprobe] ---> [Perf Buffer] ---> [userspace Go/Rust/Python程序]
|
+----v-----+
| 特征判断 |
+----+-----+
|
+---------v---------+
| 写入Redis + ipset |
+-------------------+
二、环境准备:BCC/BPFTrace vs libbpf CO-RE
我们选用了 libbpf + BCC(Python绑定) 方案进行快速验证,未来打算迁移至 CO-RE 方式提升可移植性。
安装 BCC 工具集(Ubuntu 20.04+)
apt-get install bpfcc-tools linux-headers-$(uname -r)
pip install bcc
三、核心 eBPF 代码:追踪 socket 连接行为
3.1 TCP connect 事件追踪(IPv4)
我们使用 kprobe/tcp_v4_connect 捕捉所有 TCP 外发连接:
from bcc import BPF
import socket, struct
bpf_text = """
#include <net/sock.h>
#include <net/inet_sock.h>
int trace_connect(struct pt_regs *ctx, struct sock *sk) {
u32 pid = bpf_get_current_pid_tgid() >> 32;
struct inet_sock *inet = inet_sk(sk);
u32 daddr = inet->inet_daddr;
u16 dport = ntohs(inet->inet_dport);
u16 sport = ntohs(inet->inet_sport);
bpf_trace_printk("PID:%d SRC:%d DPORT:%d\\n", pid, sport, dport);
return 0;
}
"""
b = BPF(text=bpf_text)
b.attach_kprobe(event="tcp_v4_connect", fn_name="trace_connect")
3.2 捕获输出并分析行为特征
while True:
try:
line = b.trace_readline()
print("[eBPF]", line)
# 提取IP与端口等字段
# 可加入 Redis 或日志系统
except KeyboardInterrupt:
break
四、行为识别逻辑设计
我们设计了以下判定策略:
| 异常特征 | 检测方式 | 响应动作 |
|---|---|---|
| 单IP单位时间连接数暴增 | 使用 Redis + Lua 滑动窗口计数 | 标记为可疑,进入观察名单 |
| 连接目标端口集中 | 聚合 dst_port 出现频率 | 疑似端口扫描,立即封禁 |
| 短连接快速关闭 | 结合 tcp_close 检测生命周期 |
与Bot行为高度吻合,强烈标记 |
| 异常地理位置 | 调用 IP 地理库进行归属地判断 | 跨境IP突发接入,需进一步分析 |
示例 Lua 脚本(滑动时间窗):
-- key: conn:ip:1.2.3.4, value: timestamp list
redis.call("ZADD", key, now_ts, now_ts)
redis.call("ZREMRANGEBYSCORE", key, 0, now_ts - 60)
local count = redis.call("ZCARD", key)
if count > 100 then return "suspicious" end
五、联动响应机制(实时防御)
5.1 联动 ipset + iptables 实现秒级封禁
ipset create epbf_detected hash:ip timeout 300
iptables -I INPUT -m set --match-set epbf_detected src -j DROP
eBPF 用户空间代码一旦判定IP异常,立即调用:
ipset add epbf_detected 1.2.3.4 timeout 300
5.2 联动 Cloudflare API 进行 L7 层拦截
对接 Cloudflare WAF 封禁规则:
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone}/firewall/access_rules/rules" \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
--data '{
"mode":"block",
"configuration":{"target":"ip","value":"1.2.3.4"},
"notes":"eBPF标记封禁"
}'
六、实战效果与数据回顾
在启用 eBPF Socket 行为追踪后,我们在一次针对支付网关的灰产攻击中捕获如下行为:
- 94%的恶意IP具有 连接目标端口集中度高 的特征
- 73%的攻击连接持续时间 低于 0.2 秒
- 触发行为响应后,攻击流量在 30秒内下降约82%
通过结合 eBPF 提供的第一手连接行为数据,我们成功实现了对“新型自动化灰产请求”的精准识别与响应,补上了传统日志与WAF检测盲区。
七、下一步方向
- 使用 libbpf + CO-RE 模型脱离内核版本依赖
- 结合 eBPF Maps 与 LSM hook 实现深度系统调用行为追踪
- 与 Kafka/ClickHouse 对接,形成长周期攻击画像
eBPF 不只是性能调优利器,更是入侵检测和系统可观测性的未来核心技术。在香港这种高风险入口节点环境中,只有深入内核、实时响应,才能与新型攻击博弈。在我实测中,它为原本“看不到”的攻击行为提供了关键链路,让入侵识别进入了毫秒级。











