我想覆盖/更改linux处理ping icmp echo请求数据包的方式.意思是我想运行自己的服务器来回复传入的icmp(echo请求或其他)数据包.
但为了使其正常工作,我想我需要禁用从linux处理的默认ping icmp数据包.但我无法弄清楚如何做到这一点(我甚至不知道是什么处理icmp请求......内核?一些用户空间代码?)...我发现只是用iptables删除icmp echo请求.
为了帮助理解,让我解释一下我的目标:我希望能够通过ping发送一些数据.(简单)但我需要能够读取和提取该数据.另外,我希望能够回答一个特殊的echo-reply(嵌入了一些数据)
要覆盖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回应请求的响应,具有您想要的有效负载.这个问题可能在这个领域有更多线索:如何在C中使用原始套接字接收ICMP请求
抱歉,对于一个已经回答的问题发表评论,但我想补充一下(也许对Google员工来说),用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
Run Code Online (Sandbox Code Playgroud)
这将允许ICMP数据包通过并被捕获,但不会被自动应答。