MDNS를 사용하여 모든 하위 도메인을 단일 호스트로 라우팅하는 방법은 무엇입니까?
문제
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
짜잔!