我正在创建一种接入点。
我根据默认的服务质量(QoS)类,从我的机器中捕获所有类型的所有数据包,以便在转发之前对它们进行优先级排序。
通过使用socket
参数调用ETH_P_ALL
,我可以获得任何协议类型的所有传入数据包:
if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == ERROR) {
perror("socket");
exit(1);
}
通过使用ethhdr
,iphdr
,tcphdr
和udphdr
结构,我无法检索有关哪个应用程序发送每个数据包的信息。
但是,Voip和SNMP都使用UDP,我不知道这两个中的哪一个发送给我UDP包。
我想知道哪些应用程序正在发送UDP数据包,因此我可能会遵循QoS类并将其他数据包(例如会话语音)转发给其他人(例如电子邮件)。
为了识别协议,我应该使用TCP和UDP端口号列表吗?
答案 0 :(得分:2)
您无法确定确定哪个应用程序发送了数据包 - 只有发件人自己知道这一点。如果我理解正确,您想要的是检测正在使用的协议。那么你有两种可能性:
假设应用程序基于TCP / UDP数据包上设置的目标端口 - list of TCP/UDP port numbers或您的/etc/services
(如果您在Linux / Unix / OSX /等上) )可能有帮助;
分析数据包内容并将其与已知协议签名进行匹配(如IDS所做的那样 - 例如,请参阅Snort rules)。请注意,您可能需要某种形式的conntrack才能使其可靠地工作;