MDNS를 사용하여 모든 하위 도메인을 단일 호스트로 라우팅하는 방법은 무엇입니까?

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

  •  13-09-2019
  •  | 
  •  

문제

Bonjour/MDNS를 사용하여 발견되는 "MyHost.local"으로 개발 웹 서버 호스팅을 보유하고 있습니다. 서버가 Avahi-Daemon을 실행 중입니다.

웹 서버는 또한 자체의 하위 도메인을 처리하려고합니다. 예 : "cat.myhost.local"및 "dog.myhost.local"및 "guppy.myhost.local".

MyHost.local이 DHCP의 동적 IP 주소에 있다는 점을 감안할 때, 하위 도메인에 대한 모든 요청을 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이 비 유니 키 인 경우 충돌을 감지합니다. 이는 별칭의 경우입니다.

도움이 되었습니까?

해결책 4

당시에는 불가능한 것으로 포기했고 그 이후로 문제를 다시 방문하지 않았습니다.

내 현재 솔루션은 로컬 컴퓨터의 호스트 파일에 관심있는 각 하위 도메인을 힘들게 추가하는 것입니다.

다른 팁

나는이 작업에 할당 한 소량의 시간으로 최대한 최선을 다했습니다.

그러나 불행히도 나는 Avahi/MSDNS/Bonjour의 Windows 구현이 별칭을 지원한다고 생각하지 않습니다 (이것을 지원하는 방법의 예가 잘못되면 나를 수정합니다).

내가 한 일은 Avahi 웹 사이트에 제공된 예제 Python 스크립트로 시작했습니다.

만들다 : /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")

그것은 결코 파이썬 프로그래밍의 정점이되는 것은 결코 아니므로, 적합한 곳에서 자유롭게 개선하십시오.

용법

호스트 이름이 "서버"이고 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) 만 볼 수 있습니다.

airtonix가 이것을 구현 한 것처럼 보입니다. https://github.com/airtonix/avahi-aliases

Ubuntu 11.04에서 테스트 한 최신 업데이트 포크는 https://github.com/hmalphettes/avahi-aliases

Avahi API를 사용하여 추가 레코드를 등록 할 수 있습니다. 이 예 Avahi Wiki에서 Python에 추가 CNAME (ALIAS) 레코드를 게시하는 방법을 보여줍니다.

나는 이것이 오래된 것을 알고 있지만 더 나은 해결책은 DNSMASQ.

이것은 간단하게 달성 될 수 있습니다 ... 인수/구성을 통해 ...

지정된 도메인의 모든 호스트에 대해 iPADDR을 반환합니다.

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

👍

address=/yourdomain.com/10.0.1.100

짜잔!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top