2015-05-12 10 views
1

Я использую dpkt для чтения файла pcap.Чтение IP-адресов и TTL из ответа DNS с помощью dpkt

 try: dns = dpkt.dns.DNS(udp.data) 
     except: continue 

     if dns.qr != dpkt.dns.DNS_R: continue 
     if dns.opcode != dpkt.dns.DNS_QUERY: continue 
     if dns.rcode != dpkt.dns.DNS_RCODE_NOERR: continue 
     if len(dns.an) < 1: continue 

     for answer in dns.an: 
      if answer.type == 5: 
       print "CNAME request", answer.name, "\tresponse", answer.cname 

Я бы хотел прочитать IP-адрес и TTL для каждого ответа. Я сделал dir(answer), но я не смог найти ничего, что, похоже, вернет ip-адреса/TTL ответа, и я не нахожу ничего в документации.

Есть ли способ для этого?

ответ

0

From this question

Я предполагаю, что вы читаете файл PCAP с чем-то вроде этого:

import dpkt 
import sys 

f=file(sys.argv[1],"rb") 
pcap=dpkt.pcap.Reader(f) 

Анализировать каждый слой по отдельности, начиная с Ethernet.

for ts, buf in pcap: 
    eth=dpkt.ethernet.Ethernet(buf) 
    ip=eth.data 
    udp=ip.data 

Затем вытащите соответствующие значения TTL и IP из IP-заголовка.

Значения TTL и IP находятся в заголовке IP, а не в ответе DNS.

+0

Я не думаю, что вы увидите информацию о DNS в заголовке IP. уровень IP ниже DNS – Bob

+0

Это правильно. Но вы можете проанализировать IP-заголовок перед обработкой данных DNS. – chemdt

0

Объект RR имеет ttl свойство, которое является то, что вы ищете: (. Это прискорбно поздно ответ)

try: 
    dns = dpkt.dns.DNS(udp.data) 
except: 
    continue 

    if dns.qr != dpkt.dns.DNS_R: continue 
    if dns.opcode != dpkt.dns.DNS_QUERY: continue 
    if dns.rcode != dpkt.dns.DNS_RCODE_NOERR: continue 
    if len(dns.an) < 1: continue 

    for answer in dns.an: 
     if answer.type == 5: 
      print "CNAME request", answer.name, "\tresponse", answer.cname, "\tttl", answer.ttl 
0

Боб вы задаете для IP-адрес сервера, который послал ответ , или IP-адрес для имени в записи CNAME? Данные канонического имени (CNAME) в части записи ресурсов (RR) ответа DNS имеют только имя домена и TTL. Серверы имен, которые я тестировал, возвращают IP-адрес для ответа CNAME в другой записи RR дополнительной информации.

Если вы хотите, чтобы прочитать оригинальную главу и стих: https://www.ietf.org/rfc/rfc1035.txt

Вот немного кода Python с использованием dpkt, который позволяет создавать и исследовать содержимое ответов DNS.

import dpkt 
import random 
import socket 

# build query 
query_id = int(random.random() * 10000) 
query = dpkt.dns.DNS(id=query_id) 
my_q = dpkt.dns.DNS.Q(name="www.yahoo.com") 
query.qd.append(my_q) 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.connect(("8.8.8.8", 53)) 
sock.send(str(query)) 
buf = sock.recv(0xffff) 

# parse response 
response = dpkt.dns.DNS(buf) 
if query_id != response.id: 
    print "Expected %d but received id %d" % (query_id, response.id) 
elif response.qr != dpkt.dns.DNS_R: 
    print "Not a response!" 
elif response.opcode != dpkt.dns.DNS_QUERY: 
    print "Not a query op!" 
elif response.rcode != dpkt.dns.DNS_RCODE_NOERR: 
    print "Not a successful response!" 
elif len(response.an) == 0: 
    print"Response has no answers!" 
else: 
    print "%d bytes received, id is %d" % (len(buf), response.id) 
    for rr in response.an: 
     print "AN: class is %d, type is %d, name is %s" % (rr.cls, rr.type, rr.name) 
     if hasattr(rr, 'ip'): 
      print "\tIP is %s" % socket.inet_ntoa(rr.ip) 
    for rr in response.ns: 
     print "NS: class is %d, type is %d, name is %s" % (rr.cls, rr.type, rr.name) 
    for rr in response.ar: 
     print "AR: class is %d, type is %d, name is %s" % (rr.cls, rr.type, rr.name) 

Результаты, которые я вижу (сидит на восточном побережье):

240 bytes received, id is 5848 
AN: class is 1, type is 5, name is www.yahoo.com 
AN: class is 1, type is 1, name is fd-fp3.wg1.b.yahoo.com 
    IP is 98.139.180.149 
AN: class is 1, type is 1, name is fd-fp3.wg1.b.yahoo.com 
    IP is 98.139.183.24 
NS: class is 1, type is 2, name is wg1.b.yahoo.com 
NS: class is 1, type is 2, name is wg1.b.yahoo.com 
NS: class is 1, type is 2, name is wg1.b.yahoo.com 
NS: class is 1, type is 2, name is wg1.b.yahoo.com 
AR: class is 1, type is 1, name is yf2.yahoo.com 
AR: class is 1, type is 1, name is yf1.yahoo.com 
AR: class is 1, type is 1, name is yf3.a1.b.yahoo.net 
AR: class is 1, type is 1, name is yf4.a1.b.yahoo.net