如何实现avahi感知的本地子域dns服务器?

如何实现avahi感知的本地子域dns服务器?,dns,subdomain,twisted,avahi,Dns,Subdomain,Twisted,Avahi,我已经用twisted构建了一个迷你dns服务器,它支持avahi 它所做的是寻找以.local结尾的请求;如果是主机的url,比如{{hostname}}.local,dns服务器让操作系统解析地址。如果它类似于{{subdomain}.{{hostname}.local服务器将它路由到{{hostname}.local 该程序带来的功能尚不清楚,它可以让您轻松地使用子域,而无需将所需的每个子域添加到/etc/hosts,另外,它还支持本地网络中运行avahi dnsconfd服务器的机器 代

我已经用twisted构建了一个迷你dns服务器,它支持avahi

它所做的是寻找以.local结尾的请求;如果是主机的url,比如
{{hostname}}.local
,dns服务器让操作系统解析地址。如果它类似于
{{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()
我用dig做了一些测试,一切看起来都很好。我的主机名是
tachtev

这是dig 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
当我挖掘URL时,一切看起来都很好。但现在,当我尝试卷曲www.tachtev.local时,我得到一个主机未找到错误

错误来自哪里

编辑:依赖项:avahi+avahi dnsconfd+twisted+twisted名称(不能被pip'ed)
编辑:我没有找到解决方案,但有一个软件可以实现我想要实现的功能

客户端操作系统使用一种称为存根解析器的东西。存根解析程序期望他们的DNS服务器是一个成熟的递归解析程序,并为他们提供一个完整的答案


CNAME对存根解析程序的回复必须包括CNAME的目标;也就是说,您必须在DNS负载以及CNAME中包含A记录。

socket.gethostname通常不是了解本地主机名的非常可靠的方法。运行此操作时,
hostname
是否实际设置为“tachtev”?当我运行它时,我得到的是“localhost.localdomain”。@Jean-Paul Calderone,是的,它设置为tachtev,它直接来自python文档。python文档并不总是正确的。:)这些方法中的每一种都会在某些配置中中断。为什么不运行avahi呢?这听起来对你来说是一个很大的麻烦…@vidstige,avahi没有将子域解析为域ip…我添加了一个a记录,但它不起作用。我修改了程序,直接回答A记录而不是CNAME+A。但它仍然不起作用。
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