Как мне заставить 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 дальше,
Отключите встроенную гостевую учетную запись http://www.rabbitmq.com/admin-guide.html
Рассмотрите возможность использования 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
должен работать и показывать ранее существовавшие данные, и дальнейшее чтение вам не требуется.
Если это не так, есть два пути:
запись имени узла может быть добавлена в
/etc/hosts
:127.0.0.1 имя-узла-хоста
, но это может отразиться на другом программном обеспечении (например, для разрешения общедоступного/другого IP-адреса требуется имя узла-хоста).
часть имени хоста может быть установлена на
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
. Вроде настройки привязаны к имени ноды, поэтому при изменении имени настройки сбрасываются