├── README.md ├── zones └── howcode.org.zone └── dns.py /README.md: -------------------------------------------------------------------------------- 1 | howDNS - DNS Server by howCode 2 | ============================== 3 | 4 | howDNS is a simple DNS Server written in pure Python 3 during the "Make your Own DNS Server" video series on YouTube. You can watch the series here: https://www.youtube.com/playlist?list=PLBOh8f9FoHHhvO5e5HF_6mYvtZegobYX2 5 | -------------------------------------------------------------------------------- /zones/howcode.org.zone: -------------------------------------------------------------------------------- 1 | { 2 | "$origin": "howcode.org.", 3 | "$ttl": 3600, 4 | "soa": { 5 | "mname": "ns1.howcode.org.", 6 | "rname": "admin.howcode.org.", 7 | "serial": "{time}", 8 | "refresh": 3600, 9 | "retry": 600, 10 | "expire": 604800, 11 | "minimum": 86400 12 | }, 13 | "ns": [ 14 | { "host": "ns1.howcode.org." }, 15 | { "host": "ns2.howcode.org." } 16 | ], 17 | "a": [ 18 | { "name": "@", "ttl": 400, "value": "255.255.255.255" }, 19 | { "name": "@", "ttl": 400, "value": "127.0.0.1" }, 20 | { "name": "@", "ttl": 400, "value": "127.0.0.1" }, 21 | { "name": "@", "ttl": 400, "value": "127.0.0.1" }, 22 | { "name": "@", "ttl": 400, "value": "10.10.10.10" } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /dns.py: -------------------------------------------------------------------------------- 1 | import socket, glob, json 2 | 3 | port = 53 4 | ip = '127.0.0.1' 5 | 6 | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 7 | sock.bind((ip, port)) 8 | 9 | def load_zones(): 10 | 11 | jsonzone = {} 12 | zonefiles = glob.glob('zones/*.zone') 13 | 14 | for zone in zonefiles: 15 | with open(zone) as zonedata: 16 | data = json.load(zonedata) 17 | zonename = data["$origin"] 18 | jsonzone[zonename] = data 19 | return jsonzone 20 | 21 | zonedata = load_zones() 22 | 23 | def getflags(flags): 24 | 25 | byte1 = bytes(flags[:1]) 26 | byte2 = bytes(flags[1:2]) 27 | 28 | rflags = '' 29 | 30 | QR = '1' 31 | 32 | OPCODE = '' 33 | for bit in range(1,5): 34 | OPCODE += str(ord(byte1)&(1<