Skip to content

Instantly share code, notes, and snippets.

@povilasb
Created September 19, 2017 12:06
Show Gist options
  • Save povilasb/c2f846d873e2c441ad2b4125fa33df0f to your computer and use it in GitHub Desktop.
Save povilasb/c2f846d873e2c441ad2b4125fa33df0f to your computer and use it in GitHub Desktop.
Sample DNS server
from typing import Tuple
from curio import socket
import curio
import dnslib as dns
class Server:
def __init__(self) -> None:
self.port = 53
self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
async def start(self) -> None:
self._sock.bind(('0.0.0.0', self.port))
while True:
packet, addr = await self._sock.recvfrom(512)
await self.on_packet(packet, addr)
await self._sock.close()
async def on_packet(self, packet: bytes, addr: Tuple[str, int]) -> None:
dns_query = dns.DNSRecord.parse(packet)
print(dns_query, '\n')
await self._sock.sendto(make_reply(dns_query), addr)
def make_reply(record: dns.DNSRecord) -> bytes:
"""Makes a stub response."""
resp = record.reply()
query_name = record.questions[0].qname
resp.add_answer(
dns.RR(query_name, dns.QTYPE.A, rdata=dns.A('1.2.3.4'), ttl=60))
return resp.pack()
def main() -> None:
server = Server()
curio.run(server.start)
if __name__ == '__main__':
main()
curio==0.8
dnslib==0.9.7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment