linux 中的 ping 是什么?

What handles ping in linux?

我想override/change如何linux处理ping icmp echo请求数据包。 意思是我想 运行 我自己的服务器回复传入的 icmp(回显请求或其他)数据包。

但要使其正常工作,我想我需要禁用来自 linux 的默认 ping icmp 数据包处理。 但我不知道该怎么做(我什至不知道什么处理 icmp 请求......内核?一些用户空间代码?)......我发现的只是关于用 iptables 删除 icmp echo 请求。

为了帮助理解,让我解释一下我的目标: 我希望能够使用 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 显示数据,根据将原始数据写入 file/socket 更改 -X -l 选项)

  • 第三:使用原始套接字,您的程序可以发送一个自定义的数据包,假装是对先前 ICMP 回显请求的响应,其中包含您想要的有效负载。这个 SO 问题可能在该领域为您提供更多线索:How to receive ICMP request in C with raw sockets

很抱歉对一个已经回答的问题发表评论,但我想补充一点(也许对于 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 数据包通过并被捕获,但不会自动应答。