linux - 什么处理 linux 中的 ping?

标签 linux ping icmp

我想覆盖/更改 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/

相关文章:

ping - 在 MacOS 上请求 icmp_seq 超时

c++ - 这个 icmphdr *pkt = (icmphdr *)packet; 是什么意思?意思是?

Linux用户空间: how to put 16550-compatible UART in loopback mode persistently

bash - 如何在脚本中使用 ping

java - 什么时候规范不是规范 - 全能的 RPC 博客 ping 规范难题

java - Minecraft - Bukkit socket

networking - Traceroute:发送的所有探测包路径是否相同?

linux - bash 子字符串在解释器模式下工作但不在 shell 脚本中

c - 监控chattr变化

linux - 用于启动进程的 Bash 脚本,随机等待,终止进程,重新启动