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

2020-09-22 16:06:37 +08:00
 mikywei
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 或者其它的网络协议。
4016 次点击
所在节点    C
19 条回复
ripperdev
2020-09-22 16:17:05 +08:00
实时抓取网卡数据包再解析的,C 语言有 libpcap 库,C++有 libtins 库。
可以用 C/C++解析数据包,生成图表数据再提供给 PHP 展示用。
Chenamy2017
2020-09-22 16:59:14 +08:00
抓包处理用 C ( libpcap ),php 只是后台而已。
sylar1015
2020-09-22 17:00:40 +08:00
巧了,现有源码一套,实时 C 抓包、IP 组包,解析上层各种协议
LANB0
2020-09-22 17:07:29 +08:00
原始套接字也算一个选择
reus
2020-09-22 17:17:48 +08:00
PHP 的 web 服务器就直接用 socket api 啊,抓什么流量?
w2exzz
2020-09-22 18:40:24 +08:00
tcpdump 和 wireshark 也是 C 写的啊……
所以 C 语言也能抓到流量……
自己照着网上的教程写个 demo 就明白了
mXw
2020-09-22 18:45:51 +08:00
自己用 raw socket 摸一遍流程就懂了
nomansky
2020-09-22 18:59:28 +08:00
1. 使用 DPI 深度包检测技术
2. 底层一般都是调用 C 库
3. 可以保存成文件,流量大的情况但一般都是用缓存做临时保存
4. 根据协议特征分析,比如协议头、字段,握手等特征然后和特征库进行匹配
janxin
2020-09-22 20:55:03 +08:00
libpcap 抓取流量
kangsheng9527
2020-09-22 21:21:14 +08:00
netfilter 需要商业服务找我!
no1xsyzy
2020-09-23 03:57:11 +08:00
wireshark 的终端版本 tshark 看 --help,里面直接指明了 -f 选项用的是 libpcap 的语法。
所以 libpcap 就成。
chanchancl
2020-09-23 09:54:52 +08:00
3: 内核在初始化和启动网卡的时候,从驱动层取得 skb 之后,向上层 tcp/ip 转移的时候,会有 dump 点,将收到的信息传给外部函数,而 tcpdump 用了相关的系统调用,就可以收到这些包。

wireshark 用 libcap 去抓包,而 libcap 内的实现是建立 socket 时,指定一些参数,让数据包转发到自己的队列
hasdream
2020-09-23 14:48:04 +08:00
c 库 libpcap pfring 解析后发到 MQ 或者 IPC php 接收处理
hasdream
2020-09-23 16:21:53 +08:00
1. c 端一般做抓取 过滤协议
2.然后就把 packet 发给下层处理 (如果逻辑耗时太长就出现 kernel drop 问题)
3.下层 根据收到的 packet 根据需要 进行解析(比如 ip header 中的协议信息是在那个位置 rfc 中有说明)
4.入库展示.
mikywei
2020-10-28 17:10:26 +08:00
@reus 我的意识是经过服务器的流量,而不是访问 web 后台服务的 http 流量,这 php 应该无法直接获取吧。
mikywei
2020-10-28 17:14:01 +08:00
@ripperdev 好的,感谢大佬;意思是说先用 C/C++保存成.pcap 文件,然后再用 php 的相关库去读取这个.pcap 文件吗?但是 IPS 入侵防御这种网络盒子可以实现阻断效果,应该不可能先保存成文件啊,应该有一种实时检测流量和丢弃流量的手段或 C/C++库。
mikywei
2020-10-28 17:36:00 +08:00
@mXw 这是啥?能给个介绍的链接看下吗?
ripperdev
2020-10-28 18:02:23 +08:00
@mikywei 我说的这两种都是实时检测的,追求极致效率还可以考虑 PFRing 、DPDK 这两个库。
mikywei
2020-12-01 11:05:00 +08:00
@ripperdev 好的感谢,我先了解下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/709460

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX