如何识别接入点中 UDP 数据包的来源?

How do I identify the source of a UDP packet in an access point?

我正在创建一种接入点。

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

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

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

通过使用 ethhdriphdrtcphdrudphdr 结构,我无法检索有关哪个应用程序发送了每个数据包的信息。

但是Voip和SNMP都是用UDP的,不知道是哪一个给我发的UDP包。

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

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

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

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

  2. 分析数据包内容并将其与已知协议签名进行匹配(就像 IDS 所做的那样 - 请参见 Snort rules 示例)。请注意,您可能需要某种形式的 conntrack 才能可靠地完成这项工作;