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

41

Я установил 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, которые заставят его делать то, что я хочу?

Вебьорн Лёса
источник
epmd не является частью RabbitMQ. Это демон именования Erlang. Лучший способ привязки только к localhost - это дать кролику имя узла «rabbit @ localhost». Это имя узла используется для кластеризации нескольких серверов RabbitMQ и используется Erlang для поиска узла в сети. Часть после @ - это имя хоста, на котором работает Rabbit, и ясно, что localhost не является внешне доступным именем.
Майкл Диллон

Ответы:

49

Если /etc/rabbitmq/rabbitmq-env.confдобавить следующее , RabbitMQ и epmd будут слушать только локальный хост:

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 опцию ядра, чтобы он использовал только интерфейс обратной петли.

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

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

Если вы используете плагин управления, а также хотите ограничить его локальным хостом, вам необходимо настроить его порты отдельно, чтобы в 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, прослушивающие только локальный хост! Это можно проверить с помощьюnetstat -ntlap

EDIT: В старых версиях RabbitMQ, файл конфигурации: /etc/rabbitmq/rabbitmq.conf. Однако этот файл был заменен rabbit-env.confфайлом.

Дэвид Вилемски
источник
1
Браво! Спасибо. Примечание: мне нужно было «rabbitmq-env.conf» на RabbitMQ для CentOS / RHEL через EPEL. И хотя экспорт «rabbit» для «rabbit.config» показался мне странным, он работал без суффикса.
astrostl
«Открой /etc/rabbitmq/rabbitmq.confснова». Почему "опять"? Вы имеете в виду rabbitmq-env.conf?
phinz
Переменная окружения ERL_EPMD_ADDRESSуправляет только прослушивающим IP-адресом epmd, если вы хотите изменить прослушивающий IP-адрес кластерного порта (25672) RabbitMQ, вам необходимо использовать эту inet_dist_use_interfaceопцию. 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}"
Терри
13

Чтобы RabbitMQ прослушивал localhost / bind только 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. Запись для простого прослушивания на localhost будет, например, {tcp_listeners, [{'127.0.0.1', 5672}]} (синтаксис может быть неправильным, проверьте его) http://www.rabbitmq.com/configure.html# конфиг-файл

  • экспорт env. переменная в скрипте запуска (/etc/init.d/rabbitmq-server) export 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 часов, чтобы найти ответ).

Борис
источник
Ссылка выше на epmd имеет запись для ERL_EPMD_ADDRESS, предположительно для установки адресов, с которыми будет связываться epmd, за исключением того, что я не вижу, где установить эту переменную окружения для пользователя rabbitmq.
Франсуа Босолей
5

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

NODE_IP_ADDRESS = 127.0.0.1

Cbz
источник
На моей установке, либо RABBITMQ_NODE_IP_ADDRESSили NODE_IP_ADDRESSработает, но, как уже упоминалось, только для порта AMQP.
Вебьорн Лёса
1
Порт epmd является функцией средства отображения портов erlang, и на самом деле невозможно ограничить его адрес привязки.
cbz
Кроме того, порт EPMD защищен файлами cookie, поэтому никто не может подключиться, если они не знают файл cookie вашего сервера RabbitMQ. Вы дадите этот cookie только другим членам кластера RabbitMQ. Тот же принцип, что и ключ API.
Майкл Диллон