Hi Guys,<br><br>Im playing with a dns-cache script, that overrides DNS requests for certain IP addresses.<br><br>I would like to add functionality, so unresolved requests are sent to a spicific IP. How do I go about doing that?<br>
<br>Is there a negative answer in the (udp) DNS protocol or am I forced to use a timeout.<br><br>Kind regards<br><br>Tax<br><br><br>import sys, os<br>from socket import *<br>from twisted.internet.protocol import Factory, Protocol<br>
from twisted.internet import reactor<br>from twisted.names import dns, client, server<br>import time<br><br>LOGFILE = 'dnsfilter.log'<br><br>def allowip(ip):<br> return True<br><br><br>class Log:<br> """file like for writes with auto flush after each write<br>
to ensure that everything is logged, even during an<br> unexpected exit."""<br> def __init__(self, f):<br> self.f = f<br> def write(self, s):<br> self.f.write(s)<br> self.f.flush()<br>
<br>if __name__ == "__main__":<br> dns_servers = []<br> f = open('/etc/resolv.conf', "r")<br> while 1:<br> line = f.readline()<br> if not line:<br> break<br> if line[0]!='#':<br>
s, ns = line.strip().split(' ')<br> if s == 'nameserver':<br> dns_servers.append((ns,53))<br> #redirect outputs to a logfile<br> sys.stdout = sys.stderr = Log(open(LOGFILE, 'a+'))<br>
<br> print 'dnsfilter starting'<br> print dns_servers<br> <br> #address that traffic is redirected to<br> redirect = '10.0.64.1'<br> <br> greenlist= ['63.4.241.16', \<br> '216.13.188.67']<br>
<br> <br> class DNSDatagramProtocolTest(dns.DNSDatagramProtocol):<br> def writeMessage(self, message, address):<br> log = '%s DNS request from: %s\n' % (time.strftime("%m/%d/%y - %H:%M:%S", time.localtime()) ,address[0])<br>
for i in range(len(message.answers)):<br> x = message.answers[i]<br> print x.type<br> if x.type==1 and x.payload:<br> if not allowip(address[0]):<br>
to_adr = inet_ntoa(x.payload.address)<br> if to_adr in greenlist:<br> log += ' allowed to %s\n'%(to_adr)<br> else:<br>
log += ' not allowed so %s becomes %s\n'%(to_adr, redirect)<br> x.payload.address = inet_aton(redirect)<br> else:<br> log += ' to %s\n'%(inet_ntoa(x.payload.address))<br>
print log<br> self.transport.write(message.toStr(), address)<br><br> resolver = client.Resolver(servers=dns_servers)<br> f = server.DNSServerFactory(clients=[resolver])<br> p = DNSDatagramProtocolTest(f)<br>
reactor.listenUDP(53, p)<br> reactor.run()<br><br>