Como faço para o RabbitMQ ouvir apenas o host local?

40

Instalei o RabbitMQ em uma máquina Debian Linux Squeeze e gostaria que ele ouvisse apenas a interface localhost. Eu adicionei

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

ao meu /etc/rabbitmq/rabbitmq.confarquivo, e isso o torna vinculado apenas à interface localhost ao escutar na amqpporta (5672). No entanto, ele ainda se liga a todas as interfaces ao escutar nas portas 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)

Como evito isso? Preciso configurar o iptables ou existem opções adicionais de configuração do RabbitMQ que farão o que eu quero?

Vebjorn Ljosa
fonte
epmd não faz parte do RabbitMQ. É o daemon de nomeação Erlang. A melhor maneira de ligar apenas ao host local é dar ao coelho o nome de nó 'rabbit @ localhost'. Esse é o nome do nó usado para agrupar vários servidores RabbitMQ e é usado por Erlang para encontrar o nó na rede. A parte após o @ é o nome do host que está executando o Rabbit e, claramente, localhost não é um nome acessível externamente.
Michael Dillon

Respostas:

48

Colocar o seguinte em /etc/rabbitmq/rabbitmq-env.conffará o RabbitMQ e o epmd escutarem apenas no localhost:

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

É preciso um pouco mais de trabalho para configurar o Erlang para usar apenas o host local para a porta de número mais alto (que é usada para agrupar nós, até onde eu sei). Se você não se importa com o armazenamento em cluster e apenas deseja que o Rabbit seja executado totalmente localmente, você pode passar a Erlang uma opção de kernel para que ele use apenas a interface de loopback.

Para fazer isso, crie um novo arquivo no /etc/rabbitmq/- eu vou chamá-lo rabbit.config. Neste arquivo, colocaremos a opção Erlang que precisamos carregar no tempo de execução.

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

Se você estiver usando o plug-in de gerenciamento e também quiser limitar isso ao host local, precisará configurar suas portas separadamente, fazendo com que o rabbit.config inclua isso:

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

(Observe que o RabbitMQ deixa o epmd em execução quando ele é desligado; portanto, se você deseja bloquear a porta de cluster do Erlang, precisará reiniciar o epmd separadamente do Rabbit.)

Em seguida, precisamos que o RabbitMQ carregue isso na inicialização. Abra /etc/rabbitmq/rabbitmq.confnovamente e coloque o seguinte no topo:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Isso carrega esse arquivo de configuração quando o servidor rabbit é iniciado e passa as opções para Erlang.

Agora você deve ter todos os processos Erlang / RabbitMQ ouvindo apenas no host local! Isso pode ser verificado comnetstat -ntlap

EDIT: Em versões mais antigas do RabbitMQ, o arquivo de configuração é: /etc/rabbitmq/rabbitmq.conf. No entanto, esse arquivo foi substituído pelo rabbit-env.confarquivo.

David Wilemski
fonte
11
Bravo! Obrigado. Nota: Eu precisava do 'rabbitmq-env.conf' no RabbitMQ para CentOS / RHEL via EPEL. E enquanto a exportação de 'rabbit' para 'rabbit.config' me pareceu estranha, funcionou sem o sufixo.
astrostl 28/02/2013
"Abra /etc/rabbitmq/rabbitmq.confnovamente". Por que de novo"? Você quer dizer rabbitmq-env.conf?
phinz 1/09
A variável de ambiente ERL_EPMD_ADDRESScontrola apenas o IP de escuta do epmd. Se você deseja alterar o IP de escuta da RabbitMQ na porta de cluster (25672), é necessário usar a inet_dist_use_interfaceopção 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

Para fazer o RabbitMQ escutar no localhost / bind apenas ao localhost:

3 maneiras diferentes (todas equivalentes):

  • Coloque NODE_IP_ADDRESS = 127.0.0.1 no arquivo de variáveis ​​de ambiente (consulte http://www.rabbitmq.com/configure.html#define-environment-variables )

  • Coloque as propriedades tcp_listeners e ssl_listeners no arquivo de configuração: As entradas de configuração tcp_listeners e ssl_listeners controlam as interfaces nas quais o RabbitMQ escuta. Uma entrada para apenas ouvir no localhost seria, por exemplo, {tcp_listeners, [{'127.0.0.1', 5672}]}} (a sintaxe pode não estar correta, verifique) http://www.rabbitmq.com/configure.html# arquivo de configuração

  • exportar o env. variável no script de inicialização (/etc/init.d/rabbitmq-server) export RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

O último funcionou para mim.

EPMD:

O programa Epmd faz com que partes distribuídas do tempo de execução do Erlang funcionem. Se você estiver construindo um cluster de várias máquinas, precisará deixá-los acessíveis a outros nós e, certamente, localhost. Mas possui proteção integrada via arquivo de cookie.

Quase nunca requer atenção. Lembre-se de que os programas erlang (incluindo rabbitmqctl, por exemplo) precisam acessar essa porta para entrar em contato com outros programas erlang.

Mas, se você estiver lidando com dados financeiros ou registros de saúde, proteger o epmd pode ser uma boa idéia. A porta padrão que o epmd usa é 4369, outros programas se conectam a ela via tcp.

Veja também: http://www.erlang.org/doc/man/epmd.html#environment_variables

Se você precisar proteger o RabbitMQ ainda mais,

  1. Desative a conta de convidado interna http://www.rabbitmq.com/admin-guide.html#default-state

  2. Considere usar SSL e autenticar usando a cadeia de certificados

Eu recebi essas respostas do canal IRC da comunidade RabbitMQ.

Gostaria de agradecer a eles.

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

Espero que o acima economize algum tempo para você (demorei 6 horas para encontrar uma resposta).

Boris
fonte
O link epmd acima tem uma entrada para ERL_EPMD_ADDRESS, presumivelmente para definir os endereços aos quais o epmd se ligará, exceto que não vejo onde definir essa variável de ambiente para o usuário rabbitmq.
François Beausoleil
5

Se você especificar variáveis ​​de ambiente no arquivo rabbitmq.conf, precisará eliminar o prefixo RABBITMQ_, então tente:

NODE_IP_ADDRESS = 127.0.0.1

cbz
fonte
Na minha instalação, RABBITMQ_NODE_IP_ADDRESSou NODE_IP_ADDRESSfunciona, mas como mencionado apenas para a porta amqp.
Vebjorn Ljosa
11
A porta epmd é uma função do mapeador de portas erlang e, portanto, não é possível restringir seu endereço de ligação.
Cbz
Além disso, a porta EPMD é protegida com cookies para que ninguém possa se conectar, a menos que conheça o cookie do servidor RabbitMQ. Você só daria esse cookie a outros membros de um cluster RabbitMQ. Mesmo princípio que uma chave de API.
Michael Dillon