def dns_recurse(transaction_id, received_hostname, type_a_records): global tcp_enabled # tld_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) tld_ip_addr =type_a_records[0]['value'] #implement round robin print("tld ip"+tld_ip_addr) # tld_socket.connect((tld_ip_addr, 53)) query = dns_query.dnsquery(transaction_id, received_hostname) # tld_socket.send(query) #build message # response = tld_socket.recv(100).decode('utf-8') response = dns_query.sendtoserver(tld_ip_addr,53,query, tcp_enabled) return response
import socket, random, sys import dns_utility as dns_query args = (sys.argv) print(args) domain_name = str(args[1]) tcp_enabled = 0 if args[2] == 'tcp': tcp_enabled = 1 print("domain_name", domain_name) # sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) data = dns_query.dnsquery( random.randint(0, 65535).to_bytes(2, byteorder='big'), str(domain_name)) print("DATA", data) # Simply set up a target address and port ... # addr = ('127.0.0.1',53) # ... and send data out to it! # sk.sendto(data,addr) response_data = dns_query.sendtoserver('127.0.0.1', 53, data, tcp_enabled) print("DATA", response_data)
def createresponse(data): ##################### EXTRACT QUESTION DETAILS ############################## header_length = 12 position = header_length question_len = data[position] domain_parts = [] while question_len != 0: domain_parts.append(data[position + 1:position + question_len + 1]) position += question_len + 1 question_len = data[position] end_position = position domain_name = str(b'.'.join(domain_parts), encoding='UTF-8') question_type = data[position + 1:position + 3] if question_type == b'\x00\x01': record_type = 'a' elif question_type == b'\x00\x02': record_type = 'ns' elif question_type == b'\x00\x05': record_type = 'cname' elif question_type == b'\x00\xff': record_type = 'mx' ##################### Extract response from Cache ############################### #cache_query = { "domainname" : domain_name} dns_records = {} cache_query = domain_name #print(cache_query) recFlag = str(int(data[2]) & 1) RDFlag = myAtoi(recFlag) #print("RecFlag: ") #print(recFlag) #print("\n") if (lru_dict.has_key(cache_query)): #print("Hellooooooo......cache hit") global cache_counter cache_counter += 1 ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - Cache Hit; Cache Counter : " + str(cache_counter) logging.info(logStr) dns_records = lru_dict[cache_query] print(dns_records, cache_query) ######################### Response Header ##################################### ###Transaction ID ID = data[:2] RD = str(int(data[2]) & 1) ### FLAGS QR = '1' OPCODE = '0000' AA = '1' TC = '0' # RD = '0' RA = '1' Z = '000' RCODE = '0000' flags = int( QR + OPCODE + AA + TC + RD, 2).to_bytes(1, byteorder='big') + int( RA + Z + RCODE, 2).to_bytes(1, byteorder='big') ### QUESTION COUNT #q_count = (data[4] << 8) + data[5] #print('q_count',q_count) #QDCOUNT = q_count.to_bytes(2, byteorder='big') #b'\x00\x01' QDCOUNT = b'\x00\x01' ### ASSUMPTION - only 1 question at a time #print('QDCOUNT',QDCOUNT) ### ANSWER COUNT ans_count = len(dns_records[record_type]) #fetch from DB ANCOUNT = ans_count.to_bytes(2, byteorder='big') #print('ANCOUNT', ANCOUNT) # Nameserver Count ns_count = 0 NSCOUNT = ns_count.to_bytes(2, byteorder='big') #print('NSCOUNT', NSCOUNT) # Additonal Count ar_count = 0 ARCOUNT = ar_count.to_bytes(2, byteorder='big') response_header = ID + flags + QDCOUNT + ANCOUNT + NSCOUNT + ARCOUNT print("Response Header", response_header) ######################### Response Question ################################# response_question = data[header_length:end_position + 5] print("Response question........", response_question) ######################### Response Body ################################# response_body = b'' for rec in dns_records[record_type]: response_body += bytes([192]) + bytes( [12]) ## Name - compression applied response_body += question_type ## record type response_body += b'\x00\x01' ## record class ttl = int(rec['ttl']).to_bytes( 4, byteorder='big') #b'\x00\x00\x00\x04' ## 4 bytes response_body += ttl response_body += bytes([0]) + bytes([4]) ipv4_addr = b'' for ip_octet in rec['value'].split("."): ipv4_addr += bytes([int(ip_octet)]) response_body += ipv4_addr print("response_body", response_body) return response_header + response_question + response_body elif RDFlag == 1: #print("I'm in recFlag section....") ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - Rec:Sending to Root Server..." logging.info(logStr) response1 = dns_query.sendtoserver('35.196.214.148', 53, data, tcp_enabled) ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - Rec:Receive from Root Server..." + str(response1) logging.info(logStr) jsonres = dns_query.json_response(response1) lru_dict[cache_query] = jsonres print(lru_dict[cache_query]) return response1 elif RDFlag == 0: #creating response for iterative #print("Here in not RD state \n\n") ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - Itr:Sending to Root Server..." logging.info(logStr) rootResponse = dns_query.sendtoserver('35.196.214.148', 53, data, tcp_enabled) responseList = [] responseList = dns_query.parseresponse(rootResponse) itrIp = responseList[1] authIp = itrIp[13:-1] #print(authIp) ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - Itr:Receive from Root, Auth IP : " + authIp log.info(logStr) response1 = dns_query.sendtoserver(authIp, 53, data, tcp_enabled) ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - Itr:Receive from Auth Server..." + str(response1) logging.info(logStr) jsonres = dns_query.json_response(response1) lru_dict[cache_query] = jsonres print(lru_dict[cache_query]) return response1
correctcnt = 0 data = pandas.read_csv('test.csv', sep=',') cols = ['ID', 'Start Time', 'End Time', 'Response Time'] lst = [] for i in range(numreq): dnameid = random.randint(0, 57) dname = data.iloc[dnameid]["Domain Name"] tid = random.randint(10000, 65535).to_bytes(2, byteorder='big') query_data = dns_query.dnsquery(tid, str(dname)) #print("DATA", query_data) ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - " + dname logging.info(logStr) start = time.time() response_data = dns_query.sendtoserver(HOST, PORT, query_data, tcp_enabled) end = time.time() print("DATA", response_data) ID = int.from_bytes(response_data[:2], byteorder='big') tidf = int.from_bytes(tid, byteorder='big') rec_lst = [] if (str(tidf) == str(ID)): rec_lst = dns_query.parseresponse(response_data) print(rec_lst) ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') logStr = st + " - " + str(rec_lst) logging.info(logStr) if ((str(data.iloc[dnameid]["IP1"]) in rec_lst[1]) and (str(data.iloc[dnameid]["IP2"]) in rec_lst[2])): correctcnt = correctcnt + 1