bonjour - redireccionar - ¿Cómo enrutar todos los subdominios a un solo host usando mDNS?
redireccionar dominio a ip (5)
Tengo un servidor de desarrollo de alojamiento web como "myhost.local" que se encuentra usando Bonjour / mDNS. El servidor está ejecutando avahi-daemon.
El servidor web también quiere manejar cualquier subdominio de sí mismo. Por ejemplo, "cat.myhost.local" y "dog.myhost.local" y "guppy.myhost.local".
Dado que myhost.local está en una dirección IP dinámica desde dhcp, ¿todavía hay una manera de enrutar todas las solicitudes de los subdominios a myhost.local?
Estoy empezando a pensar que actualmente no es posible ...
http://marc.info/?l=freedesktop-avahi&m=119561596630960&w=2
Puede hacer esto con el archivo / etc / avahi / hosts. Alternativamente puedes
utilizar avahi-publish-host-name.No, no puede. Como quiere definir un alias, no un nuevo nombre de host. Es decir, solo quiere registrar un RR A, no un RR PTR inverso. Pero si inserta algo en / etc / avahi / hosts, entonces registra ambos, y detecta una colisión si el PTR RR no es único, lo que sería el caso de un alias.
Lo dejé como no era posible en ese momento, y no he vuelto a examinar el problema desde entonces.
Mi solución actual es agregar laboriosamente cada subdominio de interés al archivo de hosts en la máquina local.
Parece que Airtonix implementó esto y lo puso a disposición en https://github.com/airtonix/avahi-aliases
Un fork actualizado más reciente que he probado en Ubuntu 11.04 se encuentra en https://github.com/hmalphettes/avahi-aliases
Puede registrar registros adicionales utilizando la API de Avahi. Este ejemplo en la wiki de Avahi demuestra cómo publicar registros adicionales de CNAME (alias) en Python.
Resolví esto lo mejor que pude con el poco tiempo que le asigné a esta tarea.
Pero, lamentablemente, no creo que la implementación de Windows de avahi / msdns / bonjour sea compatible con los alias (corríjame si me equivoco con ejemplos de cómo apoyar esto).
Lo que hice fue comenzar con el ejemplo de script de python que se proporciona en el sitio web de avahi:
Crear: /usr/bin/avahi-announce-alias
Hazlo ejecutable y rellénalo con
#! /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"
Esta secuencia de comandos maneja el anuncio de cada alias individual y seguirá ejecutándose hasta que lo elimines. (debido a esto, necesitamos crear otro script que se muestra a continuación)
Crear archivo de texto /etc/avahi/aliases
Esto usamos para almacenar alias a esta máquina uno por línea.
Crear directorio /etc/avahi/aliases.d/
En realidad, no he utilizado esto en ninguno de los scripts que muestro aquí todavía, pero para esas personas emprendedoras, puedes ver lo que hay que hacer.
La idea es que puede agrupar los alias en archivos de texto separados (lo que tendrá más sentido cuando trate con hosts virtuales en apache), esto es algo que muchas aplicaciones de daemon en * nix ya proporcionan (apache y apt son solo dos ejemplos).
Crear /usr/bin/avahi-announce-aliases
Hazlo ejecutable y llénalo con
#!/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")
De ninguna manera pretende ser el pináculo de la programación de python, así que siéntase libre de hacer mejoras donde le parezca.
Uso
Si nuestro nombre de host era "servidor" y el nombre de host-avahi era "server.local", entonces podríamos completar el archivo de texto /etc/avahi/aliases
con sus nombres de host adicionales como:
deluge.server.local
username.server.local
accounts.server.local
something-else.server.local
another.hostname.home
(pero realmente, estoy bastante seguro de que podría tener cualquier nombre de host allí siempre y cuando se haya asegurado de que no existiera en la red, por lo que simplemente creo ''subdominios'' del nombre de host avahi normal)
Luego corremos:
sudo avahi-publish-aliases
Mi principal razón para configurar esto fue facilitar la simulación del desarrollo del sitio web de django & drupal en mi computadora portátil.
Advertencias
Mi única decepción es que la implementación de Windows de Bonjour / Avahi no es compatible con los alias que anuncia esta implementación, solo verá el nombre principal de host avahi normalmente anunciado (es decir, server.local en nuestro ejemplo anterior).
Sé que esto es viejo, pero una mejor solución sería dnsmasq .
Esto se puede lograr tan simplemente ... a través de los argumentos / config ...
Devuelve ipaddr para todos los hosts en dominios especificados.
-A, --address=/<domain>/<ipaddr>
👍
address=/yourdomain.com/10.0.1.100
Voila!