import socket
def dns_lookup(domain):
# 定义DNS服务器地址和端口
server = socket.gethostbyname('8.8.8.8')
port = 53
# 构建DNS查询消息
question = b'\\0' * 2 + domain.encode('utf-8') + b'\0'
message = b'\x01\x00\x01\x00\x01\x00\x00\x00\x00\x01' + question + b'\x00\x00\x00\x00'
# 连接到DNS服务器并发送查询消息
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.connect((server, port))
s.send(message)
# 接收DNS服务器响应
data = s.recv(512)
print(data)
response = data[2:]
status = data[:2]
answer = response[12:]
answer = answer[:answer.index(b'\x00')]
print(f"Domain: {domain}, IP: {answer}")
# 使用示例
domain = 'www.baidu.com'
dns_lookup(domain)
DNS数据包的格式如下:
- 头部:会话标识ID,用于标识报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应。
- 正文:
- Queries区域
- 查询名QNAME:要查找的名字,是一个或多个标识符的序列。
- 查询类型QTYPE:每一个问题有一个查询类型,2个字节表示查询类型。
- Queries区域
- 响应状态码:用于表示响应的状态。
- 域名服务器:用于解析域名的IP地址。
- 开始记录:表示从哪个字节开始记录。
- 回答区域数量:表示报文中有多少个回答区域。
- 权威域名服务器数量:表示权威域名服务器的数量。
- 附加资源记录数:表示附加记录的数量。