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 = &#39;dnsfilter.log&#39;<br><br>def allowip(ip):<br>    return True<br><br><br>class Log:<br>    &quot;&quot;&quot;file like for writes with auto flush after each write<br>
    to ensure that everything is logged, even during an<br>    unexpected exit.&quot;&quot;&quot;<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__ == &quot;__main__&quot;:<br>    dns_servers = []<br>    f = open(&#39;/etc/resolv.conf&#39;, &quot;r&quot;)<br>    while 1:<br>        line = f.readline()<br>        if not line:<br>            break<br>        if line[0]!=&#39;#&#39;:<br>
            s, ns = line.strip().split(&#39; &#39;)<br>            if s == &#39;nameserver&#39;:<br>                dns_servers.append((ns,53))<br>    #redirect outputs to a logfile<br>    sys.stdout = sys.stderr = Log(open(LOGFILE, &#39;a+&#39;))<br>
<br>    print &#39;dnsfilter starting&#39;<br>    print dns_servers<br>    <br>    #address that traffic is redirected to<br>    redirect = &#39;10.0.64.1&#39;<br>    <br>    greenlist=  [&#39;63.4.241.16&#39;, \<br>                 &#39;216.13.188.67&#39;]<br>
    <br>    <br>    class DNSDatagramProtocolTest(dns.DNSDatagramProtocol):<br>        def writeMessage(self, message, address):<br>            log = &#39;%s DNS request from: %s\n&#39; % (time.strftime(&quot;%m/%d/%y - %H:%M:%S&quot;, 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 += &#39; allowed to %s\n&#39;%(to_adr)<br>                        else:<br>
                            log += &#39; not allowed so %s becomes %s\n&#39;%(to_adr, redirect)<br>                            x.payload.address = inet_aton(redirect)<br>                    else:<br>                        log += &#39; to %s\n&#39;%(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>