Jak zmusić RabbitMQ do słuchania tylko hosta lokalnego?

40

Zainstalowałem RabbitMQ na maszynie Debian Linux Squeeze i chciałbym, aby nasłuchiwał tylko interfejsu localhost. dodałem

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

do mojego /etc/rabbitmq/rabbitmq.confpliku, co powoduje, że jest on powiązany tylko z interfejsem localhost podczas nasłuchiwania na amqpporcie (5672). Jednak nadal wiąże się ze wszystkimi interfejsami podczas nasłuchiwania na portach epmd (4369) i 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)

Jak temu zapobiec? Czy muszę skonfigurować iptables, czy też są dodatkowe opcje konfiguracji RabbitMQ, które pozwolą mu robić to, co chcę?

Vebjorn Ljosa
źródło
epmd nie jest częścią RabbitMQ. Jest to demon nazewnictwa Erlang. Najlepszym sposobem na powiązanie tylko z hostem lokalnym jest nadanie królikowi nazwy węzła „królik @ localhost”. Jest to nazwa węzła używana do klastrowania wielu serwerów RabbitMQ i jest używana przez Erlang do znalezienia węzła w sieci. Część po @ jest nazwą hosta, na której działa Rabbit, i oczywiście localhost nie jest nazwą zewnętrznie dostępną.
Michael Dillon

Odpowiedzi:

48

/etc/rabbitmq/rabbitmq-env.confWstawienie następującego spowoduje, że RabbitMQ i epmd nasłuchują tylko na localhost:

export RABBITMQ_NODENAME=rabbit@localhost
export RABBITMQ_NODE_IP_ADDRESS=127.0.0.1
export ERL_EPMD_ADDRESS=127.0.0.1

Trochę więcej pracy wymaga skonfigurowanie Erlanga, aby używał hosta lokalnego tylko dla portu o wyższym numerze (który jest używany do klastrowania węzłów, o ile wiem). Jeśli nie obchodzi Cię tworzenie klastrów i po prostu chcesz, aby Rabbit był uruchamiany w pełni lokalnie, możesz przekazać Erlangowi opcję jądra, aby mogła ona korzystać tylko z interfejsu pętli zwrotnej.

Aby to zrobić, utwórz nowy plik /etc/rabbitmq/- wywołam go rabbit.config. W tym pliku umieścimy opcję Erlang, którą musimy załadować w czasie wykonywania.

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

Jeśli używasz wtyczki do zarządzania i chcesz ją ograniczyć do hosta lokalnego, musisz skonfigurować jego porty osobno, co spowoduje, że plik rabbit.config będzie zawierał:

[ {rabbitmq_management, [ {listener, [{port, 15672}, {ip, "127.0.0.1"}]} ]}, {kernel, [ {inet_dist_use_interface,{127,0,0,1}} ]} ].

(Uwaga: RabbitMQ pozostawia epmd uruchomione, gdy się wyłącza, więc jeśli chcesz zablokować port klastrowania Erlanga, musisz zrestartować epmd oddzielnie od Rabbit.)

Następnie musimy uruchomić RabbitMQ podczas ładowania. Otwórz /etc/rabbitmq/rabbitmq.confponownie i umieść następujące na górze:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Spowoduje to załadowanie tego pliku konfiguracyjnego po uruchomieniu serwera króliczego i przekazanie opcji do Erlang.

Powinieneś teraz mieć wszystkie procesy Erlang / RabbitMQ nasłuchujące tylko na localhost! Można to sprawdzić za pomocąnetstat -ntlap

EDIT: W starszych wersjach RabbitMQ, plik konfiguracyjny jest: /etc/rabbitmq/rabbitmq.conf. Jednak ten plik został zastąpiony rabbit-env.confplikiem.

David Wilemski
źródło
1
Brawo! Dzięki. Uwaga: Potrzebowałem „rabbitmq-env.conf” na RabbitMQ dla CentOS / RHEL przez EPEL. I chociaż eksport „królika” dla „królika. Konfiguracji” wydawał mi się dziwny, działał bez przyrostka.
astrostl
„Otwórz /etc/rabbitmq/rabbitmq.confponownie”. Dlaczego „znowu”? Czy masz na myśli rabbitmq-env.conf?
phinz
Zmienna środowiskowa ERL_EPMD_ADDRESSkontroluje tylko nasłuchujący adres IP epmd, jeśli chcesz zmienić nasłuchujący adres IP portu RabbitMQ w klastrze (25672), musisz użyć tej inet_dist_use_interfaceopcji. 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}"
Terry
13

Aby RabbitMQ nasłuchiwał na localhost / bind tylko do localhost:

3 różne sposoby (wszystkie równoważne):

  • Umieść NODE_IP_ADDRESS = 127.0.0.1 w pliku zmiennych środowiskowych (patrz http://www.rabbitmq.com/configure.html#define-environment-variables )

  • Umieść właściwości tcp_listeners i ssl_listeners w pliku konfiguracyjnym: Wpisy konfiguracyjne tcp_listeners i ssl_listeners regulują interfejsy, na których nasłuchuje RabbitMQ. Wpis dotyczący tylko nasłuchiwania na localhost to np. {Tcp_listeners, [{'127.0.0.1', 5672}]} (składnia może być niepoprawna, sprawdź) http://www.rabbitmq.com/configure.html# plik konfiguracyjny

  • eksportuj środowisko zmienna w skrypcie startowym (/etc/init.d/rabbitmq-server) eksport RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Ten ostatni działał dla mnie.

EPMD:

Program Epmd sprawia, że ​​rozproszone części środowiska wykonawczego Erlang działają. Jeśli budujesz klaster złożony z wielu maszyn, musisz pozostawić go dostępnym dla innych węzłów i na pewno hosta lokalnego. Ale ma wbudowaną ochronę za pomocą pliku cookie.

Prawie nigdy nie wymaga uwagi. Pamiętaj tylko, że programy erlang (w tym na przykład rabbitmqctl) muszą mieć dostęp do tego portu, aby kontaktować się z innymi programami erlang.

Ale jeśli masz do czynienia z danymi finansowymi lub dokumentacją medyczną, ochrona epmd może być dobrym pomysłem. Domyślny port, z którego korzysta epmd, to 4369, inne programy łączą się z nim za pośrednictwem tcp.

Zobacz także: http://www.erlang.org/doc/man/epmd.html#environment_variables

Jeśli chcesz zabezpieczyć RabbitMQ,

  1. Wyłącz wbudowane konto gościa http://www.rabbitmq.com/admin-guide.html#default-state

  2. Rozważ użycie protokołu SSL i uwierzytelnianie przy użyciu łańcucha certyfikatów

Te odpowiedzi otrzymałem od kanału IRC społeczności RabbitMQ.

Chciałbym im podziękować.

http://dev.rabbitmq.com/irclog/index.php?date=2011-06-14

Mam nadzieję, że powyższe zaoszczędzi ci trochę czasu (znalezienie odpowiedzi zajęło mi 6 godzin).

Boris
źródło
Powyższy link epmd zawiera wpis ERL_EPMD_ADDRESS, prawdopodobnie w celu ustawienia adresów, z którymi epmd będzie się wiązał, chyba że nie widzę, gdzie ustawić tę zmienną środowiskową dla użytkownika królikmq.
François Beausoleil,
5

Jeśli określisz zmienne środowiskowe w pliku rabbitmq.conf, musisz upuścić prefiks RABBITMQ_, więc spróbuj:

NODE_IP_ADDRESS = 127.0.0.1

cbz
źródło
W mojej instalacji albo działa RABBITMQ_NODE_IP_ADDRESSalbo NODE_IP_ADDRESSdziała, ale jak wspomniano tylko dla portu amqp.
Vebjorn Ljosa,
1
Port epmd jest funkcją programu mapującego porty erlang, a poza tym nie można ograniczyć jego adresu powiązania.
cbz
Ponadto port EPMD jest chroniony za pomocą plików cookie, więc nikt nie może się połączyć, chyba że zna Twój plik cookie serwera RabbitMQ. Przekazywałbyś ten plik cookie tylko innym członkom klastra RabbitMQ. Ta sama zasada, co klucz API.
Michael Dillon