使用libpcap获取数据包的uid
Get uid of packet with libpcap
是否可以使用libpcap获取捕获的tcp数据包的有效uid?换句话说,我可以使用libpcap来获取创建所述数据包的用户id吗?
否,UID信息(如果有)不会通过pcap使用的AF_PACKET通道传播。
如果数据包是从另一台计算机发送的,则不能保证发送数据包的人拥有用户ID,例如,它可能是由一个没有用户ID概念的小型嵌入式操作系统发送的。
如果数据包是从您的计算机发送的,libpcap本身无法告诉您发送数据包的用户ID。但是,如果您解析TCP数据包,您可以获得数据包的源IP地址和端口号,并且根据您运行的操作系统,您可能能够获得计算机上所有活动TCP连接的表,可能具有与其相关联的进程ID或用户ID。(但是,请注意,例如,在UN*X系统上,给定TCP连接的给定文件描述符可以由使用不同有效或真实用户ID运行的多个进程共享,在这种情况下,如果您只有使用libpcap捕获的传输数据包,则您将没有足够的信息来确定发送数据包的进程的有效或真实的用户ID,因为您不知道发送数据包的进程。)
连接(使用SO_ATTACH_BPF)到AF_PACKET套接字(使用pcap_fileno()
获得)的eBPF接收筛选器可以使用bpf_get_socket_uid(skb)
获取与数据包关联的本地套接字(如果有)的所有者uid。主要问题是如何将这些信息发送到用户空间。。。
最简单的方法是为要监视的每个用户创建一个单独的捕获,并添加一个eBPF过滤器以仅匹配该uid。但很明显,这并不能很好地适应用户数量,而且它需要你有一个你感兴趣的uid的特定列表
我的下一个想法是,你可以将uid附加/预附加到传递到用户空间的数据包中(然后修补libpcap以提取它),但不幸的是,这种类型的eBPF过滤器(BPF_PROG_type_SOCKET_filter)不允许修改数据包。
这就需要使用一些带外方法将信息传递到用户空间,例如,对于每个TCP SYN数据包,您可以将套接字uid与足够的信息一起发送,以通过eBPF环形缓冲区唯一标识到用户空间的连接(src ip、dst ip、src port、dst port)。
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- C++ 将字符串数据包转换为 iphdr语言 - 字符串数据包的格式应该是什么?
- 使用libpcap获取数据包的uid