- # - Install Python 2.7.x
- # - python -m pip install dnslib
- # - Copy current host file where your dns_proxy.py file is
- # - Change your host file to blank
- # - Cahnge your dns server to 127.0.0.1
- # - Run python dns_proxy.py
- # The blocked hosts will be added to hosts_blocked file
- from dnslib import *
- from dnslib import server
- # Customize the port and address of your local server to suit your needs (e.g. localhost -> 0.0.0.0)
- local_addr = 'localhost'
- local_port = 53
- # Customize the address and port of the external DNS server
- external_dns_server_addr = '8.8.8.8' # Google dns server
- external_dns_server_port = 53
- def loadHosts(file_name):
- blocked = {}
- for line in open(file_name):
- if not " " in line:
- continue
- _, domain = line.strip().split(" ", 1)
- blocked[domain] = True
- return blocked
- blocklist = loadHosts("hosts")
- print "Loaded blocklist:", len(blocklist), blocklist.keys()[0:30]
- blocked = loadHosts("hosts_blocked")
- print "Loaded blocked:", len(blocked), blocked.keys()[0:30]
- class SpecialResolver:
- def resolve(self, request, handler):
- d = request.reply()
- q = request.get_q()
- q_name = str(q.qname)
- name = q_name.strip(".")
- if name in blocklist:
- # Answers
- d.add_answer(*RR.fromZone("%s 136 A 0.0.0.0" % name))
- # Authoritative Name Servers
- d.add_auth(*RR.fromZone("pfghmj.com 128505 NS localhost"))
- d.add_auth(*RR.fromZone("pfghmj.com 128505 NS localhost"))
- print "! Blocked", name
- if name not in blocked:
- print "--- New Blocked", name
- open("hosts_blocked", "a").write("\n0.0.0.0 " + name)
- blocked[name] = True
- # Recursively query another DNS server for other domains
- else:
- a = DNSRecord.parse(DNSRecord.question(q_name).send(external_dns_server_addr, external_dns_server_port))
- for rr in a.rr:
- d.add_answer(rr)
- return d
- r = SpecialResolver()
- s = server.DNSServer(r, port=local_port, address=local_addr)
- s.start_thread()
- import time
- while True:
- time.sleep(1)
DNS proxy to filter hosts file