我正在开发一台基于TUN的VPN服务器,其目标是在将数据包转发到目的地之前对其接收的数据包进行分析。目前,我正在接收来自TUN接口的IP数据包,并且简单地将它们发送到它们的目的地。
我知道,分析UDP数据包的内容就像去掉IP和UDP报头一样简单。然而,为了分析TCP流量的内容,我需要从多个IP数据包中重构消息。在不重新实现TCP的情况下,是否有一种简单的方法可以做到这一点?是否有任何易于访问的C/C++库用于此任务?我更喜欢Linux系统库和/或开源、非病毒/非版权库。
我已经考虑过的一件事是复制每个IP数据包,并将副本的目标IP更改为本地主机,这样我的服务器的另一部分就可以接收到这些TCP请求和响应,并且完全重构并且没有报头。但是,我无法将目的地is与流量内容联系起来,这是我所希望的。
发布于 2013-09-09 23:38:25
也许您对libipq - iptables用户空间数据包队列库感兴趣。
#include <linux/netfilter.h>
#include <libipq.h>Netfilter提供了一种机制,用于将数据包从堆栈中传递出去,以便排队到用户空间,然后将这些数据包接收回内核,并指定如何处理数据包(例如接受或丢弃)。在重新注入回内核之前,还可以在用户空间中修改这些数据包。对于每个受支持的协议,一个名为队列处理程序的内核模块可以向Netfilter注册,以执行向用户空间传递数据包和从用户空间传递数据包的机制。 IPv4的标准队列处理程序是ip_queue。它作为一个带有2.4内核的实验模块提供,并使用Netlink套接字进行内核/用户空间通信。 加载ip_queue后,可以使用iptables选择IP数据包,并通过队列目标排队进行用户空间处理
下面是如何分解tcp/ip数据包的简单示例:
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图书馆。
https://stackoverflow.com/questions/18708569
复制相似问题