2

ツイストを使用して avahi 対応のミニ DNS サーバーを構築しました。

.local; で終わるリクエストを探します。ホストの URL の場合は{{hostname}}.local、DNS サーバーのようなもので、OS にアドレスを解決させます。サーバーのようなものであれば{{subdomain}}.{{hostname}}.local、にルーティングします{{hostname}}.local

このプログラムをもたらす機能は明確ではありません。必要なすべてのサブドメインを /etc/hosts に追加することなく、サブドメインを簡単に操作できます。プラス面は、ローカル ネットワークにあるマシンもサポートします。 avahi dnsconfd サーバーが実行されています。

コードは次のとおりです。

編集:サーバーは正しいIPでA回答を返すようになりました

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

ここに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

URLを掘り下げると、すべてが良さそうです。しかし、www.tachtev.local をカールしようとすると、ホストが見つからないというエラーが発生します。

エラーはどこから来たのですか?

編集: 依存関係: avahi + avahi-dnsconfd + ツイスト + ツイスト名 (これは pip できません) 編集: 解決策は見つかりませんでしたが、達成したいことを実行するソフトウェアがありますhttp://pow.cx /

4

1 に答える 1

1

クライアント OS は、スタブ リゾルバーと呼ばれるものを使用します。スタブ リゾルバーは、DNS サーバーが本格的な再帰リゾルバーであることを期待し、完全な形式の回答を提供します。

スタブ リゾルバーへの CNAME 応答には、CNAME のターゲットを含める必要があります。つまり、DNS ペイロードと CNAME に A レコードを含める必要があります。

于 2011-06-27T14:59:16.363 に答える