Как перенаправить все субдомены на один хост, используя mDNS? - PullRequest
22 голосов
/ 22 апреля 2009

У меня есть хостинг для разработки веб-сервера под названием "myhost.local", который можно найти с помощью Bonjour / mDNS. На сервере работает avahi-daemon.

Веб-сервер также хочет обрабатывать любые дочерние домены. Например, "cat.myhost.local" и "dog.myhost.local" и "guppy.myhost.local".

Учитывая, что myhost.local находится на динамическом IP-адресе от dhcp, есть ли способ направить все запросы для поддоменов в myhost.local?

Я начинаю думать, что в настоящее время это невозможно ...

http://marc.info/?l=freedesktop-avahi&m=119561596630960&w=2

Вы можете сделать это с файлом / etc / avahi / hosts. В качестве альтернативы вы можете
используйте имя avahi-publish-host-name.

Нет, он не может. Так как он хочет определить псевдоним, а не новый Имя хоста. То есть он только хочет зарегистрировать A RR, без обратного PTR RR. Но если вы вставляете что-то в / etc / avahi / hosts, то это регистрирует оба, и обнаруживает коллизию, если PTR RR не является уникальным, что было бы кейс для псевдонима.

Ответы [ 5 ]

12 голосов
/ 09 октября 2010

Я решил это как можно лучше с небольшим количеством времени, отведенного для этой задачи.

Но, к сожалению, я не думаю, что реализация avahi / msdns / bonjour для Windows поддерживает псевдонимы (поправьте меня, если я ошибаюсь с примерами того, как это поддерживать).

Я начал с примера скрипта Python, представленного на веб-сайте avahi:

Создать: /usr/bin/avahi-announce-alias

Сделайте его исполняемым и заполните его

#! /usr/bin/env python
# avahi-alias.py

import avahi, dbus
from encodings.idna import ToASCII

# Got these from /usr/include/avahi-common/defs.h
CLASS_IN = 0x01
TYPE_CNAME = 0x05

TTL = 60

def publish_cname(cname):
    bus = dbus.SystemBus()
    server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER),
            avahi.DBUS_INTERFACE_SERVER)
    group = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()),
            avahi.DBUS_INTERFACE_ENTRY_GROUP)

    rdata = createRR(server.GetHostNameFqdn())
    cname = encode_dns(cname)

    group.AddRecord(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, dbus.UInt32(0),
        cname, CLASS_IN, TYPE_CNAME, TTL, rdata)
    group.Commit()


def encode_dns(name):
    out = []
    for part in name.split('.'):
        if len(part) == 0: continue
        out.append(ToASCII(part))
    return '.'.join(out)

def createRR(name):
    out = []
    for part in name.split('.'):
        if len(part) == 0: continue
        out.append(chr(len(part)))
        out.append(ToASCII(part))
    out.append('\0')
    return ''.join(out)

if __name__ == '__main__':
    import time, sys, locale
    for each in sys.argv[1:]:
        name = unicode(each, locale.getpreferredencoding())
        publish_cname(name)
    try:
        # Just loop forever
        while 1: time.sleep(60)
    except KeyboardInterrupt:
        print "Exiting"

Этот скрипт обрабатывает объявление каждого отдельного псевдонима и будет работать до тех пор, пока вы его не уничтожите. (из-за этого нам нужно создать еще один скрипт, который я показал ниже)

Создать текстовый файл /etc/avahi/aliases

Это мы используем для хранения псевдонимов этого устройства по одному на строку

Создать каталог /etc/avahi/aliases.d/

На самом деле я не использовал это ни в одном из сценариев, которые я покажу здесь, но для тех предприимчивых людей, вы можете увидеть, что нужно сделать.

Идея состоит в том, что вы можете сгруппировать псевдонимы в отдельные текстовые файлы (что будет иметь больше смысла, когда вы имеете дело с виртуальными хостами в apache), это то, что многие приложения-демоны на * nix уже предоставляют (apache и apt - это только два примера ).

Создать /usr/bin/avahi-announce-aliases

Сделайте его исполняемым и заполните его

#!/usr/bin/env python

import os, sys
from subprocess import Popen


def ensure_file (path):
    """
        Looks for  file at provided path, creates it if it does not exist.
        Returns the file.
    """
    rfile = None    
    if not os.path.exists(path) and os.path.isfile(path) :
        rfile = open(path,"w+");
        print("ensuring file : %s " % path)

    print("file ensured : %s " % path)
    return rfile


command = '/usr/bin/avahi-announce-alias'
alias_pid_path = "/tmp/avahi-aliases.pid"
alias_file_path = "/etc/avahi/aliases"

alias_file = open(alias_file_path)
if not os.path.exists(alias_pid_path) :
    open(alias_pid_path,"w").close()

alias_pid = open(alias_pid_path,"r")


for line in alias_pid :
    txt = line.strip('\n')
    if len(txt) > 0 :
        print("kill %s" % txt )
        os.system("kill %s" % txt)          
alias_pid.close()
alias_pid = open(alias_pid_path,"w+")

for line in alias_file :
    txt = line.strip('\n')
    if len(txt) > 0 :
        print("publishing : << %s >>" % txt)
        process = Popen([command, txt])
        alias_pid.write("%s\n" % str(process.pid))    
alias_pid.close()

print("done")

Это ни в коем случае не является вершиной программирования на Python, поэтому не стесняйтесь вносить улучшения там, где считаете нужным.

Использование

Если наше имя хоста было «server», а имя avahi-hostname было «server.local», то мы могли бы заполнить текстовый файл /etc/avahi/aliases вашими дополнительными именами хостов, например:

deluge.server.local
username.server.local
accounts.server.local
something-else.server.local
another.hostname.home

(но на самом деле, я вполне уверен, что у вас может быть любое имя хоста, если вы убедитесь, что оно еще не существует в сети, поэтому я просто создаю «субдомены» обычного имени хоста avahi)

Затем мы запускаем:

sudo avahi-publish-aliases

Моей главной причиной для настройки было облегчение моделирования разработки сайта django & drupal на моем ноутбуке.

* * Предостережения тысячи сорок-девять

Мое единственное разочарование состоит в том, что реализация Bonjour / Avahi для Windows не поддерживает псевдонимы, которые объявляет эта реализация, она будет видеть только обычно объявленное основное имя хоста avahi (то есть server.local в нашем примере выше).

5 голосов
/ 31 декабря 2011

Похоже, airtonix реализовал это и сделал его доступным на https://github.com/airtonix/avahi-aliases

Более свежий обновленный форк, который я тестировал на Ubuntu 11.04, находится по адресу https://github.com/hmalphettes/avahi-aliases

4 голосов
/ 14 марта 2010

В то время я отказался от этого, и с тех пор я не возвращался к этой проблеме.

Мое текущее решение состоит в том, чтобы кропотливо добавлять каждый интересующий поддомен в файл hosts на локальной машине.

4 голосов
/ 10 мая 2009

Вы можете зарегистрировать дополнительные записи, используя API Avahi. Этот пример в вики Avahi демонстрирует, как публиковать дополнительные записи CNAME (псевдонимы) в Python.

0 голосов
/ 02 февраля 2015

Я знаю, что это старый, но лучшее решение было бы dnsmasq .

Это может быть выполнено ТАК просто ... через аргументы / config ...

Возвращает ipaddr для всех хостов в указанных доменах.

-A, --address=/<domain>/<ipaddr>

?

address=/yourdomain.com/10.0.1.100

Voila!

...