Come faccio ad ascoltare RabbitMQ solo su localhost?


41

Ho installato RabbitMQ su una macchina Debian Linux Squeeze e vorrei che ascoltasse solo l'interfaccia localhost. ho aggiunto

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

al mio /etc/rabbitmq/rabbitmq.conffile e questo lo rende associato solo all'interfaccia localhost durante l'ascolto sulla amqpporta (5672). Tuttavia, si lega comunque a tutte le interfacce durante l'ascolto sulle porte epmd (4369) e 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)

Come posso impedirlo? Devo impostare iptables o ci sono opzioni di configurazione RabbitMQ aggiuntive che lo faranno fare quello che voglio?


epmd non fa parte di RabbitMQ. È il demone dei nomi di Erlang. Il modo migliore per legare solo a localhost è dare a coniglio il nome di nodo "coniglio @ localhost". Questo è il nome nodo utilizzato per raggruppare più server RabbitMQ e viene utilizzato da Erlang per trovare il nodo attraverso la rete. La parte dopo @ è il nome host che esegue Rabbit e chiaramente localhost non è un nome accessibile dall'esterno.
Michael Dillon,

Risposte:


49

Inserendo quanto segue /etc/rabbitmq/rabbitmq-env.conf, RabbitMQ ed epmd ascolteranno solo localhost:

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

Ci vuole un po 'più di lavoro per configurare Erlang in modo da utilizzare localhost solo per la porta con numero più alto (che viene utilizzato per i nodi del cluster, per quanto ne so). Se non ti interessa il clustering e vuoi solo che Rabbit sia eseguito completamente localmente, puoi passare a Erlang un'opzione del kernel per usare solo l'interfaccia di loopback.

Per fare ciò, crea un nuovo file in /etc/rabbitmq/: lo chiamerò rabbit.config. In questo file inseriremo l'opzione Erlang che dobbiamo caricare in fase di esecuzione.

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

Se stai usando il plug-in di gestione e vuoi anche limitarlo a localhost, dovrai configurare le sue porte separatamente, facendo includere coniglio.config:

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

(Nota RabbitMQ lascia epmd in esecuzione quando si spegne, quindi se vuoi bloccare la porta di clustering di Erlang, dovrai riavviare epmd separatamente da Rabbit.)

Successivamente è necessario che RabbitMQ lo carichi all'avvio. Apri di /etc/rabbitmq/rabbitmq.confnuovo e metti quanto segue in alto:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Questo carica quel file di configurazione all'avvio del coniglio server e passerà le opzioni a Erlang.

Ora dovresti avere tutti i processi Erlang / RabbitMQ in ascolto solo su localhost! Questo può essere verificato connetstat -ntlap

EDIT: Nelle versioni precedenti di RabbitMQ, il file di configurazione è: /etc/rabbitmq/rabbitmq.conf. Tuttavia, questo file è stato sostituito dal rabbit-env.conffile.


1
Bravo! Grazie. Nota: avevo bisogno di 'rabbitmq-env.conf' su RabbitMQ per CentOS / RHEL tramite EPEL. E mentre l'esportazione "coniglio" per "coniglio.config" mi è sembrata strana, ha funzionato senza il suffisso.
astrostl,

"Apri di /etc/rabbitmq/rabbitmq.confnuovo". Perché di nuovo"? Intendi rabbitmq-env.conf?
phinz,

La variabile d'ambiente ERL_EPMD_ADDRESScontrolla solo l'IP di ascolto di epmd, se si desidera modificare l'IP di ascolto della porta del cluster (25672) di RabbitMQ, è necessario utilizzare l' inet_dist_use_interfaceopzione. 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,

13

Per fare in modo che RabbitMQ ascolti su localhost / associ solo a localhost:

3 modi diversi (tutti equivalenti):

  • Inserisci NODE_IP_ADDRESS = 127.0.0.1 nel file delle variabili di ambiente (vedi http://www.rabbitmq.com/configure.html#define-environment-variables )

  • Inserisci le proprietà tcp_listeners e ssl_listeners nel file di configurazione: le voci di configurazione tcp_listeners e ssl_listeners regolano le interfacce su cui RabbitMQ ascolta. Una voce per il solo ascolto su localhost sarebbe ad esempio {tcp_listeners, [{'127.0.0.1', 5672}]} (la sintassi potrebbe non essere corretta, controllala) http://www.rabbitmq.com/configure.html# config-file

  • esporta l'env. variabile nello script di avvio (/etc/init.d/rabbitmq-server) export RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Quest'ultimo ha funzionato per me.

EPMD:

Il programma Epmd fa funzionare parti distribuite del runtime di Erlang. Se si sta creando un cluster multi-macchina, è necessario lasciarli accessibili ad altri nodi e sicuramente localhost. Ma ha una protezione integrata tramite file di cookie.

Non richiede quasi mai attenzione. Ricorda solo che i programmi erlang (incluso rabbitmqctl, ad esempio) devono accedere a quella porta per contattare altri programmi erlang.

Ma, se hai a che fare con dati finanziari o cartelle cliniche, proteggere epmd potrebbe essere una buona idea. La porta predefinita utilizzata da epmd è 4369, altri programmi si connettono ad essa tramite tcp.

Vedi anche: http://www.erlang.org/doc/man/epmd.html#environment_variables

Se è necessario proteggere ulteriormente RabbitMQ,

  1. Disabilita l'account guest incorporato http://www.rabbitmq.com/admin-guide.html#default-state

  2. Prendi in considerazione l'utilizzo di SSL e l'autenticazione tramite la catena di certificati

Ho ricevuto queste risposte dal canale IRC della community RabbitMQ.

Vorrei ringraziarli.

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

Spero che quanto sopra ti faccia risparmiare un po 'di tempo (mi ci sono volute 6 ore per trovare una risposta).


Il link epmd sopra ha una voce per ERL_EPMD_ADDRESS, presumibilmente per impostare gli indirizzi a cui si collegherà epmd, tranne che non vedo dove impostare quella variabile d'ambiente per l'utente rabbitmq.
François Beausoleil,

5

Se si specificano le variabili di ambiente nel file rabbitmq.conf, è necessario eliminare il prefisso RABBITMQ_, quindi provare:

NODE_IP_ADDRESS = 127.0.0.1


Sulla mia installazione, o RABBITMQ_NODE_IP_ADDRESSo NODE_IP_ADDRESSfunziona, ma come menzionato solo per la porta amqp.
Vebjorn Ljosa,

1
La porta epmd è una funzione del mapper delle porte erlang e afaik non è possibile limitare il suo indirizzo di bind.
cbz,

Inoltre, la porta EPMD è protetta con i cookie in modo che nessuno possa connettersi se non conoscono il cookie del server RabbitMQ. Darei quel cookie solo ad altri membri di un cluster RabbitMQ. Stesso principio di una chiave API.
Michael Dillon,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.