كيفية توجيه جميع المجالات الفرعية إلى مضيف واحد باستخدام MDNS؟

StackOverflow https://stackoverflow.com/questions/775233

  •  13-09-2019
  •  | 
  •  

سؤال

لدي خدمة WebServer التنمية مثل "myhost.local" الموجود باستخدام Bonjour / MDNS. الخادم يقوم بتشغيل avahi-daemon.

يريد WebServer أيضا التعامل مع أي نطاقات فرعية في نفسها. على سبيل المثال "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.

يمكنك القيام بذلك باستخدام ملف / إلخ / Avahi / Hosts. بدلا من ذلك يمكنك
استخدم Afahi-Publish- اسم المضيف.

لا، هو لا يستطيع. لأنه يريد تحديد اسم مستعار، وليس اسم مضيف جديد. أي أنه يريد فقط تسجيل RR، لا عكس PTR RR. ولكن إذا كنت تلتصق بشيء ما في / إلخ / Avahi / Hosts، فهو يسجل كلاهما، واكتشف تصادما إذا كان PTR RR غير فريد من نوعه، فسيكون هذا هو الحال بالنسبة لاسم مستعار.

هل كانت مفيدة؟

المحلول 4

لقد أعطيتها غير ممكنة في ذلك الوقت، وأنا لم أعد مراجعتها منذ ذلك الحين.

الحل الحالي هو إضافة كل نسل فرعي من الفائدة إلى ملف المضيفين على الجهاز المحلي.

نصائح أخرى

لقد قمت بحل هذا أفضل ما أستطيع مع كمية صغيرة من الوقت الذي قمت بتعيينه لهذه المهمة.

ولكن لسوء الحظ، لا أعتقد أن تنفيذ Windows ل Avahi / MSDNS / Bonjour يدعم الأسماء المستعارة (تصحيح لي إذا كنت مخطئا في أمثلة حول كيفية دعم هذا).

ما فعلته هو الذي قمت به مع مثال البرنامج النصي Python المقدمة على موقع Afahi:

خلق : /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)، وهذا شيء يتعامل مع العديد من تطبيقات DAEMON على * 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")

لا يعني ذلك بأي حال من الأحوال أن تكون قمة برمجة بيثون، لذلك لا تتردد في إجراء تحسينات حيث ترى مناسبا.

الاستعمال

إذا كان اسم المضيف لدينا "خادم" وكان Avahi-Hostname "Server.local"، فيمكننا ملء /etc/avahi/aliases ملف نصي مع أسماء HostNAMES إضافية مثل:

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

(ولكن حقا، أنا متأكد من أنك يمكن أن يكون لديك أي اسم مضيف موجود هناك تأكد من أنه لم يكن موجودا بالفعل على الشبكة، وهذا هو السبب في أنني فقط خلق "نطفة فرعية" من اسم مضيف Avahi العادي)

ثم نركض:

sudo avahi-publish-aliases

كان السبب الرئيسي لوضع هذا الأمر هو تسهيل محاكاة أسهل لتطوير موقع Django & Drupal على جهاز الكمبيوتر المحمول الخاص بي.

تحفظات

خيبة أمل بلدي الوحيدة هي أن تنفيذ Windows Bonjour / Avahi لا يدعم الأسماء المستعارة التي يعلن بها هذا التنفيذ، وسوف يرى فقط اسم مضيف Avahi الرئيسي الذي أعلنه عادة (أي Server.local في مثالنا أعلاه).

يبدو أن Airtonix نفذت هذا وجعلها متوفرة في https://github.com/airtonix/avahi-aliases.

شوكة محدثة أحدث التي اختبرتها على Ubuntu 11.04 في https://github.com/hmalphettes/avahi-aliases.

يمكنك تسجيل سجلات إضافية باستخدام AVAHI API. هذا المثال على Avahi Wiki يوضح كيفية نشر سجلات CNAME إضافية (الاسم المستعار) في Python.

أعلم أن هذا قديم، ولكن حل أفضل سيكون dnsmasq..

يمكن تحقيق ذلك ببساطة ... عبر الحجج / التكوين ...

إرجاع iPaddr لجميع المضيفين في المجالات المحددة.

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

👍

address=/yourdomain.com/10.0.1.100

هاهو!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top