Bagaimana cara membuat RabbitMQ hanya mendengarkan localhost?

40

Saya telah menginstal RabbitMQ pada mesin Debian Linux Squeeze, dan saya hanya ingin mendengarkan antarmuka localhost. saya telah menambahkan

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

ke /etc/rabbitmq/rabbitmq.conffile saya , dan itu membuatnya hanya mengikat antarmuka localhost saat mendengarkan pada amqpport (5672). Namun, itu masih mengikat semua antarmuka saat mendengarkan pada port epmd (4369) dan 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)

Bagaimana saya mencegah ini? Apakah saya harus mengatur iptables, atau ada opsi konfigurasi tambahan RabbitMQ yang akan membuatnya melakukan apa yang saya inginkan?

Vebjorn Ljosa
sumber
EPMD bukan bagian dari RabbitMQ. Itu adalah daemon penamaan Erlang. Cara terbaik untuk mengikat hanya ke localhost adalah memberi kelinci nama panggilan 'rabbit @ localhost'. Ini adalah nama panggilan yang digunakan untuk mengelompokkan beberapa server RabbitMQ, dan digunakan oleh Erlang untuk menemukan simpul di seluruh jaringan. Bagian setelah @ adalah nama host yang menjalankan Rabbit dan jelas, localhost bukanlah nama yang dapat diakses secara eksternal.
Michael Dillon

Jawaban:

48

Memasukkan yang berikut ini /etc/rabbitmq/rabbitmq-env.confakan membuat RabbitMQ dan EPMD hanya mendengarkan localhost:

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

Dibutuhkan sedikit lebih banyak pekerjaan untuk mengkonfigurasi Erlang untuk hanya menggunakan localhost untuk port bernomor lebih tinggi (yang digunakan untuk mengelompokkan node sejauh yang saya tahu). Jika Anda tidak peduli tentang pengelompokan dan hanya ingin Rabbit dijalankan sepenuhnya secara lokal maka Anda dapat memberikan opsi kernel kepada Erlang untuk itu hanya menggunakan antarmuka loopback.

Untuk melakukannya, buat file baru di /etc/rabbitmq/- saya akan memanggilnya rabbit.config. Dalam file ini kita akan meletakkan opsi Erlang yang perlu kita muat pada saat dijalankan.

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

Jika Anda menggunakan plugin manajemen dan juga ingin membatasinya ke localhost, Anda harus mengkonfigurasi port-portnya secara terpisah, membuat rabbit.config menyertakan ini:

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

(Catatan RabbitMQ membiarkan epmd berjalan ketika dimatikan, jadi jika Anda ingin memblokir port pengelompokan Erlang, Anda harus memulai ulang EPDM secara terpisah dari Rabbit.)

Selanjutnya kita harus meminta RabbitMQ memuat ini saat startup. Buka /etc/rabbitmq/rabbitmq.conflagi dan letakkan yang berikut di atas:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Ini memuat file konfigurasi saat server kelinci dimulai dan akan meneruskan opsi ke Erlang.

Anda sekarang harus memiliki semua proses Erlang / RabbitMQ hanya mendengarkan di localhost! Ini dapat diperiksa dengannetstat -ntlap

EDIT: Dalam versi RabbitMQ, file konfigurasi adalah: /etc/rabbitmq/rabbitmq.conf. Namun, file ini telah digantikan oleh rabbit-env.conffile tersebut.

David Wilemski
sumber
1
Bravo! Terima kasih. Catatan: Saya membutuhkan 'rabbitmq-env.conf' di RabbitMQ untuk CentOS / RHEL via EPEL. Dan sementara ekspor 'kelinci' untuk 'rabbit.config' tampak aneh bagi saya, itu berhasil tanpa akhiran.
astrostl
"Buka /etc/rabbitmq/rabbitmq.conflagi". Kenapa lagi"? Apakah yang Anda maksud rabbitmq-env.conf?
phinz
Variabel lingkungan ERL_EPMD_ADDRESShanya mengontrol IP mendengarkan EPDM, jika Anda ingin mengubah port cluster (25672) mendengarkan IP dari RabbitMQ, maka Anda perlu menggunakan inet_dist_use_interfaceopsi. 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

Untuk membuat RabbitMQ mendengarkan di localhost / bind hanya ke localhost:

3 Cara berbeda (semua setara):

  • Masukkan NODE_IP_ADDRESS = 127.0.0.1 dalam file variabel lingkungan (Lihat http://www.rabbitmq.com/configure.html#define-environment-variables )

  • Letakkan properti tcp_listeners dan ssl_listeners dalam file config: Entri konfigurasi tcp_listeners dan ssl_listeners mengatur antarmuka yang didengarkan RabbitMQ. Entri untuk hanya mendengarkan di localhost akan menjadi misalnya, {tcp_listeners, [{'127.0.0.1', 5672}]} (Sintaks mungkin tidak benar, periksa) http://www.rabbitmq.com/configure.html# file konfigurasi

  • ekspor env. variabel dalam skrip startup (/etc/init.d/rabbitmq-server) ekspor RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Yang terakhir ini bekerja untuk saya.

EPMD:

Program Epmd membuat bagian-bagian terdistribusi dari runtime Erlang berfungsi. Jika Anda sedang membangun cluster multi-mesin, Anda harus membuatnya dapat diakses oleh node lain dan tentunya localhost. Tetapi ia memiliki perlindungan bawaan melalui file cookie.

Hampir tidak pernah membutuhkan perhatian. Perlu diingat bahwa program erlang (termasuk rabbitmqctl, misalnya) perlu mengakses port tersebut untuk menghubungi program erlang lainnya.

Tetapi, jika Anda berurusan dengan data keuangan atau catatan kesehatan, melindungi EPMD mungkin merupakan ide yang baik. Port default menggunakan epmd adalah 4369, program lain terhubung ke sana melalui tcp.

Lihat juga: http://www.erlang.org/doc/man/epmd.html#environment_variables

Jika Anda perlu mengamankan RabbitMQ lebih jauh,

  1. Nonaktifkan akun tamu bawaan http://www.rabbitmq.com/admin-guide.html#default-state

  2. Pertimbangkan untuk menggunakan SSL dan mengautentikasi menggunakan rantai sertifikat

Saya mendapat jawaban ini dari saluran IRC komunitas RabbitMQ.

Saya ingin mengucapkan terima kasih.

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

Semoga hal di atas menghemat waktu untuk Anda (butuh saya 6 jam untuk menemukan jawaban).

Boris
sumber
Tautan epmd di atas memiliki entri untuk ERL_EPMD_ADDRESS, mungkin untuk mengatur alamat yang akan diikat oleh epmd, kecuali saya tidak melihat ke mana harus mengatur variabel lingkungan untuk pengguna rabbitmq.
François Beausoleil
5

Jika Anda menentukan variabel lingkungan di file rabbitmq.conf Anda harus meletakkan awalan RABBITMQ_, jadi cobalah:

NODE_IP_ADDRESS = 127.0.0.1

cbz
sumber
Pada instalasi saya, baik RABBITMQ_NODE_IP_ADDRESSatau NODE_IP_ADDRESSberfungsi, tetapi sebagaimana disebutkan hanya untuk port amqp.
Vebjorn Ljosa
1
Port epmd adalah fungsi erper port mapper, dan afaik tidak mungkin untuk membatasi alamat pengikatannya.
cbz
Juga, port EPMD dilindungi dengan cookie sehingga tidak ada yang dapat terhubung kecuali mereka tahu cookie server RabbitMQ Anda. Anda hanya akan memberikan cookie itu kepada anggota lain dari cluster RabbitMQ. Prinsip yang sama dengan kunci API.
Michael Dillon