首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从多个IP数据包中重建TCP流?

如何从多个IP数据包中重建TCP流?
EN

Stack Overflow用户
提问于 2013-09-09 23:25:21
回答 2查看 3.2K关注 0票数 7

我正在开发一台基于TUN的VPN服务器,其目标是在将数据包转发到目的地之前对其接收的数据包进行分析。目前,我正在接收来自TUN接口的IP数据包,并且简单地将它们发送到它们的目的地。

我知道,分析UDP数据包的内容就像去掉IP和UDP报头一样简单。然而,为了分析TCP流量的内容,我需要从多个IP数据包中重构消息。在不重新实现TCP的情况下,是否有一种简单的方法可以做到这一点?是否有任何易于访问的C/C++库用于此任务?我更喜欢Linux系统库和/或开源、非病毒/非版权库。

我已经考虑过的一件事是复制每个IP数据包,并将副本的目标IP更改为本地主机,这样我的服务器的另一部分就可以接收到这些TCP请求和响应,并且完全重构并且没有报头。但是,我无法将目的地is与流量内容联系起来,这是我所希望的。

EN

Stack Overflow用户

发布于 2013-09-09 23:38:25

也许您对libipq - iptables用户空间数据包队列库感兴趣。

代码语言:javascript
运行
复制
#include <linux/netfilter.h>
#include <libipq.h>

Netfilter提供了一种机制,用于将数据包从堆栈中传递出去,以便排队到用户空间,然后将这些数据包接收回内核,并指定如何处理数据包(例如接受或丢弃)。在重新注入回内核之前,还可以在用户空间中修改这些数据包。对于每个受支持的协议,一个名为队列处理程序的内核模块可以向Netfilter注册,以执行向用户空间传递数据包和从用户空间传递数据包的机制。 IPv4的标准队列处理程序是ip_queue。它作为一个带有2.4内核的实验模块提供,并使用Netlink套接字进行内核/用户空间通信。 加载ip_queue后,可以使用iptables选择IP数据包,并通过队列目标排队进行用户空间处理

下面是如何分解tcp/ip数据包的简单示例:

代码语言:javascript
运行
复制
ipq_packet_msg_t *m = ipq_get_packet(buf);

struct iphdr *ip = (struct iphdr*) m->payload;

struct tcphdr *tcp = (struct tcphdr*) (m->payload + (4 * ip->ihl));

int port = htons(tcp->dest);        

status = ipq_set_verdict(h, m->packet_id,
                          NF_ACCEPT, 0, NULL);
if (status < 0)
        die(h);

快速简介

如果这不是您要寻找的东西,您可以尝试使用wireshark EPAN图书馆

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18708569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档