【问题标题】:PF_PACKET socket and 'Port unreachable' ICMP messagesPF_PACKET 套接字和“端口不可达”ICMP 消息
【发布时间】:2012-10-23 14:08:43
【问题描述】:

我的应用程序需要从多个目标端口接收 UDP 数据包(这是一个真正的应用程序,而不是嗅探器)。因此,我选择使用 PF_PACKET 套接字并在应用程序级别进行端口过滤。

这是我创建套接字的方法:

int g_rawSocket = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

我正在正确接收 UDP 数据包。但是,运行应用程序的内核正在向正在向我的应用程序发送数据包的远程设备发送类型为“无法访问目标”和代码“无法访问端口”的 ICMP 数据包。我猜这是因为我没有将端口号绑定到套接字。但是,我想知道将绑定与 PF_PACKET 套接字一起使用是否合适,尤其是当我需要绑定多个端口时,我想这是不可能的。

请问有cmets吗?

【问题讨论】:

  • 另外,您可以使用 iptables 阻止 ICMP 回复,例如iptables -I OUTPUT -p icmp --icmp-type destination-unreachable -j DROP

标签: linux-kernel raw-sockets


【解决方案1】:

不,它不能绑定到特定端口,因为它工作的级别低于传输 (UDP/TCP) 层。但是,您可以使用常规 UDP (AF_INET/SOCK_DGRAM) 套接字和select 打开并监听所有套接字,据我所知,您可以绑定和监听任意数量的套接字,只要您不这样做'不要超过您的进程的打开文件描述符的限制。

【讨论】:

  • 我需要监听 2^15 个端口。你觉得可行吗?
  • 又看了一遍答案,好像不能真正绑定,所以查看我更新的答案
【解决方案2】:

我在我的应用程序中也做了同样的事情。

在我的情况下,我已经创建了所需的套接字并将它们与特定端口绑定。但我没有在听任何套接字。所以我创建了一个原始套接字

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

& 然后在没有任何 ICMP 的情况下接收到所有流量。

所以我认为你必须绑定所有端口以避免 ICMP,要么你必须一些内核黑客作为停止或删除 linux 内核代码中的 ICMP 代码并重新构建它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多