2012-10-23 62 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代码重新构建它