Назад | Перейти на главную страницу

Как заставить RabbitMQ слушать только localhost?

Я установил RabbitMQ на машину Debian Linux Squeeze и хотел бы, чтобы она слушала только интерфейс localhost. я добавил

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

к моему /etc/rabbitmq/rabbitmq.conf файл, и это заставляет его привязываться только к интерфейсу localhost при прослушивании amqp порт (5672). Однако он по-прежнему связывается со всеми интерфейсами при прослушивании портов epmd (4369) и 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)

Как мне предотвратить это? Нужно ли мне настраивать iptables или есть дополнительные параметры конфигурации RabbitMQ, которые позволят ему делать то, что я хочу?

Помещая следующее в /etc/rabbitmq/rabbitmq-env.conf заставит RabbitMQ и epmd прослушивать только localhost:

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

Требуется немного больше работы, чтобы настроить Erlang для использования только localhost для порта с более высоким номером (который, насколько я могу судить, используется для узлов кластеризации). Если вас не волнует кластеризация и вы просто хотите, чтобы Rabbit запускался полностью локально, вы можете передать Erlang параметр ядра, чтобы он использовал только интерфейс loopback.

Для этого создайте новый файл в /etc/rabbitmq/ - Я назову это rabbit.config. В этом файле мы поместим параметр Erlang, который нам нужно загружать во время выполнения.

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

Если вы используете подключаемый модуль управления и хотите ограничить его использование только localhost, вам необходимо отдельно настроить его порты, включив в rabbit.config следующее:

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

(Обратите внимание, что RabbitMQ оставляет epmd запущенным после завершения работы, поэтому, если вы хотите заблокировать порт кластеризации Erlang, вам нужно будет перезапустить epmd отдельно от Rabbit.)

Затем нам нужно, чтобы RabbitMQ загружал это при запуске. Открыть /etc/rabbitmq/rabbitmq.conf снова и поместите следующее вверху:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Это загружает этот файл конфигурации при запуске сервера кролика и передает параметры в Erlang.

Теперь у вас должны быть все процессы Erlang / RabbitMQ, которые слушают только localhost! Это можно проверить с помощью netstat -ntlap

РЕДАКТИРОВАТЬ: в более старых версиях RabbitMQ файл конфигурации: /etc/rabbitmq/rabbitmq.conf. Однако этот файл был заменен на rabbit-env.conf файл.

Чтобы RabbitMQ слушал localhost / привязывался только к localhost:

3 разных способа (все равнозначны):

  • Поместите NODE_IP_ADDRESS = 127.0.0.1 в файл переменных среды (см. http://www.rabbitmq.com/configure.html#define-environment-variables)

  • Поместите свойства tcp_listeners и ssl_listeners в файл конфигурации: записи конфигурации tcp_listeners и ssl_listeners управляют интерфейсами, которые прослушивает RabbitMQ. Запись для простого прослушивания на локальном хосте будет, например, {tcp_listeners, [{'127.0.0.1', 5672}]} (синтаксис может быть неправильным, проверьте его) http://www.rabbitmq.com/configure.html#config-file

  • экспортировать env. переменная в сценарии запуска (/etc/init.d/rabbitmq-server) экспорт RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Последний сработал у меня.

EPMD:

Программа Epmd заставляет работать распределенные части среды выполнения Erlang. Если вы строите кластер с несколькими машинами, вам нужно оставить их доступными для других узлов и, конечно же, localhost. Но у него есть встроенная защита через файл cookie.

Это почти никогда не требует внимания. Просто имейте в виду, что программам на erlang (включая, например, rabbitmqctl) требуется доступ к этому порту для связи с другими программами на erlang.

Но если вы имеете дело с финансовыми данными или медицинскими картами, защита epmd может быть хорошей идеей. По умолчанию epmd использует порт 4369, другие программы подключаются к нему через tcp.

Смотрите также: http://www.erlang.org/doc/man/epmd.html#environment_variables

Если вам нужно дополнительно защитить RabbitMQ,

  1. Отключить встроенную гостевую учетную запись http://www.rabbitmq.com/admin-guide.html#default-state

  2. Рассмотрите возможность использования SSL и аутентификации с помощью цепочки сертификатов

Я получил эти ответы из IRC-канала сообщества RabbitMQ.

Хотел бы поблагодарить их.

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

Надеюсь, это сэкономит вам время (мне потребовалось 6 часов, чтобы найти ответ).

Если вы указываете переменные окружения в файле rabbitmq.conf, вам нужно отбросить префикс RABBITMQ_, поэтому попробуйте:

NODE_IP_ADDRESS = 127.0.0.1

AFAIK вы не можете настроить интерфейсы epmd. Вы можете настроить только порт epmd: http://www.erlang.org/faq/how_do_i.html#id55132