Как реализовать локальный субдомен DNS-сервер, который знает Avahi?
Я построил мини-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
,
вот выход копания 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'ed) редактировать: я не нашел решения, но есть программное обеспечение, которое делает то, что я хочу достичь http://pow.cx/
1 ответ
Клиентские ОС используют то, что называется заглушкой. Решатели-заглушки ожидают, что их DNS-сервер будет полноценным рекурсивным преобразователем, и предоставят им полный ответ.
CNAME ответы на преобразователь заглушки должны включать цель CNAME; то есть вы должны включить запись A в полезную нагрузку DNS, а также в CNAME.