Linux C 语言手写嗅探器,不依赖库也能抓包
为什么放弃 libpcap 直接操作原始套接字在学习网络协议栈或开发嵌入式监控工具时我们往往过度依赖libpcap这样的高级库。虽然它们封装良好、调用简单但就像黑盒一样屏蔽了数据包从网卡到用户空间的真实流转过程。对于希望深入理解 Linux 内核网络机制的开发者而言直接使用 C 语言和原始套接字Raw Socket编写嗅探器是打破这层抽象的最佳途径。不依赖第三方库意味着我们需要亲手处理以太网帧的解析、IP 头部的拆解以及传输层协议的识别。这不仅能让程序体积更轻量更适合资源受限的嵌入式环境更能让我们直观地看到sk_buff在内核中是如何被层层剥离最终变成用户态可见的数据流。本文将基于 Linux 环境带你从零构建一个能够捕获 TCP/UDP 数据包的嗅探器重点剖析PF_PACKET协议族的配置与手动解析流程。核心机制PF_PACKET 与混杂模式在 Linux 内核中想要绕过传输层直接抓取链路层数据必须使用PF_PACKET协议族创建套接字。这与常见的AF_INET不同后者只能接收发给本机的特定端口数据而前者允许我们监听经过网卡的所有流量。创建套接字的核心代码如下int sock_fd socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sock_fd 0) { perror(Socket creation failed); return -1; }这里ETH_P_ALL表示捕获所有类型的以太网帧。然而仅仅创建套接字还不够默认情况下网卡只会接收目的 MAC 地址匹配本机或广播帧的数据。为了捕获流经该接口的所有数据包包括发给其他主机的必须将网卡设置为混杂模式Promiscuous Mode。这需要通过bind绑定到具体接口并利用setsockopt配置 PACKET_ADD_MEMBERSHIPstruct sockaddr_ll sll; struct packet_mreq mr; // 绑定到指定接口需先通过 ioctl 获取 ifr_ifindex memset(sll, 0, sizeof(sll)); sll.sll_family AF_PACKET; sll.sll_ifindex if_idx; // 假设已获取接口索引 sll.sll_protocol htons(ETH_P_ALL); bind(sock_fd, (struct sockaddr *)sll, sizeof(sll)); // 开启混杂模式 mr.mr_ifindex if_idx; mr.mr_type PACKET_MR_PROMISC; mr.mr_alen 0; setsockopt(sock_fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, mr, sizeof(mr));值得注意的是执行上述操作通常需要root权限或具备CAP_NET_RAW能力这是内核的安全限制防止普通用户随意窃听网络流量。手动拆解从以太网帧到 IP 头部当数据包被捕获到用户缓冲区后它本质上是一段连续的字节流。我们需要按照协议规范逐层偏移指针来解析内容。最外层是以太网帧头紧接着是 IP 头最后才是 TCP 或 UDP 头。首先定义以太网头部结构注意字节序和网络对齐struct eth_header { uint8_t dest_mac[6]; uint8_t src_mac[6]; uint16_t ether_type; };读取数据后先判断ether_type。若为0x0800则表示载荷是 IPv4 数据包。接下来解析 IP 头部重点关注协议字段以区分 TCP 还是 UDPstruct ip_header { uint8_t ihl_version; uint8_t tos; uint16_t total_len; uint16_t id; uint16_t frag_off; uint8_t ttl; uint8_t protocol; // 6TCP, 17UDP uint16_t check; uint32_t src_ip; uint32_t dest_ip; }; // 解析示例 struct eth_header *eth (struct eth_header *)buffer; if (ntohs(eth-ether_type) 0x0800) { struct ip_header *ip (struct ip_header *)(buffer sizeof(struct eth_header)); // 提取源 IP 和目的 IP struct in_addr src {.s_addr ip-src_ip}; struct in_addr dst {.s_addr ip-dest_ip}; printf(IP: %s - %s | Protocol: %d\n, inet_ntoa(src), inet_ntoa(dst), ip-protocol); // 根据 protocol 字段继续解析传输层 if (ip-protocol 6) { // 解析 TCP 头部... } else if (ip-protocol 17) { // 解析 UDP 头部... } }在解析 TCP/UDP 头部时同样需要计算偏移量。IP 头部的长度是可变的由ihl_version低 4 位决定单位是 4 字节因此传输层头部的起始位置是以太网头大小 IP 头长度。通过读取源端口和目的端口需转换主机字节序我们就能还原出完整的通信五元组信息。性能优化零拷贝与环形缓冲区上述基于recvfrom的实现虽然逻辑清晰但在高流量场景下存在性能瓶颈。每次系统调用都涉及内核态到用户态的数据拷贝大量数据包会导致 CPU 上下文切换频繁甚至丢包。Linux 提供了TPACKET_V2或TPACKET_V3接口支持基于共享内存的环形缓冲区Ring Buffer实现零拷贝抓包。其核心思路是通过mmap将内核分配的内存映射到用户空间内核直接将数据包写入这块区域用户程序只需轮询状态标志即可读取无需额外的copy_to_user操作。配置示例如下struct tpacket_req req; req.tp_block_size 4096; // 块大小 req.tp_frame_nr 1024; // 帧数量 req.tp_frame_size 1514; // 单帧大小 req.tp_block_nr 64; // 块数量 setsockopt(sock_fd, SOL_PACKET, PACKET_RX_RING, req, sizeof(req)); void *mapped_buf mmap(NULL, req.tp_block_size * req.tp_block_nr, PROT_READ | PROT_WRITE, MAP_SHARED, sock_fd, 0);在这种模式下开发者需要自行管理缓冲区的读写指针检查帧状态头中的TP_STATUS_USER标志。虽然代码复杂度有所上升但对于需要长期运行、高吞吐量的监控工具而言这种机制能显著降低系统负载确保在千兆甚至万兆网络环境下依然稳定工作。通过亲手实现从套接字创建到协议解析的全过程我们不仅掌握了一个轻量级嗅探器的写法更深刻理解了 Linux 网络协议栈的数据流转逻辑。这种底层视角对于排查网络故障、设计高性能网关或开发嵌入式安全设备都是不可或缺的基础能力。网络安全的知识多而杂怎么科学合理安排下面给大家总结了一套适用于网安零基础的学习路线应届生和转行人员都适用学完保底6k就算你底子差如果能趁着网安良好的发展势头不断学习日后跳槽大厂、拿到百万年薪也不是不可能初级黑客1、网络安全理论知识2天①了解行业相关背景前景确定发展方向。②学习网络安全相关法律法规。③网络安全运营的概念。④等保简介、等保规定、流程和规范。非常重要2、渗透测试基础一周①渗透测试 的流程、分类、标准②信息收集技术主动/被动信息搜集、Nmap工具、Google Hacking③漏洞扫描、漏洞利用、原理利用方法、工具MSF、绕过IDS和反病毒侦察④主机攻防演练MS17-010、MS08-067、MS10-046、MS12-20等3、操作系统基础一周①Windows系统常见功能和命令②Kali Linux系统常见功能和命令③操作系统安全系统入侵排查/系统加固基础4、计算机网络基础一周①计算机网络基础、协议和架构②网络通信原理、OSI模型、数据转发流程③常见协议解析HTTP、TCP/IP、ARP等④网络攻击技术与网络安全防御技术⑤Web漏洞原理与防御主动/被动攻击、DDOS攻击、CVE漏洞复现5、数据库基础操作2天①数据库基础②SQL语言基础③数据库安全加固6、Web渗透1周①HTML、CSS和JavaScript简介②OWASP Top10③Web漏洞扫描工具④Web渗透工具Nmap、BurpSuite、SQLMap、其他菜刀、漏扫等想要入坑黑客网络安全的朋友给大家准备了一份282G全网最全的网络安全资料包免费领取网络安全学习路线学习资源网络安全工程师企业级学习路线很多小伙伴想要一窥网络安全整个体系这里我分享一份打磨了4年已经成功修改到4.0版本的《平均薪资40w的网络安全工程师学习路线图》对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。如图片过大被平台压缩导致看不清的话大家记得点个关注关注之后系统后台会自动发送给大家到时候记得看后台消息就行了。学习资料工具包压箱底的好资料全面地介绍网络安全的基础理论包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等将基础理论和主流工具的应用实践紧密结合有利于读者理解各种主流工具背后的实现机制。​​​​​​网络安全源码合集工具包​​​​视频教程​​​​视频配套资料国内外网安书籍、文档工具​​​都放在这里啦

相关新闻

智能梯控第三方接口快速接入指南

智能梯控第三方接口快速接入指南

在智慧楼宇的改造项目中,电梯门禁系统的对接往往是最让人头疼的环节之一。很多开发者在面对老旧的梯控硬件时,常常陷入“数据拿不到、权限配不准、日志查不着”的困境。尤其是当需要同时管理多栋大楼、数十部电梯以及成百上千用户的楼层权限时&#xff0…

2026/10/15 3:31:40 阅读更多 →
从汇编到实时飞控:Apollo-11源码的工程启示与实操指南

从汇编到实时飞控:Apollo-11源码的工程启示与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 3:30:40 阅读更多 →
PI-Desktop 跨平台打包与发布流水线全解析:从版本 Tag 到三平台安装器的完整清单

PI-Desktop 跨平台打包与发布流水线全解析:从版本 Tag 到三平台安装器的完整清单

PI-Desktop 跨平台打包与发布流水线全解析:从版本 Tag 到三平台安装器的完整清单 【免费下载链接】PI-Desktop Local-first AI coding agent desktop: Electron Rust host core pi Agent Harness user-installable plugins 项目地址: https://gitcode.com/GitH…

2026/10/15 3:30:40 阅读更多 →

最新新闻

IDEA 2025.3 新功能实战:多光标、调试数据流与临时文件提升编码效率

IDEA 2025.3 新功能实战:多光标、调试数据流与临时文件提升编码效率

IDEA 2025.3 的更新日志刚出来那会儿,我真没当回事,毕竟每个大版本都爱说“更快、更智能、更好用”。直到上周把开发环境从旧版本升上来,试了一圈新功能,才意识到这波“骚操作”是真的多,甚至有点跟不上了。这篇文章不…

2026/10/15 4:27:50 阅读更多 →
贝叶斯网络学习指南:从结构、参数到推断的完整实践

贝叶斯网络学习指南:从结构、参数到推断的完整实践

简介:《贝叶斯网络学习指南》是一份面向机器学习、概率建模与数据科学初学者的PDF电子书,系统覆盖从概率论基础到贝叶斯网络建模、推理与参数学习的完整知识链。全书从概率函数与空间、条件概率与独立性、贝叶斯定理、随机变量及联合概率分布讲起&#x…

2026/10/15 4:27:50 阅读更多 →
STM32F072C8T6裸机开发实战:从寄存器到USB/CAN外设

STM32F072C8T6裸机开发实战:从寄存器到USB/CAN外设

简介:这份资料面向嵌入式初学者与有一定经验的开发者,围绕意法半导体STM32F072C8T6(ARM Cortex-M0内核、48MHz主频、32KB闪存与2KB RAM)学习板展开,帮助读者快速掌握该芯片的初始化配置、中断处理、内存管理及驱动编写…

2026/10/15 4:27:50 阅读更多 →
C/C++不同位数数据互转的进制转换实现与避坑指南

C/C++不同位数数据互转的进制转换实现与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 4:27:50 阅读更多 →
NC65销售订单批量导入全攻略:从模板准备到成功入库的避坑指南

NC65销售订单批量导入全攻略:从模板准备到成功入库的避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 4:27:50 阅读更多 →
Linux下C/C++动静态库制作与使用实战指南

Linux下C/C++动静态库制作与使用实战指南

长期以来在Linux下做C/C开发,动静态库始终是绕不开的一个核心技能。无论是自己封装模块、分发二进制产物,还是处理第三方依赖,理解库的制作与使用直接决定了你在编译链接这块能不能少掉头发。我见过不少开发者写业务逻辑很熟练,一…

2026/10/15 4:26:50 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →