⎗ ✓ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40#!/usr/bin/env python3 import requests import socket import threading def server(port, upstream): assert type(port) is int assert port >= 0 and port <= 65535 assert type(upstream) is str assert upstream.startswith('https://') udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) udp_sock.bind(('127.0.0.1', port)) requests_session = requests.Session() def handle(info): nonlocal udp_sock request, peer = info response = requests_session.post(upstream, data=request, timeout=10, headers={ 'content-type': 'application/dns-message' }) assert response.status_code == 200 udp_sock.sendto(response.content, peer) threads = [] while True: info = udp_sock.recvfrom(65539) new_thread = threading.Thread(target=handle, args=(info,)) threads.append(new_thread) new_thread.start() server(53, 'https://1.0.0.1/dns-query')