Yorick van Pelt d6d84edbab implement server+tests and write documentation ago%!(EXTRA string=2 years %!s(MISSING))
dns implement server+tests and write documentation ago%!(EXTRA string=2 years %!s(MISSING))
.gitignore import initial framework ago%!(EXTRA string=2 years %!s(MISSING))
README.md import initial framework ago%!(EXTRA string=2 years %!s(MISSING))
dns_client.py add resolver tests ago%!(EXTRA string=2 years %!s(MISSING))
dns_server.py implement server+tests and write documentation ago%!(EXTRA string=2 years %!s(MISSING))
dns_tests.py implement server+tests and write documentation ago%!(EXTRA string=2 years %!s(MISSING))
documentation.txt implement server+tests and write documentation ago%!(EXTRA string=2 years %!s(MISSING))
named.root remove hardcoded servers, replaced with zone file ago%!(EXTRA string=2 years %!s(MISSING))
test.zone implement server+tests and write documentation ago%!(EXTRA string=2 years %!s(MISSING))

README.md

Project 2 Framework

Description

This directory contains a framework for a DNS resolver and a recursive DNS server. The framework provides classes for manipulating DNS messages (and converting them to bytes). The framework also contains a few stubs which you need to implement. Most files contain pointers to the relevant sections of RFC 1034 and RFC 1035. These are not the only relevant sections though, and you might need to read more of the RFCs.

It is probably a good idea to read RFC 1034 before proceeding. This RFC explains an overview of DNS and introduces some of the naming which is also used in the framework.

File structure

  • proj1_sn1_sn2
    • dns
      • cache.py: Contains a cache for the resolver. You have to implement this.
      • classes.py: Enum of CLASSes and QCLASSes.
      • domainname.py: Classes for reading and writing domain names as bytes.
      • message.py: Classes for DNS messages.
      • rcodes.py: Enum of RCODEs.
      • resolver.py: Class for a DNS resolver. You have to implement this.
      • resource.py: Classes for DNS resource records.
      • server.py: Contains a DNS server. You have to implement this.
      • types.py: Enum of TYPEs and QTYPEs.
      • zone.py: name space zones. You have to implement this.
    • dns_client.py: A simple DNS client, which serves as an example user of the resolver.
    • dns_server.py: Code for starting the DNS server and parsing args.
    • dns_tests.py: Tests for your resolver, cache and server. You have to implement this.

Implementation Hints and Tips

You should start with implementing the resolver, which you need for the server. You will need message.py, resource.py, types.py, classes.py and rcodes.py. You can ignore the code for converting from and to bytes from these files if you want, but it might be useful (especially for debugging).

After finishing the resolver you need to implement caching and the DNS server. You can implement these in any order that you like. I suggest implementing the recursive part (the resolving) of your DNS server, before implementing the management of the servers zone.

Wireshark and dns_client.py are useful tools for debugging your resolver. Wireshark and nslookup are useful tools for debugging your server.