温馨提示×

Ubuntu Sniffer如何定制检测规则

小樊
46
2025-12-27 16:14:40
栏目: 智能运维

Ubuntu 下定制嗅探检测规则的实用方案

在 Ubuntu 上,常见的“嗅探器”可分为两类:一类是面向入侵检测/防御的Snort(可写规则进行模式匹配与告警),另一类是面向抓包与过滤的tcpdump/Wireshark/Scapy(通过 BPF 或显示过滤器定制“捕获/显示”规则)。下面分别给出可落地的规则定制方法与示例。

Snort 规则定制

  • 规则结构与关键要素
    • 行为:alert / log / pass / activate / dynamic(常用为 alert 与 log)。
    • 协议:仅支持一种,如 tcp / udp / icmp / ip
    • 源/目的:IP 可用 any / 192.168.1.0/24 / !192.168.1.0/24;端口可用 80 / 1:1024 / :1024 / 1025: / any
    • 方向:->(单向),<>(双向);不支持 <-
    • 常用选项:msg(告警信息)、sid(规则唯一编号,建议从100000以后使用)、以及内容匹配等。
  • 变量与文件组织
    • 在配置中定义网络变量,如:var HOME_NET 192.168.1.0/24;也可定义端口变量并在规则中引用。
    • 自定义规则建议写入:/etc/snort/rules/local.rules,便于维护与加载。
  • 快速示例(写入 local.rules)
    • 告警访问本机 HTTP(80)FTP(21),以及对本机的 ICMP 探测:
      var HOME_NET 192.168.1.0/24
      
      alert tcp any any -> $HOME_NET 80 (msg:"HTTP access detected"; sid:1000001;)
      alert tcp any any -> $HOME_NET 21 (msg:"FTP access detected"; sid:1000002;)
      alert icmp any any -> $HOME_NET any (msg:"ICMP probe detected"; sid:1000003;)
      
  • 运行与验证
    • 以规则文件启动检测并将告警输出到目录:
      sudo snort -c /etc/snort/rules/local.rules -l /var/log/snort
      
    • 触发测试:从外部访问本机 80/21 端口或执行 ping;随后查看 /var/log/snort/alert 是否产生告警。
  • 安装与准备(如未安装)
    • 可使用发行版仓库安装:sudo apt-get install snort;或参考源码方式安装 DAQSnort3 以获得新特性与更好兼容性。

tcpdump BPF 捕获过滤定制

  • 基本捕获与保存
    • 指定接口监听:sudo tcpdump -i eth0;监听所有接口:sudo tcpdump -i any
    • 保存为 pcap 文件以便后续分析:sudo tcpdump -i eth0 -w capture.pcap
  • BPF 捕获过滤语法(在抓包阶段生效,减少无关流量)
    • 按端口:port 80;多端口:port 443 or port 53
    • 按协议:tcp / udp / icmp
    • 按 IP:src 192.168.1.100dst 192.168.1.1
    • 组合条件:src 192.168.1.100 and dst port 80
  • 读取与分析
    • 读取文件:sudo tcpdump -r capture.pcap;结合过滤:sudo tcpdump -r capture.pcap port 80
    • 常用选项:-nn(不解析主机/端口名)、-s 0(抓全包)、-c 100(抓满 100 个包后停止)。
  • 提示
    • BPF 是“捕获过滤”,只影响抓到的内容;若需更细粒度“显示过滤”,可在 Wireshark 中使用显示过滤器(如 http.request.method == GET)。

进阶 使用 Scapy 编写自定义嗅探脚本

  • 适用场景:需要按更灵活的逻辑(如特定载荷、会话状态、跨包特征)进行匹配与处理。
  • 示例脚本(检测 HTTP GET 请求)
    #!/usr/bin/env python3
    from scapy.all import *
    
    def pkt_callback(pkt):
        if pkt.haslayer(TCP) and pkt.haslayer(Raw):
            payload = pkt[Raw].load.decode(errors="ignore")
            if "GET /" in payload:
                print(f"[+] HTTP GET detected: {pkt[IP].src}:{pkt[TCP].sport} -> {pkt[IP].dst}:{pkt[TCP].dport}")
    
    sniff(iface="eth0", prn=pkt_callback, store=False)
    
  • 运行方式
    • 保存为 sniff_http.py,赋予执行权限并运行:sudo python3 sniff_http.py(需 sudo 以访问网卡)。

合规与安全提示

  • 仅在获得授权的网络/主机上进行抓包与检测;捕获文件可能包含敏感信息,请妥善存储与清理。
  • 高流量环境下建议通过过滤器缩小范围,避免CPU/内存/磁盘资源被占满。

0