¿Cómo hago que RabbitMQ escuche solo a localhost?

41

He instalado RabbitMQ en una máquina Debian Linux Squeeze, y me gustaría que solo escuche la interfaz localhost. Yo he añadido

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

a mi /etc/rabbitmq/rabbitmq.confarchivo, y eso hace que se una solo a la interfaz localhost cuando se escucha en el amqppuerto (5672). Sin embargo, todavía se une a todas las interfaces cuando se escucha en los puertos epmd (4369) y 43380:

# lsof -n -a -i -urabbitmq
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
epmd     7353 rabbitmq    3u  IPv4 1177662      0t0  TCP *:epmd (LISTEN)
epmd     7353 rabbitmq    5u  IPv4 1177714      0t0  TCP 127.0.0.1:epmd->127.0.0.1:50877 (ESTABLISHED)
beam.smp 7365 rabbitmq   10u  IPv4 1177711      0t0  TCP *:43380 (LISTEN)
beam.smp 7365 rabbitmq   11u  IPv4 1177713      0t0  TCP 127.0.0.1:50877->127.0.0.1:epmd (ESTABLISHED)
beam.smp 7365 rabbitmq   19u  IPv4 1177728      0t0  TCP 127.0.0.1:amqp (LISTEN)

¿Cómo evito esto? ¿Tengo que configurar iptables o hay opciones adicionales de configuración de RabbitMQ que harán que haga lo que quiero?

Vebjorn Ljosa
fuente
epmd no es parte de RabbitMQ. Es el demonio de nombres Erlang. La mejor manera de unirse solo a localhost es darle al conejo el nombre de 'conejo @ localhost'. Este es el nombre de nodo utilizado para agrupar varios servidores RabbitMQ, y Erlang lo utiliza para encontrar el nodo en la red. La parte después de @ es el nombre de host que ejecuta Rabbit y, claramente, localhost no es un nombre accesible externamente.
Michael Dillon

Respuestas:

49

Poner lo siguiente /etc/rabbitmq/rabbitmq-env.confhará que RabbitMQ y epmd escuchen solo en localhost:

export RABBITMQ_NODENAME=rabbit@localhost
export RABBITMQ_NODE_IP_ADDRESS=127.0.0.1
export ERL_EPMD_ADDRESS=127.0.0.1

Se necesita un poco más de trabajo para configurar Erlang para usar solo localhost para el puerto con un número más alto (que se usa para agrupar nodos, por lo que puedo decir). Si no le importa la agrupación y solo desea que Rabbit se ejecute completamente localmente, puede pasarle a Erlang una opción de kernel para que solo use la interfaz de bucle invertido.

Para hacerlo, cree un nuevo archivo en /etc/rabbitmq/- Lo llamaré rabbit.config. En este archivo pondremos la opción Erlang que necesitamos cargar en tiempo de ejecución.

[{kernel,[{inet_dist_use_interface,{127,0,0,1}}]}].

Si está utilizando el complemento de administración y también desea limitarlo a localhost, deberá configurar sus puertos por separado, haciendo que el conejo.config incluya esto:

[ {rabbitmq_management, [ {listener, [{port, 15672}, {ip, "127.0.0.1"}]} ]}, {kernel, [ {inet_dist_use_interface,{127,0,0,1}} ]} ].

(Tenga en cuenta que RabbitMQ deja epmd ejecutándose cuando se cierra, por lo que si desea bloquear el puerto de agrupación de Erlang, deberá reiniciar epmd por separado de Rabbit).

Luego, necesitamos que RabbitMQ cargue esto al inicio. Abre de /etc/rabbitmq/rabbitmq.confnuevo y coloca lo siguiente en la parte superior:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Esto carga ese archivo de configuración cuando se inicia el servidor de conejo y pasará las opciones a Erlang.

¡Ahora debería tener todos los procesos de Erlang / RabbitMQ escuchando solo en localhost! Esto se puede verificar connetstat -ntlap

EDIT: En las versiones anteriores de RabbitMQ, el fichero de configuración es: /etc/rabbitmq/rabbitmq.conf. Sin embargo, este archivo ha sido reemplazado por el rabbit-env.confarchivo.

David Wilemski
fuente
1
¡Bravo! Gracias. Nota: necesitaba 'rabbitmq-env.conf' en RabbitMQ para CentOS / RHEL a través de EPEL. Y aunque la exportación de 'conejo' para 'conejo.config' me pareció extraña, funcionó sin sufijo.
astrostl
"Abre de /etc/rabbitmq/rabbitmq.confnuevo". Por qué otra vez"? Qué quiere decir rabbitmq-env.conf?
phinz
La variable de entorno ERL_EPMD_ADDRESSsolo controla la IP de escucha de epmd, si desea cambiar la IP de escucha del puerto del clúster (25672) de RabbitMQ, debe usar la inet_dist_use_interfaceopción. NODE_IP_ADDRESS=127.0.0.1 ERL_EPMD_ADDRESS=127.0.0.1 SERVER_START_ARGS="-kernel inet_dist_use_interface {127,0,0,1}"
Terry el
13

Para hacer que RabbitMQ escuche en localhost / enlace solo a localhost:

3 formas diferentes (todas equivalentes):

  • Coloque NODE_IP_ADDRESS = 127.0.0.1 en el archivo de variables de entorno (consulte http://www.rabbitmq.com/configure.html#define-environment-variables )

  • Ponga las propiedades tcp_listeners y ssl_listeners en el archivo de configuración: las entradas de configuración tcp_listeners y ssl_listeners gobiernan las interfaces que escucha RabbitMQ. Una entrada para escuchar en localhost sería, por ejemplo, {tcp_listeners, [{'127.0.0.1', 5672}]} (La sintaxis puede no ser correcta, verifíquela) http://www.rabbitmq.com/configure.html# archivo de configuración

  • exportar el env. variable en el script de inicio (/etc/init.d/rabbitmq-server) exportar RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Este último funcionó para mí.

EPMD:

El programa Epmd hace que partes distribuidas del tiempo de ejecución de Erlang funcionen. Si está creando un clúster de varias máquinas, debe dejarlos accesibles para otros nodos y, sin duda, localhost. Pero tiene protección incorporada a través de un archivo cookie.

Casi nunca requiere atención. Solo tenga en cuenta que los programas erlang (incluido rabbitmqctl, por ejemplo) necesitan acceder a ese puerto para contactar con otros programas erlang.

Pero, si se trata de datos financieros o registros de salud, puede ser una buena idea proteger la EPMD. El puerto predeterminado que usa epmd es 4369, otros programas se conectan a él a través de tcp.

Ver también: http://www.erlang.org/doc/man/epmd.html#environment_variables

Si necesita asegurar RabbitMQ más,

  1. Deshabilite la cuenta de invitado integrada http://www.rabbitmq.com/admin-guide.html#default-state

  2. Considere usar SSL y autenticar usando la cadena de certificados

Obtuve estas respuestas del canal IRC de la comunidad RabbitMQ.

Quisiera agradecerles.

http://dev.rabbitmq.com/irclog/index.php?date=2011-06-14

Espero que lo anterior te ahorre algo de tiempo (me tomó 6 horas encontrar una respuesta).

Boris
fuente
El enlace epmd anterior tiene una entrada para ERL_EPMD_ADDRESS, presumiblemente para establecer las direcciones a las que se vinculará epmd, excepto que no veo dónde establecer esa variable de entorno para el usuario rabbitmq.
François Beausoleil
5

Si especifica variables de entorno en el archivo rabbitmq.conf, debe eliminar el prefijo RABBITMQ_, así que intente:

NODE_IP_ADDRESS = 127.0.0.1

cbz
fuente
En mi instalación, ya sea RABBITMQ_NODE_IP_ADDRESSo NODE_IP_ADDRESSfunciona, pero como se menciona solo para el puerto amqp.
Vebjorn Ljosa
1
El puerto epmd es una función del mapeador de puertos erlang, y afaik no es posible restringir su dirección de enlace.
cbz
Además, el puerto EPMD está protegido con cookies para que nadie pueda conectarse a menos que conozca la cookie del servidor RabbitMQ. Solo le daría esa cookie a otros miembros de un clúster RabbitMQ. El mismo principio que una clave API.
Michael Dillon