土法炼钢兴趣小组的算法知识备份

【网络工程】网络入侵检测与防御:Suricata、签名与异常检测

文章导航

分类入口
network
标签入口
#ids#ips#suricata#snort#network-security#intrusion-detection

目录

WAF 工作在 HTTP 层,只看 Web 请求。但网络攻击远不止 Web——端口扫描、暴力破解、恶意软件通信、横向移动——这些都需要在网络层进行全流量检测。IDS(Intrusion Detection System,入侵检测系统)和 IPS(Intrusion Prevention System,入侵防御系统)是在网络流量中识别恶意行为的核心工具。

一、IDS 与 IPS 的工程差异

1.1 部署模式

IDS 和 IPS 的核心区别不在检测能力,而在部署位置处理方式

IDS(旁路检测)                    IPS(串联阻断)

    流量                              流量
     │                                 │
     ├───→ 交换机镜像口                  │
     │         │                       ↓
     ↓         ↓                ┌──────────┐
  目标主机    IDS               │   IPS     │
              │                 │  检测+阻断 │
           只检测、告警           └─────┬────┘
           不影响流量                   │
                                      ↓
                                  目标主机

工程权衡对比

维度 IDS(检测模式) IPS(防御模式)
部署方式 旁路(TAP / SPAN) 串联(Inline)
对流量影响 增加延迟(微秒–毫秒级)
误报后果 告警噪音 阻断合法流量(业务中断)
漏报后果 攻击未被发现 攻击未被发现
故障影响 IDS 宕机不影响业务 IPS 宕机可能中断流量
性能要求 可容忍丢包 不能丢包
适用阶段 初期部署、调优期 规则成熟后

实际工程中,通常先以 IDS 模式部署和调优规则,确认误报率可控后再切换到 IPS 模式。Suricata 同时支持两种模式。

1.2 检测方法论

入侵检测有两大类方法:

基于签名的检测(Signature-based):将流量与已知攻击特征(签名)进行匹配。类似杀毒软件的病毒库——精度高但只能检测已知攻击。

基于异常的检测(Anomaly-based):建立正常流量的基线,偏离基线的行为被标记为异常。可以检测未知攻击,但误报率高、基线建立困难。

基于签名                          基于异常

已知攻击特征库                     正常行为基线
     ↓                                ↓
流量 → 模式匹配                   流量 → 统计分析
     ↓                                ↓
匹配 → 告警                      偏离 → 告警

优点:精度高、可解释              优点:能检测未知攻击
缺点:无法检测 0-day             缺点:误报率高

二、Suricata 架构与部署

2.1 为什么选择 Suricata

Suricata 是目前最主流的开源 IDS/IPS 引擎。相比老牌 Snort,它的核心优势是多线程架构

特性 Snort 2.x Snort 3.x Suricata
线程模型 单线程 多线程 多线程
规则兼容 Snort 格式 Snort 格式(改进) 兼容 Snort + 扩展
应用层协议解析 有限 改进 丰富(HTTP/TLS/DNS/SSH/SMB…)
文件提取 有限 支持 原生支持
输出格式 Unified2 多种 Eve JSON(推荐)
Lua 脚本 有限 支持 原生支持
社区规则 ET 规则 ET + Snort 规则 ET 规则(默认)

2.2 Suricata 的多线程架构

                    ┌──────────────────────────────────┐
                    │       Suricata 多线程架构         │
                    └──────────────────────────────────┘

网络流量 ──→ ┌──────────────┐
             │  抓包线程     │  AF_PACKET / Netmap / DPDK
             │ (Capture)    │  每个网卡接口一组
             └──────┬───────┘
                    │
             ┌──────┴───────┐
             │  Flow Worker  │  多个 Worker 线程
             │  线程池       │  每个线程独立处理一组流
             ├──────────────┤
             │ • 解码        │
             │ • 流追踪      │
             │ • 协议解析    │
             │ • 签名匹配    │
             │ • 告警生成    │
             └──────┬───────┘
                    │
             ┌──────┴───────┐
             │  输出线程     │
             │ (Output)     │  Eve JSON / Unified2 / 文件提取
             └──────────────┘

Flow 分配机制:同一条流(五元组相同)的所有包被分配到同一个 Worker 线程。这避免了跨线程的状态同步,同时利用了 CPU 缓存局部性。

2.3 安装与基础配置

# Ubuntu 22.04 安装 Suricata
apt-get install -y software-properties-common
add-apt-repository -y ppa:oisf/suricata-stable
apt-get update
apt-get install -y suricata suricata-update

# 查看版本
suricata --build-info | head -5

核心配置文件

# /etc/suricata/suricata.yaml 关键配置

# 网络定义
vars:
  address-groups:
    HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
    EXTERNAL_NET: "!$HOME_NET"
    DNS_SERVERS: "$HOME_NET"
    HTTP_SERVERS: "$HOME_NET"
  port-groups:
    HTTP_PORTS: "80"
    SHELLCODE_PORTS: "!80"
    SSH_PORTS: "22"

# 抓包引擎(推荐 AF_PACKET)
af-packet:
  - interface: eth0
    threads: auto           # 自动匹配 CPU 核数
    cluster-id: 99
    cluster-type: cluster_flow  # 按流分配到线程
    defrag: yes
    use-mmap: yes           # 使用 mmap 减少拷贝
    ring-size: 200000       # 环形缓冲区大小
    buffer-size: 32768

# 多线程配置
threading:
  set-cpu-affinity: yes     # 启用 CPU 亲和
  cpu-affinity:
    - management-cpu-set:
        cpu: [0]
    - receive-cpu-set:
        cpu: [1]
    - worker-cpu-set:
        cpu: [2, 3, 4, 5, 6, 7]
        mode: exclusive

# 输出配置
outputs:
  - eve-log:
      enabled: yes
      filetype: regular
      filename: eve.json
      types:
        - alert:
            payload: yes           # 包含触发 payload
            payload-printable: yes # 可打印格式
            http-body: yes         # 包含 HTTP body
            http-body-printable: yes
        - http:
            extended: yes          # 完整 HTTP 日志
        - dns
        - tls:
            extended: yes
        - files:
            force-magic: yes       # 文件类型检测
            force-hash: [md5, sha256]
        - flow
        - stats:
            totals: yes
            threads: yes

2.4 规则更新

# 使用 suricata-update 管理规则
suricata-update

# 启用 ET Open 规则(默认)
suricata-update enable-source et/open

# 启用其他规则源
suricata-update enable-source oisf/trafficid
suricata-update enable-source ptresearch/attackdetection

# 查看可用规则源
suricata-update list-sources

# 更新规则后重载 Suricata(不中断服务)
suricatasc -c reload-rules

# 定时更新(crontab)
# 0 */6 * * * /usr/bin/suricata-update && /usr/bin/suricatasc -c reload-rules

三、Suricata 规则编写

3.1 规则语法

Suricata 兼容 Snort 规则格式,并在此基础上做了扩展:

# 规则基本格式
action protocol source_ip source_port -> dest_ip dest_port (options)

# 各部分说明:
# action:    alert | pass | drop | reject | rejectsrc | rejectdst | rejectboth
# protocol:  tcp | udp | icmp | ip | http | dns | tls | ssh | ftp | smtp ...
# 方向:      ->(单向)| <>(双向)
# options:   关键词=值; 组成的检测逻辑

示例规则集合

# 1. 检测 SSH 暴力破解
alert ssh $EXTERNAL_NET any -> $HOME_NET 22 (\
    msg:"SSH Brute Force Attempt"; \
    flow:to_server,established; \
    threshold: type both, track by_src, count 5, seconds 60; \
    classtype:attempted-admin; \
    sid:1000001; rev:1;)

# 2. 检测可疑的 DNS 查询(DGA 域名特征)
alert dns $HOME_NET any -> any any (\
    msg:"Suspicious DNS Query - Possible DGA Domain"; \
    dns.query; \
    pcre:"/^[a-z]{15,30}\.(com|net|org|info)$/i"; \
    threshold: type threshold, track by_src, count 10, seconds 300; \
    classtype:trojan-activity; \
    sid:1000002; rev:1;)

# 3. 检测 HTTP 中的 Web Shell 上传
alert http $EXTERNAL_NET any -> $HTTP_SERVERS any (\
    msg:"Web Shell Upload Detected"; \
    flow:to_server,established; \
    http.method; content:"POST"; \
    http.uri; content:"/upload"; \
    file.data; content:"<?php"; \
    file.data; content:"eval("; distance:0; \
    classtype:web-application-attack; \
    sid:1000003; rev:1;)

# 4. 检测 TLS 证书中的可疑 CN(常见恶意软件特征)
alert tls $HOME_NET any -> $EXTERNAL_NET any (\
    msg:"Suspicious TLS Certificate - Self-Signed with random CN"; \
    flow:established,to_server; \
    tls.cert_subject; \
    pcre:"/CN=[a-f0-9]{32,}/i"; \
    classtype:trojan-activity; \
    sid:1000004; rev:1;)

# 5. 检测 ICMP 隧道(大于正常大小的 ICMP 包)
alert icmp $HOME_NET any -> any any (\
    msg:"Possible ICMP Tunnel - Oversized ICMP Packet"; \
    dsize:>512; \
    itype:8; \
    threshold: type both, track by_src, count 20, seconds 60; \
    classtype:misc-activity; \
    sid:1000005; rev:1;)

3.2 应用层关键词

Suricata 的最大优势之一是丰富的应用层协议解析关键词:

# HTTP 关键词
http.method;           # HTTP 方法
http.uri;              # 请求 URI(归一化后)
http.uri.raw;          # 请求 URI(原始)
http.host;             # Host 头
http.request_header;   # 请求头
http.response_header;  # 响应头
http.request_body;     # 请求体
http.response_body;    # 响应体
http.stat_code;        # 响应状态码
http.content_type;     # Content-Type
http.user_agent;       # User-Agent
file.data;             # 上传文件内容

# DNS 关键词
dns.query;             # DNS 查询域名
dns.opcode;            # 操作码

# TLS 关键词
tls.version;           # TLS 版本
tls.subject;           # 证书 Subject
tls.issuerdn;          # 证书颁发者
tls.sni;               # SNI(Server Name Indication)
tls.cert_serial;       # 证书序列号
tls.ja3.hash;          # JA3 指纹(客户端)
tls.ja3s.hash;         # JA3S 指纹(服务端)

# SSH 关键词
ssh.proto;             # SSH 协议版本
ssh.software;          # SSH 软件标识

3.3 JA3/JA3S TLS 指纹

JA3 是通过 TLS ClientHello 中的参数生成的客户端指纹。相同的 TLS 库/应用通常产生相同的 JA3 hash,即使 IP 地址变化。这在恶意软件检测中非常有价值:

JA3 指纹计算:
MD5(TLSVersion + Ciphersuites + Extensions + 
    EllipticCurves + EllipticCurvePointFormats)

例如 Trickbot 恶意软件的 JA3 hash:
72a589da586844d7f0818ce684948eea

正常 Chrome 浏览器的 JA3 hash:
473cd7cb9faa642487833865d516e578

基于 JA3 的检测规则

# 检测已知恶意软件的 JA3 指纹
alert tls $HOME_NET any -> $EXTERNAL_NET any (\
    msg:"Known Malware JA3 Fingerprint - Trickbot"; \
    flow:established,to_server; \
    ja3.hash; \
    content:"72a589da586844d7f0818ce684948eea"; \
    classtype:trojan-activity; \
    sid:1000010; rev:1;)

# 检测非浏览器 TLS 连接到标准 HTTPS 端口
# 排除已知合法 JA3 hash
alert tls $HOME_NET any -> $EXTERNAL_NET 443 (\
    msg:"Non-Browser TLS Connection to HTTPS Port"; \
    flow:established,to_server; \
    ja3.hash; \
    content:!"473cd7cb9faa642487833865d516e578"; \
    content:!"b32309a26951912be7dba376398abc3b"; \
    threshold: type threshold, track by_src, count 50, seconds 300; \
    classtype:policy-violation; \
    sid:1000011; rev:1;)

3.4 Lua 脚本扩展

当 Suricata 内置关键词无法满足检测需求时,可以使用 Lua 脚本实现复杂逻辑:

-- /etc/suricata/lua/detect_dns_tunnel.lua
-- 检测 DNS 隧道:查询名的信息熵过高

function init(args)
    local needs = {}
    needs["dns.rrname"] = tostring(true)
    return needs
end

function match(args)
    local rrname = tostring(args["dns.rrname"])
    if rrname == nil then return 0 end
    
    -- 计算域名标签的香农熵
    local label = rrname:match("^([^.]+)")
    if label == nil or #label < 10 then return 0 end
    
    local freq = {}
    for i = 1, #label do
        local c = label:sub(i, i)
        freq[c] = (freq[c] or 0) + 1
    end
    
    local entropy = 0
    for _, count in pairs(freq) do
        local p = count / #label
        entropy = entropy - p * math.log(p) / math.log(2)
    end
    
    -- 正常域名熵值通常 < 3.5
    -- DNS 隧道编码数据的熵值通常 > 4.0
    if entropy > 4.0 and #label > 20 then
        return 1
    end
    return 0
end

引用 Lua 脚本的规则

alert dns $HOME_NET any -> any any (\
    msg:"DNS Tunnel Detected - High Entropy Query"; \
    lua:detect_dns_tunnel.lua; \
    classtype:trojan-activity; \
    sid:1000020; rev:1;)

四、流量基线与异常检测

4.1 建立流量基线

异常检测的前提是理解”正常”流量。以下是建立网络流量基线的方法论:

# 使用 Suricata 的 stats 输出建立基线
# Eve JSON 中 event_type: stats 的数据

# 关键基线指标
# 1. 每秒数据包数(PPS)
# 2. 每秒字节数(BPS)
# 3. 每秒新建 TCP 流数
# 4. DNS 查询速率
# 5. HTTP 请求速率
# 6. 各协议流量占比

# 从 Suricata stats 中提取基线数据
cat /var/log/suricata/eve.json | \
    python3 -c "
import sys, json

for line in sys.stdin:
    try:
        ev = json.loads(line)
        if ev.get('event_type') == 'stats':
            stats = ev.get('stats', {})
            cap = stats.get('capture', {})
            decoder = stats.get('decoder', {})
            flow = stats.get('flow', {})
            
            print(f\"Timestamp: {ev.get('timestamp')}\")
            print(f\"  Packets: {cap.get('kernel_packets', 0)}\")
            print(f\"  Drops:   {cap.get('kernel_drops', 0)}\")
            print(f\"  TCP:     {decoder.get('tcp', 0)}\")
            print(f\"  UDP:     {decoder.get('udp', 0)}\")
            print(f\"  Flows:   {flow.get('tcp', 0)} TCP, {flow.get('udp', 0)} UDP\")
            print()
    except:
        pass
" | head -60

4.2 异常检测模型

# 基于统计的异常检测示例
# 使用移动平均 + 标准差的方法

import json
import sys
from collections import deque
import math

class AnomalyDetector:
    def __init__(self, window_size=60, threshold_sigma=3):
        self.window = deque(maxlen=window_size)
        self.threshold_sigma = threshold_sigma
    
    def update(self, value):
        self.window.append(value)
        
        if len(self.window) < 10:
            return False, 0  # 数据不足
        
        mean = sum(self.window) / len(self.window)
        variance = sum((x - mean) ** 2 for x in self.window) \
                   / len(self.window)
        std = math.sqrt(variance)
        
        if std == 0:
            return False, 0
        
        z_score = (value - mean) / std
        is_anomaly = abs(z_score) > self.threshold_sigma
        
        return is_anomaly, z_score

# 监控 DNS 查询速率
dns_detector = AnomalyDetector(window_size=120, threshold_sigma=3)

for line in sys.stdin:
    try:
        ev = json.loads(line)
        if ev.get('event_type') == 'stats':
            dns_count = ev['stats'].get('app_layer', {}) \
                        .get('flow', {}).get('dns_tcp', 0) + \
                        ev['stats'].get('app_layer', {}) \
                        .get('flow', {}).get('dns_udp', 0)
            
            is_anomaly, z_score = dns_detector.update(dns_count)
            if is_anomaly:
                print(f"ANOMALY: DNS query rate z-score={z_score:.2f}"
                      f" value={dns_count}"
                      f" at {ev.get('timestamp')}")
    except:
        pass

4.3 常见异常检测场景

检测场景 基线指标 异常判定 可能原因
DNS 隧道 DNS 查询速率、查询名长度 查询速率突增 + 查询名异常长 数据外泄
端口扫描 每 IP 目标端口数 短时间访问 >20 端口 侦察活动
暴力破解 每 IP 认证失败次数 1 分钟内 >10 次失败 账户攻击
C&C 通信 出站连接的时间规律性 周期性连接到同一目标 恶意软件
数据外泄 出站流量大小 非业务时段的大量上传 数据泄露
ARP 欺骗 ARP 响应频率 短时间大量 ARP 响应 中间人攻击

五、Eve JSON 日志分析

5.1 Eve JSON 格式

Suricata 的 Eve JSON 是其最核心的输出格式——一个 JSON Lines 文件,每行一个事件。事件类型包括 alert、http、dns、tls、flow、stats 等。

// alert 事件示例
{
  "timestamp": "2025-01-15T10:23:45.123456+0800",
  "event_type": "alert",
  "src_ip": "198.51.100.5",
  "src_port": 45678,
  "dest_ip": "192.168.1.10",
  "dest_port": 80,
  "proto": "TCP",
  "alert": {
    "action": "allowed",
    "gid": 1,
    "signature_id": 2024897,
    "rev": 3,
    "signature": "ET WEB_SERVER SQL Injection Attempt",
    "category": "Web Application Attack",
    "severity": 1
  },
  "http": {
    "hostname": "example.com",
    "url": "/search?q=1'+OR+1=1--",
    "http_method": "GET",
    "http_user_agent": "Mozilla/5.0",
    "status": 200,
    "length": 4523
  },
  "payload": "R0VUIC9zZWFyY2g/cT0...",
  "payload_printable": "GET /search?q=1' OR 1=1--...",
  "flow_id": 1234567890,
  "pcap_cnt": 42
}

5.2 日志分析实战

# 告警统计——按签名分组
cat /var/log/suricata/eve.json | \
    jq -r 'select(.event_type=="alert") | .alert.signature' | \
    sort | uniq -c | sort -rn | head -20

# 按源 IP 统计告警数
cat /var/log/suricata/eve.json | \
    jq -r 'select(.event_type=="alert") | .src_ip' | \
    sort | uniq -c | sort -rn | head -20

# 按严重级别统计
cat /var/log/suricata/eve.json | \
    jq -r 'select(.event_type=="alert") | .alert.severity | tostring' | \
    sort | uniq -c | sort -rn

# 查看特定 IP 的所有告警
cat /var/log/suricata/eve.json | \
    jq 'select(.event_type=="alert" and .src_ip=="198.51.100.5")' | head -50

# TLS 证书信息提取
cat /var/log/suricata/eve.json | \
    jq -r 'select(.event_type=="tls") | 
    [.dest_ip, .tls.sni // "N/A", .tls.subject // "N/A", 
     .tls.ja3.hash // "N/A"] | @tsv' | head -20

# DNS 查询统计——找出查询最多的域名
cat /var/log/suricata/eve.json | \
    jq -r 'select(.event_type=="dns" and .dns.type=="query") | 
    .dns.rrname' | sort | uniq -c | sort -rn | head -30

5.3 SIEM 集成

Suricata ──→ Eve JSON ──→ ┌─────────────┐
                          │ Filebeat    │ ← 日志采集
                          └──────┬──────┘
                                 │
                          ┌──────┴──────┐
                          │ Logstash /  │ ← 解析与丰富
                          │ Ingest Node │
                          └──────┬──────┘
                                 │
                          ┌──────┴──────┐
                          │ Elastic-    │ ← 存储与索引
                          │ search      │
                          └──────┬──────┘
                                 │
                          ┌──────┴──────┐
                          │ Kibana /    │ ← 可视化与告警
                          │ Grafana     │
                          └─────────────┘

Filebeat 配置

# /etc/filebeat/filebeat.yml
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/suricata/eve.json
    json.keys_under_root: true
    json.add_error_key: true

output.elasticsearch:
  hosts: ["http://elasticsearch:9200"]
  index: "suricata-%{+yyyy.MM.dd}"

# Suricata 模块(推荐,自动处理字段映射)
# filebeat modules enable suricata

六、性能调优与容量规划

6.1 性能瓶颈分析

# 检查 Suricata 是否有丢包
cat /var/log/suricata/eve.json | \
    jq 'select(.event_type=="stats") | 
    {timestamp, 
     kernel_packets: .stats.capture.kernel_packets,
     kernel_drops: .stats.capture.kernel_drops,
     drop_rate: ((.stats.capture.kernel_drops // 0) * 100.0 / 
                 ((.stats.capture.kernel_packets // 1) | if . == 0 then 1 else . end))}' | \
    tail -5

# 丢包率 > 1% 需要关注
# 丢包率 > 5% 需要立即优化

常见瓶颈与优化

瓶颈 表现 优化措施
CPU 不足 丢包率高、Worker 线程 CPU 饱和 增加 Worker 线程、减少规则数
内存不足 流表溢出、内存 OOM 增加内存、调整流超时
抓包丢包 kernel_drops 增长 增大 ring-size、使用 AF_PACKET mmap
规则过多 签名匹配耗时长 禁用无关规则、优化规则顺序
磁盘 I/O 日志写入延迟 使用 SSD、异步写入

6.2 关键调优参数

# /etc/suricata/suricata.yaml 性能调优

# 流管理
flow:
  memcap: 256mb           # 流表内存上限
  hash-size: 65536        # 哈希表大小(2^n)
  prealloc: 10000         # 预分配流条目

# 流超时(减小以降低内存使用)
flow-timeouts:
  default:
    new: 30
    established: 300
    closed: 0
    bypassed: 100
    emergency-new: 10
    emergency-established: 100
    emergency-closed: 0

# 协议解析层内存限制
app-layer:
  protocols:
    http:
      memcap: 64mb
      request-body-limit: 131072      # 只检查前 128KB
      response-body-limit: 131072
    dns:
      memcap: 16mb
    tls:
      memcap: 32mb
      encryption-handling: bypass     # TLS 握手后绕过检测
    smtp:
      enabled: no                     # 不需要时禁用
    ftp:
      enabled: no

# 签名引擎调优
detect:
  profile: high                       # high / medium / low / custom
  sgh-mpm-context: auto
  inspection-recursion-limit: 3000

# 规则分组和预过滤
# Suricata 自动将规则按协议/端口分组
# 使用 prefilter 加速匹配
  prefilter:
    default: mpm                      # Multi-Pattern Matcher

6.3 容量规划参考

经验法则:
- 1 Gbps 线速检测 ≈ 4 核 CPU + 8 GB 内存
- 10 Gbps 线速检测 ≈ 16 核 CPU + 32 GB 内存
- 40 Gbps 线速检测 ≈ 需要 DPDK/Netmap 抓包模式

内存估算:
- 每条活跃流 ≈ 1–4 KB
- 10 万并发流 ≈ 400 MB
- 规则集(ET Open 约 30,000 条)≈ 500 MB 编译后
- 协议解析缓冲 ≈ 根据 memcap 设置

磁盘估算(Eve JSON):
- 每条告警日志 ≈ 1–2 KB
- 完整 HTTP 日志 ≈ 500 字节/请求
- 1 Gbps 流量全日志 ≈ 50–200 GB/天
- 建议使用日志轮转 + 30 天保留

6.4 高可用部署

                    ┌───────────────────────┐
                    │    网络 TAP / SPAN    │
                    │    (流量镜像)          │
                    └────────┬──────────────┘
                             │
                    ┌────────┴──────────┐
                    │  负载均衡 TAP     │
                    │  (按流分发)       │
                    └──┬────────────┬───┘
                       │            │
              ┌────────┴───┐  ┌────┴────────┐
              │ Suricata 1 │  │ Suricata 2  │
              │ (主)       │  │ (备/扩展)    │
              └─────┬──────┘  └──────┬──────┘
                    │                │
              ┌─────┴────────────────┴─────┐
              │       Elasticsearch        │
              │    (集中日志存储与分析)      │
              └────────────────────────────┘

七、IDS/IPS 运维检查清单

检查项 频率 方法
规则更新 每日 suricata-update + reload-rules
丢包率检查 每小时 监控 kernel_drops
告警分诊 每日 按严重级别和类型分组分析
误报审核 每周 抽样检查 severity 1 告警
规则有效性测试 每月 回放已知攻击 pcap
性能基线对比 每月 对比 PPS、CPU、内存趋势
规则集瘦身 季度 禁用 0 命中规则
签名覆盖评估 季度 对照 MITRE ATT&CK 矩阵
# 查看规则命中统计(识别无用规则)
cat /var/log/suricata/eve.json | \
    jq -r 'select(.event_type=="alert") | .alert.signature_id' | \
    sort | uniq -c | sort -rn > /tmp/rule_hits.txt

# 获取所有已加载规则的 SID
grep -oP 'sid:\K\d+' /var/lib/suricata/rules/*.rules | \
    sort -u > /tmp/all_sids.txt

# 找出 0 命中的规则(候选禁用)
comm -23 /tmp/all_sids.txt \
    <(awk '{print $2}' /tmp/rule_hits.txt | sort -u) | \
    wc -l
echo "条规则在过去一段时间内零命中"

参考文献

  1. OISF, “Suricata User Guide,” suricata.readthedocs.io.
  2. OISF, “Suricata Rule Documentation,” suricata.readthedocs.io/en/latest/rules/.
  3. Albin, E., and Rowe, N.C., “A Realistic Experimental Comparison of the Suricata and Snort Intrusion-Detection Systems,” IEEE WAINA, 2012.
  4. Salesforce Engineering, “Open Sourcing JA3: SSL/TLS Client Fingerprinting,” engineering.salesforce.com, 2017.
  5. Proofpoint, “Emerging Threats Open Ruleset,” rules.emergingthreats.net.
  6. MITRE ATT&CK, “Network-Based Detection Techniques,” attack.mitre.org.
  7. Elastic, “Suricata Module for Filebeat,” elastic.co/guide/en/beats/filebeat.
  8. Stamus Networks, “Suricata Performance Tuning,” stamus-networks.com.

上一篇: WAF 工程:规则设计、误报控制与绕过防御 下一篇: VPN 技术工程对比:IPSec vs WireGuard vs OpenVPN

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2025-07-27 · network

【网络工程】DDoS 防御架构:容量型、协议型与应用层攻击

DDoS 攻击分为容量型、协议型和应用层三大类,防御策略截然不同。本文从攻击分类学出发,系统讲解 SYN Flood 的 SYN Cookie 防御、UDP 反射放大的 BGP Flowspec 清洗、HTTP Flood 的速率限制与行为分析,以及 Anycast 清洗中心的工作原理,构建从边缘到源站的多层 DDoS 防御体系。

2025-07-28 · network

【网络工程】VPN 技术工程对比:IPSec vs WireGuard vs OpenVPN

VPN 是企业网络互联和远程访问的核心技术。本文从 IPSec 的 IKE/ESP/AH 协议栈、WireGuard 的 Cryptokey Routing 设计、OpenVPN 的 TLS 隧道模型,到三者在性能、安全、运维复杂度上的工程对比,系统讲解 VPN 技术的选型与部署实践。

2026-04-22 · network

网络工程索引

汇总本站网络工程系列文章,覆盖分层模型、以太网、IP、TCP、DNS、TLS、HTTP/2/3、CDN、BGP 与故障诊断。

2025-08-04 · network

【网络工程】QUIC 生态与工程部署:从实验到生产

QUIC 已经不是实验性协议——HTTP/3 标准化后,CDN、浏览器和主流服务端框架都在推进 QUIC 支持。本文从工程视角对比主流 QUIC 库的成熟度和性能特征,讲解 CDN/负载均衡器的 QUIC 适配方案、从 TCP 迁移到 QUIC 的渐进路径、QUIC 调试工具链,以及生产环境的部署陷阱和性能调优实践。


By .