1. # - Install Python 2.7.x
  2. # - python -m pip install dnslib
  3. # - Copy current host file where your dns_proxy.py file is
  4. # - Change your host file to blank
  5. # - Cahnge your dns server to 127.0.0.1
  6. # - Run python dns_proxy.py
  7. # The blocked hosts will be added to hosts_blocked file
  8. from dnslib import *
  9. from dnslib import server
  10. # Customize the port and address of your local server to suit your needs (e.g. localhost -> 0.0.0.0)
  11. local_addr = 'localhost'
  12. local_port = 53
  13. # Customize the address and port of the external DNS server
  14. external_dns_server_addr = '8.8.8.8' # Google dns server
  15. external_dns_server_port = 53
  16. def loadHosts(file_name):
  17. blocked = {}
  18. for line in open(file_name):
  19. if not " " in line:
  20. continue
  21. _, domain = line.strip().split(" ", 1)
  22. blocked[domain] = True
  23. return blocked
  24. blocklist = loadHosts("hosts")
  25. print "Loaded blocklist:", len(blocklist), blocklist.keys()[0:30]
  26. blocked = loadHosts("hosts_blocked")
  27. print "Loaded blocked:", len(blocked), blocked.keys()[0:30]
  28. class SpecialResolver:
  29. def resolve(self, request, handler):
  30. d = request.reply()
  31. q = request.get_q()
  32. q_name = str(q.qname)
  33. name = q_name.strip(".")
  34. if name in blocklist:
  35. # Answers
  36. d.add_answer(*RR.fromZone("%s 136 A 0.0.0.0" % name))
  37. # Authoritative Name Servers
  38. d.add_auth(*RR.fromZone("pfghmj.com 128505 NS localhost"))
  39. d.add_auth(*RR.fromZone("pfghmj.com 128505 NS localhost"))
  40. print "! Blocked", name
  41. if name not in blocked:
  42. print "--- New Blocked", name
  43. open("hosts_blocked", "a").write("\n0.0.0.0 " + name)
  44. blocked[name] = True
  45. # Recursively query another DNS server for other domains
  46. else:
  47. a = DNSRecord.parse(DNSRecord.question(q_name).send(external_dns_server_addr, external_dns_server_port))
  48. for rr in a.rr:
  49. d.add_answer(rr)
  50. return d
  51. r = SpecialResolver()
  52. s = server.DNSServer(r, port=local_port, address=local_addr)
  53. s.start_thread()
  54. import time
  55. while True:
  56. time.sleep(1)

DNS proxy to filter hosts file