2015-10-31 99 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等)可能會有所不同。