什么处理在Linux平?

我想覆盖/更改如何处理ping icmp回应请求数据包。 含义我想运行自己的服务器来回复传入的icmp(echo请求或其他)数据包。

但为了这个工作正常,我想我需要禁用从Linux处理默认的ping icmp数据包。 但我不知道如何做到这一点(我甚至不知道什么处理ICMP请求…内核?一些用户空间的代码?)…我find的所有是关于删除与iptables的icmp回声请求。

为了帮助理解,让我解释一下我的目标:我希望能够用ping发送一些数据。 (容易),但我需要能够读取和提取数据。 我也希望能够回答一个特殊的回声回复(embedded一些数据)

要覆盖ICMP ECHO请求( ping )的默认内核行为,您可以执行以下操作,而无需捅入内核或写入过滤器。

  • 首先:指示iptables删除ICMP ECHO请求。 然而他们会来到你的主机并输入你的网卡,但内核不会回答他们:

    iptables -A INPUT- p icmp --icmp-type 8 -j DROP

  • 其次:使用tcpdump来嗅探ICMP数据包(或者写一个使用libcap来执行捕获的程序)。 tcpdump具有显示有效载荷数据的选项,或者将已下达的数据包写入文件。 你可以使用这个最后的功能,在程序中用-w选项打开tcpdump,把它的输出连接到一个管道并读取管道。 这样,即使将被iptables丢弃,也可以访问传入的ICMP回显请求。 从你的程序中,你将能够解析有效载荷数据。

    tcpdump -p icmp -i eth0 -s 0 -Xnlt

    (这是为了在标准输出中以可读的人类十六进制和ASCII显示数据,根据将原始数据写入文件/套接字来更改-X -l选项)

  • 第三:使用原始套接字,你的程序可以发送一个定制的数据包,假装是对之前的ICMP回应请求的响应,以及你所期望的有效载荷。 这个SO问题在这个领域可能有更多的线索: 如何通过原始套接字接收C中的ICMP请求

对于已经回答的问题感到抱歉,但是我想补充一下(对于谷歌来说)阻止使用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数据包通过并被捕获,但不会自动回答。