Як змусити RabbitMQ слухати лише localhost?


40

Я встановив RabbitMQ на машині Dequex 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. Це Ерланг іменує демона. Найкращий спосіб прив’язатись лише до localhost - це надати кролику ім'я "кролик @ localhost". Це ім'я вузла, яке використовується для кластеризації декількох серверів RabbitMQ, і використовується Erlang для пошуку вузла по всій мережі. Частина після @ - це ім'я хоста, на якому працює Кролик, і, очевидно, localhost не є зовнішньо доступним іменем.
Майкл Діллон

Відповіді:


48

Якщо /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 для порту з більшим числом (який використовується для кластеризації вузлів, наскільки я можу сказати). Якщо ви не переймаєтесь кластеризацією і просто хочете, щоб кролик запускався повністю локально, ви можете передати 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 слухатимуться лише у localhost! Це можна перевіритиnetstat -ntlap

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


1
Браво! Спасибі. Примітка: мені потрібен "rabbitmq-env.conf" у RabbitMQ для CentOS / RHEL через EPEL. І хоча експорт 'кролик' для 'rabbit.config' здався мені дивним, він працював із суфіксом sans.
astrostl

" /etc/rabbitmq/rabbitmq.confЗнову відкрити ". Чому "знову"? Ви маєте на увазі rabbitmq-env.conf?
фінз

Змінна середовища ERL_EPMD_ADDRESSлише керує IP прослуховування epmd, якщо ви хочете змінити кластерний порт (25672) IP прослуховування 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 / прив'язувати лише до 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# config-файл

  • експортувати оточення змінна в сценарії запуску (/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 годин).


Посилання epmd вище містить запис для ERL_EPMD_ADDRESS, імовірно, для встановлення адрес, на які epmd буде прив'язуватися, за винятком того, що я не бачу, де встановити цю змінну середовища для користувача rabbitmq.
Франсуа Бозолей

5

Якщо ви вказали змінні середовища у файлі rabbitmq.conf, вам слід скинути префікс RABBITMQ_, то спробуйте:

NODE_IP_ADDRESS = 127.0.0.1


У моїй установці RABBITMQ_NODE_IP_ADDRESSабо NODE_IP_ADDRESSпрацює, але як згадується лише для порту amqp.
Вебйорн Льоса

1
Порт epmd є функцією відображувача порту erlang, і afaik обмежити його адресу прив'язки неможливо.
cbz

Крім того, порт EPMD захищений файлами cookie, тому ніхто не може з'єднатися, якщо не знає ваше cookie-сервер RabbitMQ. Ви можете надати цей файл cookie лише іншим членам кластеру RabbitMQ. Той же принцип, що і ключ API.
Майкл Діллон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.