def udp_writer(sock, _queue: Queue): """ resolves queued dns queries, responds over udp port """ logging.info('starting UDP DNS writer') while True: try: dns_request, client_address = _queue.get() dns_response = cloudflare_dns_over_tls(dns_request).pack() sock.sendto(dns_response, client_address) _queue.task_done() except: logging.exception('ERROR writing to udp sock') continue
def udp_server(): logging.info('starting UDP DNS server') with socket.socket(type=socket.SOCK_DGRAM) as sock: # making sure the socket is reusable as we expose tcp and udp on the same port sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(ADDRESS) while True: try: dns_request, client_address = get_dns_request_over_udp(sock) dns_response = cloudflare_dns_over_tls(dns_request).pack() sock.sendto(dns_response, client_address) except: logging.exception('ERROR in udp server') continue
def tcp_writer(_queue: Queue): """ resolves queued dns queries, responds over udp port no sock parameter needed here as tcp response is over new sock object created at communication start """ logging.info('starting TCP DNS writer') while True: try: dns_request, connection = _queue.get() dns_response = cloudflare_dns_over_tls(dns_request).pack() response = struct.pack('!H', len(dns_response)) + dns_response connection.sendall(response) _queue.task_done() except: logging.exception('ERROR writing to tcp sock') continue
def tcp_server(): logging.info('starting TCP DNS server') with socket.socket(type=socket.SOCK_STREAM) as sock: # making sure the socket is reusable as we expose tcp and udp on the same port sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(ADDRESS) sock.listen(5) while True: try: conn, address = sock.accept() dns_request = get_dns_request_over_tcp(conn) dns_response = cloudflare_dns_over_tls(dns_request).pack() response = struct.pack('!H', len(dns_response)) + dns_response conn.sendall(response) except: logging.exception('ERROR in tcp server') continue
def resolve(self, request, handler): return cloudflare_dns_over_tls(request)
def handle(self): data, connection = self.request response = cloudflare_dns_over_tls(DNSRecord.parse(data)).pack() connection.sendto(response, self.client_address)
def handle(self): dns_request = get_dns_request_over_tcp(self.request) dns_response = cloudflare_dns_over_tls(dns_request).pack() response = struct.pack('!H', len(dns_response)) + dns_response self.request.sendall(response)