繁体   English   中英

在linux中处理ping的是什么?

[英]What handles ping in linux?

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

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

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

要覆盖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回应请求的响应,具有您想要的有效负载。 这个问题可能在这个领域有更多线索: 如何在C中使用原始套接字接收ICMP请求

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM