2015-10-31 40 views
0

我的程序正在做数据包分析。我现在有一个DNS/Radius问题。 DNS使用UDP端口53 Radius使用UDP端口1645/1646/1812/1813当Wireshark在UDP端口中使用Radius端口时,如何识别DNS流量?我怎么知道?

逻辑是如果我看到53,那么它是一个DNS数据包;如果我看到1812 ...它是一个Radius数据包。然后出现问题,一些DNS数据包也使用Radius端口,例如UDP端口src 53/dst 1812或反之。然后我的程序无法处理这个问题。

但wireshark不会混淆,我想知道它是如何能够知道真正的协议。它是否尝试解码有效载荷?然后告诉?或者下划线libpcap或者其他东西能够告诉真正的协议类型。所以如果我采用可以使用libpcap的代码,libpcap是否提供了告诉携带协议的功能?

任何人都可以请帮忙吗?我GOOGLE了一段时间,但没有结果。

感谢 康

回答

0

libpcap的不提供这样的功能。有一件事是Wireshark将查看数据包并检测结构,但是限制了使用中的端口/协议寻找的内容。另一件事是你通常不会找到源自端口53的radius服务器的数据包或从端口1812到DNS服务器的数据包,因为客户端通常会隐含地使用更高的ephemeral port

1

Wireshark使用各种技术来识别协议。对于DNS和RADIUS,它是基于端口号进行的。这样做的代码首先查找数字较低的端口号,如果它没有找到该端口号的解析器,则查找数字上较高的端口号,因此端口53和1812之间的数据包将被标识为DNS而不是RADIUS,因为53(DNS的端口)在数字上低于1812(RADIUS的端口)。

如果在端口1812和53之间发生RADIUS通信,Wireshark 弄糊涂了。

解决此问题的唯一方法是让DNS解析器尝试查看数据包数据并猜测它是DNS还是让RADIUS解析器尝试查看数据包并猜测它是否为RADIUS并且如果它不是解剖学家的包,返回一个“这不适合我”的指示,以便可以尝试另一个解剖器。

没有神奇的解决方案保证能够正确识别在TCP或UDP上运行的所有协议。只有基于端口号和数据包内容的启发式;他们可能会得到正确的答案99 44/100%的时间,但仍然会有56/100%的时间不起作用,您将不得不手动进行干预(例如,使用“解码As ...“机制,或TShark中相当于-d的命令行)。

而且,正如Steffen Ullrich指出的那样,libpcap不会为你做到这一点;使用libpcap的不同应用程序(tcpdump,Wireshark等)可能会有所不同。