servidor redireccionar otro dominio bonjour zeroconf mdns

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.



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!