2

我正在创建一种接入点。

根据默认的服务质量 (QoS) 类,我从我的机器捕获所有类型的所有数据包,以便在转发它们之前对它们进行优先级排序。

通过socket使用ETH_P_ALL参数调用,我可以获得任何协议类型的所有传入数据包:

    if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == ERROR)  {
        perror("socket");
        exit(1);
    }

通过使用ethhdr,iphdr和structs 我无法检索有关哪个应用程序发送每个数据包的信息tcphdrudphdr

但是,Voip 和 SNMP 都使用 UDP,我不知道两者中的哪一个向我发送了 UDP 包。

我想知道哪些应用程序正在发送 UDP 数据包,因此我可能会遵循 QoS 类并在其他数据包(例如电子邮件)之前转发一些数据包(例如会话语音)。

为了识别协议,我应该使用 TCP 和 UDP 端口号列表吗?

4

1 回答 1

2

您无法确定哪个应用程序发送了数据包 - 只有发送者自己知道这一点。如果我理解正确,您想要的是检测正在使用的协议。那么你有两种可能性:

  1. 假设基于 TCP/UDP 数据包上设置的目标端口的应用程序 - TCP/UDP 端口号列表或您的/etc/services(如果您在 Linux/Unix/OSX/等上)可能会有所帮助;

  2. 分析数据包内容并将其与已知的协议签名进行匹配(如 IDS 所做的 - 例如,请参阅Snort 规则)。请注意,您可能需要某种形式的 conntrack 才能使其可靠地工作;

于 2015-04-22T15:39:28.857 回答