我想覆盖/更改linux处理ping icmp echo请求数据包的方式。 意思是我想运行自己的服务器来回复传入的icmp(回应请求或其他)数据包。
但为了使其正常工作,我想我需要禁用从linux处理的默认ping icmp数据包。 但我无法弄清楚如何做到这一点(我甚至不知道是什么处理icmp请求......内核?一些用户空间代码?)...我发现只是用iptables删除icmp echo请求。
为了帮助理解,让我解释一下我的目标: 我希望能够通过ping发送一些数据。 (简单) 但我需要能够读取和提取该数据。另外,我希望能够使用特殊的echo-reply(嵌入一些数据)来回答
答案 0 :(得分:5)
要覆盖ICMP ECHO请求(ping
)的默认内核行为,您可以执行以下操作,而无需戳入内核或编写过滤器。
首先:指示iptables
删除ICMP ECHO请求。然而,他们会来到您的主机并输入您的网卡,但他们不会被内核回答:
iptables -A INPUT- p icmp --icmp-type 8 -j DROP
第二:使用tcpdump
嗅探ICMP数据包(或编写一个使用libcap自行捕获的程序)。 tcpdump
具有显示有效负载数据或将dunmped数据包写入文件的选项。您可以使用此最后一项功能从程序中打开带有-w选项的tcpdump,将其输出连接到管道并读取管道。这样,即使它们将被iptables丢弃,您也可以访问传入的ICMP回应请求。从您的程序中,您将能够解析有效负载数据。
tcpdump -p icmp -i eth0 -s 0 -Xnlt
(这是用于在标准输出上以可读的人类十六进制和ASCII显示数据,根据将原始数据写入文件/套接字来更改-X
-l
选项
第三:使用原始套接字,您的程序可以发送一个自定义数据包,假装是对先前ICMP回应请求的响应,具有您想要的有效负载。在此字段中,此SO问题可能会为您提供更多线索:How to receive ICMP request in C with raw sockets
答案 1 :(得分:5)
很抱歉对已经回答的问题发表评论,但我想添加(对于googlers来说)阻止使用iptables的ICMP数据包不会允许你用RAW IP套接字读取它们,因为iptables适用于IP层。您可以使用RAW以太网套接字来实现它,但这是客观上更糟糕的方法。
禁止内核处理icmp数据包的推荐方法是通过/proc/sys/net/ipv4/icmp_echo_ignore_all
接口:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
这将允许ICMP数据包通过并被捕获,但不会自动回答。