mDNS を使用してすべてのサブドメインを単一のホストにルーティングするにはどうすればよいですか?
質問
Bonjour/mDNS を使用して見つかった「myhost.local」としてホスティングしている開発 Web サーバーがあります。サーバーは avahi-daemon を実行しています。
Web サーバーは、それ自体のサブドメインも処理したいと考えています。たとえば、「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
その時は無理だと諦めてしまい、それ以来この問題を再度検討することはありませんでした。
私の現在の解決策は、関心のある各サブドメインをローカル マシン上のホスト ファイルに手間をかけて追加することです。
他のヒント
このタスクに割り当てられた短い時間で、できる限り最善を尽くしてこれを解決しました。
しかし、残念ながら、Windows の avahi/msdns/bonjour 実装はエイリアスをサポートしていないと思います (これをサポートする方法の例が間違っている場合は修正してください)。
私がやったことは、avahi Web サイトで提供されているサンプル 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
これは、このマシンのエイリアスを 1 行に 1 つ保存するために使用します
ディレクトリの作成 /etc/avahi/aliases.d/
ここで紹介するスクリプトではまだこれを実際に使用していませんが、進取的な人々にとっては、何をする必要があるかがわかるでしょう。
このアイデアは、エイリアスを別々のテキスト ファイルにグループ化できるというものであり (Apache で仮想ホストを扱う場合にはこれがより合理的です)、これは *nix 上の多くのデーモン アプリケーションがすでに提供しているものです (Apache と apt は 2 つの例にすぎません)。
作成する /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 の Web サイト開発のシミュレーションを容易にするためでした。
注意事項
私の唯一の残念な点は、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 (エイリアス) レコードを公開する方法を示しています。
これが古いことはわかっていますが、より良い解決策は次のとおりです dnsマスク.
これはとても簡単に実現できます...引数/設定経由...
指定されたドメイン内のすべてのホストの ipaddr を返します。
-A, --address=/<domain>/<ipaddr>
👍
address=/yourdomain.com/10.0.1.100
出来上がり!