2012-10-23 63 views
2

我的應用程序需要接收來自多個目的端口的UDP數據包(這是一位誠實的應用程序,而不是一個嗅探器)。因此,我選擇使用PF_PACKET套接字並在應用程序級別進行端口過濾。PF_PACKET插座和「端口不可達」的ICMP消息

下面是如何創建套接字:

INT g_rawSocket =插座(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));

我正確地收到UDP報文。但是,運行該應用程序的內核正在向正在向我的應用程序發送數據包的遠程設備發送「Destination unreachable」類型和「Port unreachable」代碼的ICMP數據包。我想這是因爲我沒有將端口號綁定到套接字。但是,我想知道是否適合使用綁定與PF_PACKET套接字,特別是因爲我需要將多個端口綁定到它,我想這是不可能的。

任何意見嗎?

+0

另外,您可以用iptables阻止ICMP回覆,例如'iptables -I OUTPUT -p icmp -icmp-type destination-unreachable -j DROP' – wick

回答

0

不,它不能被綁定到特定端口,因爲它的工作在除運輸(UDP/TCP)層的較低的水平。但是,您可以打開並偵聽所有套接字,例如使用常規的UDP(AF_INET/SOCK_DGRAM)套接字和select,並且據我所知,只要您不需要綁定和監聽儘可能多的套接字超過您的流程的打開文件描述符的限制。

+0

我需要監聽2^15個端口。你認爲這是可行的嗎? – user1768576

+0

再次閱讀答案後,似乎無法實際綁定它,因此請檢查我的更新答案 – iabdalkader

0

我也做了同樣的事情在我的應用程序。

在我的情況

我已經創建的套接字許多我需要&綁定它們與特定的端口。但我不聽任何套接字。所以我創建了一個原始套接字

int sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_UDP); 

&然後接收到的所有流量而不ICMP。

因此,我認爲u必須綁定所有的端口,以避免ICMP要麼就得一些核心的黑客攻擊,回採或在Linux內核代碼&消除對ICMP代碼重新構建它