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

6 ответов

Решение

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

Для этого создайте новый файл в /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

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

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

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

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

  • Поместите свойства 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

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

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

  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

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

В последних версиях RabbitMQ этого достаточно, чтобы привязать все порты только к локальному хосту (ipv4):

/etc/rabbitmq/rabbitmq-env.conf:

      export ERL_EPMD_ADDRESS=127.0.0.1

/etc/rabbitmq/rabbitmq.conf

      listeners.tcp.1 = 127.0.0.1:5672
distribution.listener.interface = 127.0.0.1
management.tcp.ip = 127.0.0.1
prometheus.tcp.ip = 127.0.0.1

И перезапустите RabbitMQ.

После этого часть имени хостаRABBITMQ_NODENAME(по умолчаниюrabbit@node-hostname) должен решить127.0.0.1для работы. Если так -rabbitmqctl statusиrabbitmqctl list_queuesдолжен работать и показывать ранее существовавшие данные, и дальнейшее чтение вам не требуется.

Если это не так, есть два пути:

  1. запись имени узла может быть добавлена ​​в/etc/hosts:

    127.0.0.1 имя-узла-хоста

, но это может отразиться на другом программном обеспечении (например, для разрешения общедоступного/другого IP-адреса требуется имя узла-хоста).

  1. часть имени хоста может быть установлена ​​наlocalhostв/etc/rabbitmq/rabbitmq-env.conf:

    экспорт RABBITMQ_NODENAME=rabbit@localhost

, но прежде чем использовать этот способ и перезапустить RabbitMQ — решите, нужны ли вам существующие данные RabbitMQ. Если данные не нужны - простой перезапуск RabbitMQ должен исправитьrabbitmqctl. В противном случае, вот скрипт, который перемещает существующие данные RabbitMQ со старого имени на новое, он подразумевает перезапуск RabbitMQ (сделайте резервную копию каталога данных перед запуском скрипта: остановите RabbitMQ и скопируйте его)./var/lib/rabbitmqкаталог):

      #!/bin/bash

# place here your nodenames
old=rabbit@nodename
new=rabbit@localhost

set -e

service rabbitmq-server stop
export RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia/
export RABBITMQ_MNESIA_DIR="/var/lib/rabbitmq/mnesia/$old"
export RABBITMQ_FEATURE_FLAGS_FILE="$RABBITMQ_MNESIA_BASE/$old-feature_flags"
rabbitmqctl rename_cluster_node "$old" "$new"
cd /var/lib/rabbitmq/mnesia
rm -f "$old.pid"
mv "$old" "$new"
mv "$old-feature_flags" "$new-feature_flags"
mv "$old-plugins-expand" "$new-plugins-expand"
service rabbitmq-server start

echo "Remove ${RABBITMQ_MNESIA_DIR}-rename directory after checking renamed cluster status and data"

Больше информации:

https://www.rabbitmq.com/networking.html

https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/priv/schema/rabbit.schema

Для тех, кто боролся так же, как и я, ответ Дэвида был действительно полезен, но для моей версии RabbitMQ (3.11.11) мне пришлось добавить эту строку

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

К/etc/rabbitmq/advanced.config, НЕТ/etc/rabbitmq/rabbit.conf. Следовательно, я также не использовалRABBITMQ_CONFIG_FILEпеременная, посколькуadvanced.configэто не пользовательский файл, а встроенный

Также не забудьте добавить пользователей и разрешения после измененияRABBITMQ_NODENAME. Вроде настройки привязаны к имени ноды, поэтому при изменении имени настройки сбрасываются

Другие вопросы по тегам