DNS/実装/python/ = dnslib/lame_check/Get_ns.py = について、ここに記述してください。 NSレコードのAを検索; NOERRORでもAがあるとは限らない。 ar を検査する必要がある。-- ToshinoriMaeno <> {{{#!python from dnslib.dns import DNSRecord,DNSHeader,DNSQuestion,DNSError,QTYPE def get_ns(domain, address): # print ('get_ns', domain, address) ns = set () try: q0 = DNSQuestion(domain, QTYPE.NS) q = DNSRecord(q=q0) a_pkt = q.send(address, 53, tcp=False) a = DNSRecord.parse(a_pkt) # print ('answer', a) if a.header.tc : # Truncated - retry in TCP mode a_pkt = q.send(address, 53,tcp=True) a = DNSRecord.parse(a_pkt) # NXDOMAIN rcode if a.header.rcode == 0 : # NOERROR for r in a.rr: # ANSWER section if r.rtype == QTYPE.NS: ns.add(str(r.rdata)) except DNSError as e: p.error(e) return ns def checkns(d, nsset): print ('NS', d, nsset) # from Get_ns import get_ns for name in nsset: zonens = get_ns(d,name) if zonens: if nsset == zonens : print ('match', d, name, '==') elif nsset < zonens : print ('plus', d, name, '++', list(zonens - nsset)) else: print ('zone', d, zonens) else: print ('RF', d, name) # no zone def delegation(address,domain): from dnslib.dns import DNSRecord,DNSHeader,DNSQuestion,DNSError,QTYPE,EDNS0 ns = { } # nslist (+ ipaddress list) try: q0 = DNSQuestion(domain, QTYPE.NS) q = DNSRecord(q=q0) # print('question ok', q) a_pkt = q.send(address, 53, tcp=False) a = DNSRecord.parse(a_pkt) if a.header.tc : # Truncated - retry in TCP mode a_pkt = q.send(address, 53,tcp=True) a = DNSRecord.parse(a_pkt) # NXDOMAIN rcode if a.header.rcode != 0 : # ['NOERROR', 'NXDOMAIN', 'SERVFAIL', 'REFUSED']: print ('ZONEX', domain, a.header.rcode) else: for r in a.auth: if r.rtype == QTYPE.NS: ns[str(r.rdata)] = [] # address list for t in a.ar: if t.rtype == QTYPE.A : tt = str(t.rname) if tt in ns : ns[tt].append(str(t.rdata)) return ns except DNSError as e: p.error(e) }}} address == dest (IP address かと思っていたが、sock.connect で使われるので、名前でも大丈夫らしい。) awsdns は特別扱いしないことにして、プログラムを簡素化する。 -- ToshinoriMaeno <> query + response までを分離する。(重複)