我正在 netfilter 中编写一个数据包过滤器。有没有办法获取 ICMP 数据包的源端口和目标端口?
我从 sk_buff 结构中提取了 icmp_hdr。但是我没有看到源地址和目标地址的任何属性?
我正在 netfilter 中编写一个数据包过滤器。有没有办法获取 ICMP 数据包的源端口和目标端口?
我从 sk_buff 结构中提取了 icmp_hdr。但是我没有看到源地址和目标地址的任何属性?
端口号是 TRANSPORT 层识别哪个数据包属于终端系统的哪个进程的方式。
它们用于让流程到流程的交付工作;但是ICMP,从功能的角度来看,并不是一个传输层协议。
ICMP 是网络层的消息传递协议(在 IP 之上;但不是真正的传输层),它有很多职责,但它们都与进程到进程的传递无关,所以有一个端口号没有任何意义。
举个例子,当你ping
(ping 使用 ICMP 回显消息)一个 IP 地址时,你真的是哪个端口pinging
?
答案是:没有端口,你正在 ping 整个站,看它是否还活着。
现在,ICMP 有多种类型的消息;如果你想过滤掉,例如,ping
消息,你应该检查这个字段type
,如果它等于ICMP_ECHO
,你可以return NF_DROP
。