如何通过套接字发送ICMP数据包?
问题描述:
我想通过ICMP数据包发送消息,但我不知道该怎么做。如何通过套接字发送ICMP数据包?
这是我目前拥有的代码,但显然是行不通的:“你好!”
s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
s.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)
s.settimeout(3.0)
s.sendto("Hello!" + "\r\n", (server, 7))
msg = s.recvfrom(buff_size)
s.close()
我必须从服务器字符串是否收到答案发送,但我不明白。 我想,“你好!”字符串将被封装成数据字段:
答
为了构建ICMP数据包,您必须使用原始套接字自己创建整个数据包。 struct
module对此很有用。其次,为了甚至使用原始套接字,你需要有权限这么做 - 你应该以root身份运行(我知道这是一个充分的条件,但我不是100%确定的这是必要的条件)。 ping(1)
可执行文件能够执行此操作,因为它是一个setuid可执行文件,它在运行时以root用户身份运行。由于脚本无法在Linux上运行setuid,因此您必须在C中创建一个包装程序setuid程序,该程序只执行您的Python脚本。
答
我不认为SOCK_RAW
走向的ICMP数据报给你,因为你设置的协议字段来IPPROTO_ICMP
!你必须自己构建数据包。
看看ping的来源。
在GNU/Linux操作系统中有(至少)两种流行包,提供ping
。一个是netkit
,另一个是iputils
。 (netkit-combo
是一个包含所有netkit
实用程序的tarball:telnet,FTP,...)* BSD家伙可能有自己的。