La bibliothèque dnspython est bien pratique pour manipuler des requêtes et des réponses DNS en python.

Pour exemple, un serveur DNS sur UDP, threadé à la demande, et qui répond IN A 1.2.3.4 à toutes les requêtes :

from SocketServer import ThreadingUDPServer
from SocketServer import DatagramRequestHandler
from dns import message, rdataclass, rdatatype, rrset

class DNSRequestHandler(DatagramRequestHandler):
    def handle(self):
        msg = message.from_wire(self.rfile.read(1500))
        reply = message.make_response(msg)
        name = reply.question[0].name.to_text()
        rdset = rrset.from_text(name, 0, rdataclass.IN,
            rdatatype.A, '1.2.3.4')
        reply.answer = [ rdset ]
        self.wfile.write(reply.to_wire())

if __name__ == '__main__':
    server = ThreadingUDPServer(('127.0.0.1', 5353),
        DNSRequestHandler)
    server.serve_forever()