我想覆盖/更改 linux 处理 ping icmp echo 请求数据包的方式。 这意味着我想运行自己的服务器来回复传入的 icmp(回显请求或其他)数据包。
但要使其正常工作,我想我需要禁用 linux 的默认 ping icmp 数据包处理。 但我不知道该怎么做(我什至不知道是什么处理 icmp 请求...内核?一些用户空间代码?)...我发现的只是关于使用 iptables 删除 icmp 回显请求。
为了帮助理解,让我解释一下我的目标: 我希望能够使用 ping 发送一些数据。 (简单的) 但我需要能够读取和提取该数据。另外,我希望能够用一个特殊的回显回复(嵌入了一些数据)来回答
最佳答案
要覆盖 ICMP ECHO 请求 (ping
) 的默认内核行为,您可以执行以下操作,而无需深入内核或编写过滤器。
首先:指示
iptables
丢弃 ICMP ECHO 请求。然而,它们会来到您的主机并进入您的网卡,但内核不会回答它们:iptables -A INPUT- p icmp --icmp-type 8 -j DROP
第二:使用
tcpdump
嗅探 ICMP 数据包(或编写一个程序,使用 libcap 自行捕获)。tcpdump
具有显示负载数据或将转储数据包写入文件的选项。您可以使用最后一个功能从程序中使用 -w 选项打开 tcpdump,将其输出连接到管道并读取管道。这样,您可以访问传入的 ICMP 回显请求,即使它们将被 iptables 丢弃。从您的程序中,您将能够解析有效负载数据。tcpdump -p icmp -i eth0 -s 0 -Xnlt
(这是为了在标准输出上以可读的人类十六进制和 ASCII 显示数据,根据将原始数据写入文件更改
-X
-l
选项/套接字)第三:使用原始套接字,您的程序可以发送一个自定义数据包,假装是对先前 ICMP 回显请求的响应,其中包含您想要的有效负载。这个 SO 问题可能在该领域为您提供更多线索:How to receive ICMP request in C with raw sockets
关于linux - 什么处理 linux 中的 ping?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29496575/