我的程序正在进行数据包分析。我现在有一个关于DNS/Radius的问题。DNS使用UDP端口53 Radius使用UDP端口1645/1646/1812/1813
逻辑是,如果我看到53,那么它就是DNS数据包;如果我看到1812,那么它就是DNS数据包。它是一个Radius数据包。然后问题来了,一些DNS数据包也使用Radius端口,例如UDP端口src 53/dst 1812,反之亦然。那么我的程序就不能处理这个了。
但wireshark不会感到困惑,我想知道它是如何知道真正的协议的。它是否尝试对有效载荷进行解码?然后告诉你呢?或者下划线的libpcap之类的东西能够告诉我们真正的协议类型。那么,如果我使用libpcap中的代码,libpcap是否提供了告知传输协议的功能?
有人能帮帮忙吗?我用谷歌搜索了一段时间,但还没有得到任何结果。
谢谢,康
发布于 2015-10-31 15:40:29
Wireshark使用各种技术来识别协议。对于DNS和RADIUS,它基于端口号执行此操作。执行此操作的代码首先查找数字较低的端口号,如果找不到该端口号的分析器,则查找数字较高的端口号,因此在端口53和1812之间传输的数据包将被标识为DNS而不是RADIUS,因为DNS的端口53在数字上低于RADIUS的端口1812。
如果端口1812和53之间碰巧有RADIUS流量,Wireshark将会混淆。
解决这个问题的唯一方法是让DNS解析器尝试查看数据包数据并猜测它是否是DNS,或者让RADIUS解析器尝试查看数据包并猜测它是否是RADIUS,如果它不是该解析器的数据包,则返回"this isn not for me“指示,以便可以尝试其他解析器。
没有神奇的解决方案可以保证正确识别运行在TCP或UDP上的所有协议。只有基于端口号和数据包内容的启发式方法;它们可能会在99.44/100%的情况下得到正确的答案,但仍然会有56%/100%的时间不起作用,您必须手动干预(例如,使用"Decode As...“Wireshark中的机制,或TShark中的-d命令行等效项)。
而且,正如Steffen Ullrich所指出的,libpcap不会为您做这些事情;使用libpcap的不同应用程序(tcpdump、Wireshark等)可能会有不同的做法。
发布于 2015-10-31 12:20:56
libpcap不提供这样的功能。一件事是,wireshark将检查数据包并检测其结构,但会限制它在使用的端口/协议中查找的内容。另一件事是,您通常找不到从端口53发往radius服务器的数据包,也找不到从端口1812发往DNS服务器的数据包,因为客户端通常隐含地使用高得多的ephemeral port。
https://stackoverflow.com/questions/33447807
复制相似问题