C 语言是怎么抓取网口流量的数据包并解析的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mikywei
V2EX    C

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

  •  
  •   mikywei 2020-09-22 16:06:37 +08:00 4670 次点击
    这是一个创建于 1863 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     5793 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 02:40 PVG 10:40 LAX 19:40 JFK 22:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86