import socket import dns.message, dns.rcode queries = [ ('example.com normal', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\x03com\x00\x00\x01\x00\x01"), ('twitter.com normal', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07twitter\x03com\x00\x00\x01\x00\x01"), ('example.com pointer-0', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\x03com\xc0\x00\x00\x01\x00\x01"), ('twitter.com pointer-0', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07twitter\x03com\xc0\x00\x00\x01\x00\x01"), ('example.com pointer-1', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\x03com\xc0\x01\x00\x01\x00\x01"), ('twitter.com pointer-1', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07twitter\x03com\xc0\x01\x00\x01\x00\x01"), ('example.com pointer-4', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\x03com\xc0\x04\x00\x01\x00\x01"), ('twitter.com pointer-4', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07twitter\x03com\xc0\x04\x00\x01\x00\x01"), ('example.com pointer-append', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\xc0\x12\x00\x01\x00\x01\x07example\x03com\x00"), ('twitter.com pointer-append', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\xc0\x12\x00\x01\x00\x01\x07twitter\x03com\x00"), ('example.com pointer-append-rr', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x01\xc0\x12\x00\x01\x00\x01\x07example\x03com\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00"), ('twitter.com pointer-append-rr', "\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x01\xc0\x12\x00\x01\x00\x01\x07twitter\x03com\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00"), ] resolvers = [ ('google-dns1', '8.8.8.8'), ('google-dns2', '8.8.4.4'), ('opendns1', '208.67.222.222'), ('opendns2', '208.67.220.220'), ('twitter-ns1', '208.78.70.34'), ('twitter-ns2', '204.13.250.34'), ('he-dns', '74.82.42.42'), ('level3', '4.2.2.2'), ('alidns1', '223.5.5.5'), ('alidns2', '223.6.6.6'), ('cnnic-dns1', '1.2.4.8'), ('v2ex-dns1', '199.91.73.222'), ('unicom-sh1', '210.22.70.3'), ('unicom-sh2', '210.22.84.3'), ('china-blackhole-1', '210.22.0.0'), ('china-blackhole-2', '210.21.0.0'), ('china-blackhole-3', '202.96.0.0'), ('china-blackhole-4', '116.228.0.0'), ] def test_query(resolver, query): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(0.1) result = '' for i in range(20): sock.sendto(query, (resolver, 53)) try: packet, addr = sock.recvfrom(2048) try: r = dns.message.from_wire(packet) rc = dns.rcode.from_flags(r.flags, r.ednsflags) result = dns.rcode.to_text(rc) + ' ' + ' '.join(str(rr) for rr in r.answer).replace('\n', ' ') except: result = 'parse error' break except socket.timeout: pass sock.close() return result for qname, query in queries: for rname, resolver in resolvers: print qname, rname, test_query(resolver, query)