V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mikywei
V2EX  ›  C

C 语言是怎么抓取网口流量的数据包并解析的?

  •  
  •   mikywei · 2020-09-22 16:06:37 +08:00 · 4202 次点击
    这是一个创建于 1528 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 现在很多的硬件盒子(路由器、防火墙、WAF 、网络审计)都是 php 的后台,这些硬件盒子也算服务器,但性能不高不大可能运行其它后台语言,但听说又是用 C 语言抓取网口流量,然后交给 php 处理的;
    2. 很好奇这些硬件盒子是怎么用 C 语言和 php 拿到网口流量的数据,一般我们抓包都是用 tcpdump 和 wireshark 才行,php 怎么拿到网卡数据的呢?
    3. C 语言和 php 是怎么解析网口的流量的呢?是先保存成 pcap 的数据包然后再用相关 php 函数进行解析?还是能实时抓到网口的数据实时解析出来呢?
    4. 关于解析:我说的解析就是把原本网口的流量还原成两个 ip 和端口相互通信的会话,然后再识别出这个会话的协议是 http 、ftp 、dns 、ssh 、telnet 、mysql 、icmp 或者其它的网络协议。
    19 条回复    2020-12-01 11:05:00 +08:00
    ripperdev
        1
    ripperdev  
       2020-09-22 16:17:05 +08:00
    实时抓取网卡数据包再解析的,C 语言有 libpcap 库,C++有 libtins 库。
    可以用 C/C++解析数据包,生成图表数据再提供给 PHP 展示用。
    Chenamy2017
        2
    Chenamy2017  
       2020-09-22 16:59:14 +08:00
    抓包处理用 C ( libpcap ),php 只是后台而已。
    sylar1015
        3
    sylar1015  
       2020-09-22 17:00:40 +08:00
    巧了,现有源码一套,实时 C 抓包、IP 组包,解析上层各种协议
    LANB0
        4
    LANB0  
       2020-09-22 17:07:29 +08:00
    原始套接字也算一个选择
    reus
        5
    reus  
       2020-09-22 17:17:48 +08:00
    PHP 的 web 服务器就直接用 socket api 啊,抓什么流量?
    w2exzz
        6
    w2exzz  
       2020-09-22 18:40:24 +08:00
    tcpdump 和 wireshark 也是 C 写的啊……
    所以 C 语言也能抓到流量……
    自己照着网上的教程写个 demo 就明白了
    mXw
        7
    mXw  
       2020-09-22 18:45:51 +08:00   ❤️ 1
    自己用 raw socket 摸一遍流程就懂了
    nomansky
        8
    nomansky  
       2020-09-22 18:59:28 +08:00
    1. 使用 DPI 深度包检测技术
    2. 底层一般都是调用 C 库
    3. 可以保存成文件,流量大的情况但一般都是用缓存做临时保存
    4. 根据协议特征分析,比如协议头、字段,握手等特征然后和特征库进行匹配
    janxin
        9
    janxin  
       2020-09-22 20:55:03 +08:00
    libpcap 抓取流量
    kangsheng9527
        10
    kangsheng9527  
       2020-09-22 21:21:14 +08:00
    netfilter 需要商业服务找我!
    no1xsyzy
        11
    no1xsyzy  
       2020-09-23 03:57:11 +08:00
    wireshark 的终端版本 tshark 看 --help,里面直接指明了 -f 选项用的是 libpcap 的语法。
    所以 libpcap 就成。
    chanchancl
        12
    chanchancl  
       2020-09-23 09:54:52 +08:00   ❤️ 1
    3: 内核在初始化和启动网卡的时候,从驱动层取得 skb 之后,向上层 tcp/ip 转移的时候,会有 dump 点,将收到的信息传给外部函数,而 tcpdump 用了相关的系统调用,就可以收到这些包。

    wireshark 用 libcap 去抓包,而 libcap 内的实现是建立 socket 时,指定一些参数,让数据包转发到自己的队列
    hasdream
        13
    hasdream  
       2020-09-23 14:48:04 +08:00
    c 库 libpcap pfring 解析后发到 MQ 或者 IPC php 接收处理
    hasdream
        14
    hasdream  
       2020-09-23 16:21:53 +08:00
    1. c 端一般做抓取 过滤协议
    2.然后就把 packet 发给下层处理 (如果逻辑耗时太长就出现 kernel drop 问题)
    3.下层 根据收到的 packet 根据需要 进行解析(比如 ip header 中的协议信息是在那个位置 rfc 中有说明)
    4.入库展示.
    mikywei
        15
    mikywei  
    OP
       2020-10-28 17:10:26 +08:00
    @reus 我的意识是经过服务器的流量,而不是访问 web 后台服务的 http 流量,这 php 应该无法直接获取吧。
    mikywei
        16
    mikywei  
    OP
       2020-10-28 17:14:01 +08:00
    @ripperdev 好的,感谢大佬;意思是说先用 C/C++保存成.pcap 文件,然后再用 php 的相关库去读取这个.pcap 文件吗?但是 IPS 入侵防御这种网络盒子可以实现阻断效果,应该不可能先保存成文件啊,应该有一种实时检测流量和丢弃流量的手段或 C/C++库。
    mikywei
        17
    mikywei  
    OP
       2020-10-28 17:36:00 +08:00
    @mXw 这是啥?能给个介绍的链接看下吗?
    ripperdev
        18
    ripperdev  
       2020-10-28 18:02:23 +08:00
    @mikywei 我说的这两种都是实时检测的,追求极致效率还可以考虑 PFRing 、DPDK 这两个库。
    mikywei
        19
    mikywei  
    OP
       2020-12-01 11:05:00 +08:00
    @ripperdev 好的感谢,我先了解下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1179 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:41 · PVG 02:41 · LAX 10:41 · JFK 13:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.