Saltar al contenido

Conexión de nodos de Erlang cuando hay una dirección IP interna y externa en juego

Ya no tienes que investigar más por todo internet porque has llegado al lugar indicado, contamos con la solución que buscas y sin complicaciones.

Solución:

Lo que intentas lograr es definitivamente factible.

Preliminares

Las direcciones de distribución de Erlang se dividen en dos partes: el nombre del nodo y el nombre del host. Están separados por el @ firmar.

Los nombres de host pueden ser direcciones IPv4 numéricas. También pueden ser nombres de dominio. Hay dos modos distintos, donde los nombres de host son cortos (una sola palabra, p. Ej. vm1) y donde son largas (varias palabras, p. ej. vm1.domain.com). Las direcciones IP son nombres largos. Los nodos iniciados en un modo (corto o largo) solo pueden comunicarse con nodos iniciados en el mismo modo. Los nodos también están protegidos por una cookie: un nodo solo aceptará la conexión entrante con una cookie coincidente. Lo más fácil es iniciar todos los nodos de un clúster determinado con la misma cookie.

Cuando un nodo Erlang intenta conectarse a otro nodo Erlang, necesita encontrar la dirección IP del nodo distante. Si es igual que él mismo, simplemente intentará conectarse en el host local. Si es diferente, intentará resolver este nombre de host en una dirección IP.

Luego se conectará al epmd daemon en este host para saber qué puerto está ejecutando Erlang. epmd así como los nodos Erlang escuchan en todas las interfaces (por defecto).

Solución y ejemplo

Según este mecanismo, puede utilizar nombres cortos o largos, pero aprovechar el mecanismo de resolución. Lo más fácil en Unix sería configurar diferentes IP en cada /etc/hosts de sus máquinas (especialmente en las dos máquinas virtuales) para que se conecten entre sí a través de sus direcciones privadas, mientras se accede a ellas a través de sus direcciones públicas.

Digamos que la máquina virtual A (VM A) tiene la dirección IP privada 10.0.0.2 y la dirección IP pública 123.4.5.2 y la VM B tiene la dirección IP privada 10.0.0.3 y la dirección IP pública 123.4.5.3. También digamos que decidió optar por nombres cortos.

Podrías poner en VM A esta entrada en /etc/hosts:

10.0.0.3 vmb

Podrías poner la entrada correspondiente en las VM B /etc/hosts:

10.0.0.2 vma

Y en todos los clientes externos, podría poner:

123.4.5.2 vma
123.4.5.3 vmb

Comenzaría sus nodos de la siguiente manera:

# Node foo on VM A:
erl -sname [email protected] -cookie RANDOMCOOKIE
# Node foo on VM B:
erl -sname [email protected] -cookie RANDOMCOOKIE
# Client nodes:
erl -sname client -cookie RANDOMCOOKIE

Puedes evitar el /etc/hosts ediciones en los nodos del cliente si tiene un nombre de dominio (p. ej. yourdomain.com) y puedes conseguir vma.yourdomain.com para resolver a 123.4.5.2. También puede utilizar un archivo de configuración específico de Erlang Inet.

Seguridad

El mecanismo de distribución de Erlang no está destinado al público. Además, todas las comunicaciones estarán sin cifrar. Sugiero encarecidamente a configurar cortafuegos en cada host para permitir solo las conexiones de otros servidores de clúster y utilizar distribución SSL.

Para el firewall: la distribución de Erlang usa el puerto 4369 para epmd así como puertos aleatorios para cada nodo. Puede limitar el rango de estos puertos aleatorios utilizando la configuración del entorno de la aplicación del kernel de Erlang inet_dist_listen_min y inet_dist_listen_max. Deberá permitir las conexiones TCP entrantes en estos puertos, pero solo desde otros hosts del clúster.

La distribución SSL es bastante compleja de configurar pero está bien documentada. El principal inconveniente en su caso es que todas las conexiones deben ser sobre SSL, incluidas aquellas entre las dos máquinas virtuales en su red privada, y las conexiones locales para abrir shells remotos.

Antes de responder a la pregunta, quiero señalar que Distributed Erlang no es seguro y no debe usarlo fuera de una red de área local confiable. (Tuve que dejar ese comentario después de que vi “dirección IP externa”, supongo que no significa público). A continuación se muestra una lista de 4 cosas importantes que debe tener en cuenta:

  1. La dirección IP es parte del nombre del nodo.

Cuando inicia un nodo, es bueno darle un nombre como este:

erl -name [email protected]

Cuando intenta conectarse a ese nodo desde otra máquina, puede usar algo como esto en erlang shell:

net_kernel:connect('[email protected]').

La parte importante es ese nombre de nodo: '[email protected]' es un átomo. No es “nombre e ip”, es una cosa. Incluso, si su segundo nodo está en la misma máquina, no puede usar:

net_kernel:connect('[email protected]').

porque es un nombre de nodo diferente.

  1. Las conexiones están por encima de TCP

Esto significa que para conectar dos nodos, solo uno tiene que ver al otro.

Ejemplo: tienes:

  • un nodo en una máquina con dirección IP externa (el cliente) y
  • un nodo en una máquina con dirección IP interna (el nodo de almacenamiento en caché)

que:

  • no puede conectarse desde el cliente al nodo de almacenamiento en caché (porque no puede ver esa dirección IP)
  • usted pueden conéctese desde el nodo de almacenamiento en caché al cliente (porque el nodo de almacenamiento en caché ve la ip externa del cliente) y la conexión es bidireccional.

En el segundo caso, las conexiones son como si estuvieran en la misma red. Solo tienes que pensar en quién debe inicializar la conexión.

  1. Cuando conecta un nuevo nodo al clúster existente, intenta conectarse a todos los demás nodos.

Si no quieres eso, usa nodos ocultos.

  1. Asegúrese de utilizar la misma cookie de Erlang en todas partes.

Pero creo que lo tienes cubierto, si pudieras conectar otros nodos.

La solución más sencilla es utilizar direcciones IP externas en todas partes, porque la distribución de Erlang fue diseñada para ejecutarse en una red local. La solución más difícil implica asegurarse de que se conecte desde nodos en la red local a nodos con ip externa.

Te mostramos las reseñas y valoraciones de los lectores

Si estás contento con lo expuesto, tienes el poder dejar un artículo acerca de qué te ha impresionado de esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *