在Python 3中,要尝试使用原始套接字盲目发送IP包,但不断得到ARP查找的问题,可以通过禁用ARP来解决。下面是一个完善且全面的答案:
ARP(Address Resolution Protocol)是一种用于将IP地址解析为MAC地址的协议,它在局域网中起到重要的作用。当使用原始套接字在Python 3中发送IP包时,系统会自动执行ARP查找,以获取目标主机的MAC地址。然而,有时候我们希望绕过ARP查找,直接发送IP包。
要在Python 3中禁用ARP查找,可以使用socket
模块的SOCK_RAW
套接字类型,并设置IP_HDRINCL
选项。这样可以让操作系统不自动添加IP头部,从而绕过ARP查找。
下面是一个示例代码:
import socket
import struct
def send_ip_packet(dest_ip, src_ip, payload):
# 创建原始套接字
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
# 禁用ARP查找
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# 构造IP头部
ip_header = struct.pack('!BBHHHBBH4s4s', # IP头部格式
69, 0, # 版本和服务类型
20 + len(payload), # 总长度
54321, 0, # 标识和标志
64, socket.IPPROTO_TCP, # TTL和上层协议
socket.inet_aton(src_ip), # 源IP地址
socket.inet_aton(dest_ip)) # 目标IP地址
# 发送IP包
s.sendto(ip_header + payload, (dest_ip, 0))
# 关闭套接字
s.close()
# 示例用法
dest_ip = '目标IP地址'
src_ip = '源IP地址'
payload = b'要发送的数据'
send_ip_packet(dest_ip, src_ip, payload)
在上述示例代码中,send_ip_packet
函数接受目标IP地址、源IP地址和要发送的数据作为参数。它使用socket
模块创建一个原始套接字,并设置IP_HDRINCL
选项来禁用ARP查找。然后,使用struct
模块构造IP头部,并将IP头部和数据一起发送到目标IP地址。
需要注意的是,使用原始套接字发送IP包需要具有足够的权限,通常需要以管理员或超级用户身份运行程序。
推荐的腾讯云相关产品和产品介绍链接地址:
以上是关于在Python 3中禁用ARP查找并盲目发送IP包的完善且全面的答案。希望对你有帮助!
领取专属 10元无门槛券
手把手带您无忧上云