5

我正在 netfilter 中编写一个数据包过滤器。有没有办法获取 ICMP 数据包的源端口和目标端口?

我从 sk_buff 结构中提取了 icmp_hdr。但是我没有看到源地址和目标地址的任何属性?

4

1 回答 1

10

端口号是 TRANSPORT 层识别哪个数据包属于终端系统的哪个进程的方式。
它们用于让流程到流程的交付工作;但是ICMP,从功能的角度来看,并不是一个传输层协议。

ICMP 是网络层的消息传递协议(在 IP 之上;但不是真正的传输层),它有很多职责,但它们都与进程到进程的传递无关,所以有一个端口号没有任何意义。

举个例子,当你ping(ping 使用 ICMP 回显消息)一个 IP 地址时,你真的是哪个端口pinging
答案是:没有端口,你正在 ping 整个站,看它是否还活着。

现在,ICMP 有多种类型的消息;如果你想过滤掉,例如,ping消息,你应该检查这个字段type,如果它等于ICMP_ECHO,你可以return NF_DROP

于 2013-03-31T18:23:12.213 回答