在linux中处理ping的是什么?

时间:2015-04-07 16:34:04

标签: linux ping icmp

我想覆盖/更改linux处理ping icmp echo请求数据包的方式。 意思是我想运行自己的服务器来回复传入的icmp(回应请求或其他)数据包。

但为了使其正常工作,我想我需要禁用从linux处理的默认ping icmp数据包。 但我无法弄清楚如何做到这一点(我甚至不知道是什么处理icmp请求......内核?一些用户空间代码?)...我发现只是用iptables删除icmp echo请求。

为了帮助理解,让我解释一下我的目标: 我希望能够通过ping发送一些数据。 (简单) 但我需要能够读取和提取该数据。另外,我希望能够使用特殊的echo-r​​eply(嵌入一些数据)来回答

2 个答案:

答案 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数据包通过并被捕获,但不会自动回答。