Я установил 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,
Отключить встроенную гостевую учетную запись http://www.rabbitmq.com/admin-guide.html#default-state
Рассмотрите возможность использования 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