在Python中构建DNS数据包遇到问题

6 投票
1 回答
3761 浏览
提问于 2025-04-18 13:46

我正在尝试构建一个DNS数据包,通过套接字发送。我不想使用任何库,因为我想直接访问发送数据的套接字变量。每次我发送DNS数据包时,Wireshark都会提示它格式不正确。我到底哪里做错了呢?

关于DNS数据包本身,有一些问题: 它显示有256个问题,没有类别和类型。

  class DnsPacketBuilder:

def __init__(self):
    pass

def build_packet(self, url):
    packet = struct.pack("H", 12049)  # Query Ids (Just 1 for now)
    packet += struct.pack("H", 256)  # Flags
    packet += struct.pack("H", 1)  # Questions
    packet += struct.pack("H", 0)  # Answers
    packet += struct.pack("H", 0)  # Authorities
    packet += struct.pack("H", 0)  # Additional
    split_url = url.split(".")
    for part in split_url:
        packet += struct.pack("B", len(part))
        for byte in bytes(part):
            packet += struct.pack("c", byte)
    packet += struct.pack("B", 0)  # End of String
    packet += struct.pack("H", 1)  # Query Type
    packet += struct.pack("H", 1)  # Query Class
    return packet

# Sending the packet
builder = DnsPacketBuilder()
packet = builder.build_packet("www.northeastern.edu")
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('', 8888))
sock.settimeout(2)
sock.sendto(bytes(packet), ("208.67.222.222", 53))
print("Packet Sent")
data, addr = sock.recvfrom(1024)
print("Response: " + data)
sock.close()

1 个回答

5

你的系统本身使用的是“小端”字节顺序。

你需要把16位字段的字节顺序反转成“大端”(也叫“网络顺序”),可以使用">H"这个格式字符串struct.pack()中进行操作。

撰写回答