2010-12-09 25 views
8

के साथ पाइथन DNS सर्वर क्या कोई भी DNS सर्वर पायथन में लिखा गया है जहां मैं आसानी से कस्टम बैकएंड का उपयोग कर सकता हूं?कस्टम बैकएंड

असल में, मैं बस अपने स्वयं के आईपी के साथ कुछ डोमेन नामों के लिए लुक-अप का जवाब देना चाहता हूं, लेकिन बाकी वास्तविक लुक-अप को वास्तविक DNS सर्वर पर पास करना चाहता हूं।

+2

बहुत अधिक DNS सर्वर (पायथन या नहीं) ठीक से कॉन्फ़िगर किए जाने पर ऐसा करेगा। क्या आपके पास डोमेन की एक बड़ी संख्या है जैसे कि आपको उनके लिए एक SQL डेटाबेस चाहिए, कहें? – kindall

उत्तर

12

मैं ऐसी बात हाल ही में लिखा था, हो सकता है आप एक उदाहरण के रूप में उपयोग कर सकते हैं। यह बैकएंड के रूप में एक डीएचटी का उपयोग करता है और वहां सभी .kad डोमेन देखता है। यदि आप बस अपनी खुद की मैपिंग के साथ P2PMapping को प्रतिस्थापित करते हैं (यानी {'google.com' : '127.0.0.1'} जैसे एक निर्देश) तो यह वही करना चाहिए जो आप चाहते हैं।

""" 
Created on 16.08.2010 

@author: Jochen Ritzel 
""" 

import dht 

from twisted.names import dns, server, client, cache 
from twisted.application import service, internet 

class P2PMapping(dht.EntangledDHT): 

    def __contains__(self, key): 
     return key.endswith('.kad') 

class MapResolver(client.Resolver): 
    """ 
    Resolves names by looking in a mapping. 
    If `name in mapping` then mapping[name] should return a IP 
    else the next server in servers will be asked for name  
    """ 
    def __init__(self, mapping, servers): 
     self.mapping = mapping 
     client.Resolver.__init__(self, servers=servers) 
     self.ttl = 10 

    def lookupAddress(self, name, timeout = None): 
     # find out if this is a .kad. request 
     if name in self.mapping: 
      result = self.mapping[name] # get the result 
      def packResult(value): 
       return [ 
         (dns.RRHeader(name, dns.A, dns.IN, self.ttl, dns.Record_A(value, self.ttl)),),(),() 
       ] 
      result.addCallback(packResult) # put it in a A Record 
      return result 
     else: 
      return self._lookup(name, dns.IN, dns.A, timeout) 


## this sets up the application 


application = service.Application('dnsserver', 1, 1) 


## set up the DHT 
mapping = P2PMapping(bootstrap=[('127.0.0.1', 4001)]) 
mapping['jochen.kad'] = '99.99.99.99' # "register" domain with IP 


# set up a resolver that uses the mapping or a secondary nameserver 
p2presolver = MapResolver(mapping, servers=[('192.168.178.1', 53)]) 


# create the protocols 
f = server.DNSServerFactory(caches=[cache.CacheResolver()], clients=[p2presolver]) 
p = dns.DNSDatagramProtocol(f) 
f.noisy = p.noisy = False 


# register as tcp and udp 
ret = service.MultiService() 
PORT=53 

for (klass, arg) in [(internet.TCPServer, f), (internet.UDPServer, p)]: 
    s = klass(PORT, arg) 
    s.setServiceParent(ret) 


# run all of the above as a twistd application 
ret.setServiceParent(service.IServiceCollection(application)) 


# run it through twistd! 
if __name__ == '__main__': 
    import sys 
    print "Usage: twistd -y %s" % sys.argv[0] 
+3

क्या कोई रास्ता है जिसे मैं बिना घुमाए बिना चला सकता हूं? यानी इसे मेरे आवेदन के धागे में डाल दिया। इससे डीएनएस अनुरोधों का उत्तर देना आसान हो जाएगा। – Mononofu

4

कई लोग इसे ट्विस्ट में लिखने की सलाह देंगे, और एक अनुकूलन जोड़ना चाहते हैं ताकि आप अपने अनुरोध का उत्तर दे सकें। कुछ लिंक:

http://twistedmatrix.com/documents/10.1.0/names/howto/names.html

http://twistedmatrix.com/documents/10.1.0/api/twisted.names.dns.DNSDatagramProtocol.html

+0

सुझाव के लिए धन्यवाद, लेकिन मुझे नहीं पता कि इस तरह के अनुकूलन को कैसे जोड़ना है (वर्तमान में सीचिंग) - क्या आप मुझे संकेत दे सकते हैं? – Mononofu

5

वास्तव में, मैं एक भी सरल विधि पाया:

http://doc.powerdns.com/pipebackend-dynamic-resolution.html

http://doc.powerdns.com/backends-detail.html#PIPEBACKEND

बस, PowerDNS सर्वर स्थापित एक छोटे से स्क्रिप्ट प्रश्नों अग्रेषित करता लिखें: पाइप बैकएंड साथ PowerDNS आपके सर्वर पर और आप कर रहे हैं।

संबंधित मुद्दे