我已经建立了一个具有avahi意识的扭曲的迷你dns服务器。
它的作用是寻找以.local结尾的请求;如果它是主机的url类似{{hostname}}.local
,则dns服务器让os解析地址。如果它类似于{{subdomain}}.{{hostname}}.local
,则服务器将其路由到{{hostname}}.local
。
带来此程序的功能尚不清楚,它可以让您轻松地使用子域,而无需向/ etc / hosts添加所需的每个子域,而且它还支持本地网络中的机器并且还运行了avahi dnsconfd服务器。
这是代码:
编辑:现在服务器返回带有正确ip
的答案import socket
from twisted.internet import reactor
from twisted.names import dns
from twisted.names import client, server
hostname = socket.gethostbyaddr(socket.gethostname())[0]
magic_number = + 5 + 1 + len(hostname)
class Resolver(client.Resolver):
def lookupAddress(self, name, timeout = None):
if name.endswith('.local'):
local_name = name[-magic_number:]
ip = reactor.resolve(local_name)
if local_name == name:
ip = reactor.resolve(local_name)
def answer(adress):
a = dns.RRHeader(name=name, ttl=0)
payload = dns.Record_A(adress)
a.payload = payload
return ([a], [], [])
d = ip.addCallback(answer)
return d
else:
def answer(adress):
a = dns.RRHeader(name=name, type=dns.A, ttl=10)
payload = dns.Record_A(adress, ttl=10)
a.payload = payload
return ([a], [], [])
d = ip.addCallback(answer)
return d
else:
return self._lookup(name, dns.IN, dns.A, timeout)
resolver = Resolver(servers=[('212.27.40.241', 53)])
factory = server.DNSServerFactory(clients=[resolver])
protocol = dns.DNSDatagramProtocol(factory)
reactor.listenUDP(53, protocol)
reactor.listenTCP(53, factory)
reactor.run()
我做了一些挖掘测试,一切看起来都不错。我的主机名是tachtev
。
这是挖掘www.tachtev.local
的输出; <<>> DiG 9.7.3 <<>> www.tachtev.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12794
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.tachtev.local. IN A
;; ANSWER SECTION:
www.tachtev.local. 500 IN CNAME tachtev.local.
;; Query time: 2 msec
;; SERVER: 192.168.0.6#53(192.168.0.6)
;; WHEN: Sun Jun 26 15:51:41 2011
;; MSG SIZE rcvd: 49
这是nslookup的输出
root@tachtev:~# nslookup -debug www.tachtev.local
Server: 127.0.0.1
Address: 127.0.0.1#53
------------
QUESTIONS:
www.tachtev.local, type = A, class = IN
ANSWERS:
-> www.tachtev.local
internet address = 192.168.0.4
ttl = 10
AUTHORITY RECORDS:
ADDITIONAL RECORDS:
------------
Non-authoritative answer:
Name: www.tachtev.local
Address: 192.168.0.4
当我挖掘网址时,一切都很好看。但是现在当我尝试卷曲www.tachtev.local时,我收到了一个未找到主机的错误。
错误来自哪里?
编辑:依赖关系:avahi + avahi-dnsconfd + twisted + twisted name(不能pip'ed) 编辑:我没有找到解决方案,但有一个软件可以实现我想要实现的目标http://pow.cx/
答案 0 :(得分:1)
客户端操作系统使用称为存根解析器的东西。存根解析器期望他们的DNS服务器将是一个完整的递归解析器,并为他们提供完整的答案。
CNAME对存根解析器的回复必须包含CNAME的目标;也就是说,您必须在DNS有效负载和CNAME中包含A记录。