Làm cách nào để làm cho RabbitMQ chỉ nghe localhost?


40

Tôi đã cài đặt RabbitMQ trên máy Debian Linux Squeeze và tôi muốn nó chỉ nghe giao diện localhost. Tôi đã thêm

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

với /etc/rabbitmq/rabbitmq.conftệp của tôi và điều đó làm cho nó chỉ liên kết với giao diện localhost khi nghe trên amqpcổng (5672). Tuy nhiên, nó vẫn liên kết với tất cả các giao diện khi nghe trên các cổng epmd (4369) và 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)

Làm thế nào để tôi ngăn chặn điều này? Tôi có phải thiết lập iptables không, hoặc có các tùy chọn cấu hình RabbitMQ bổ sung sẽ giúp nó thực hiện những gì tôi muốn không?


epmd không phải là một phần của RabbitMQ. Đó là daemon đặt tên Erlang. Cách tốt nhất để chỉ liên kết với localhost là cung cấp cho thỏ tên nút 'rabbit @ localhost'. Đây là tên nút được sử dụng để phân cụm nhiều máy chủ RabbitMQ và được Erlang sử dụng để tìm nút trên mạng. Phần sau @ là tên máy chủ đang chạy Rabbit và rõ ràng, localhost không phải là tên có thể truy cập bên ngoài.
Michael Dillon

Câu trả lời:


48

Đưa những thứ sau vào /etc/rabbitmq/rabbitmq-env.confsẽ khiến RabbitMQ và epmd chỉ nghe trên localhost:

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

Phải mất thêm một chút công việc để cấu hình Erlang để chỉ sử dụng localhost cho cổng được đánh số cao hơn (được sử dụng để phân cụm các nút theo như tôi có thể nói). Nếu bạn không quan tâm đến việc phân cụm và chỉ muốn Rabbit được chạy hoàn toàn cục bộ thì bạn có thể truyền cho Erlang một tùy chọn kernel để nó chỉ sử dụng giao diện loopback.

Để làm như vậy, tạo một tệp mới trong /etc/rabbitmq/- Tôi sẽ gọi nó rabbit.config. Trong tệp này, chúng tôi sẽ đặt tùy chọn Erlang mà chúng tôi cần tải vào thời gian chạy.

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

Nếu bạn đang sử dụng plugin quản lý và cũng muốn giới hạn điều đó với localhost, bạn sẽ cần định cấu hình các cổng riêng biệt, làm cho rabbit.config bao gồm:

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

(Lưu ý RabbitMQ để epmd chạy khi tắt, vì vậy nếu bạn muốn chặn cổng phân cụm của Erlang, bạn sẽ cần khởi động lại epmd riêng biệt với Rabbit.)

Tiếp theo chúng ta cần tải RabbitMQ khi khởi động. Mở /etc/rabbitmq/rabbitmq.conflại và đặt các mục sau ở trên cùng:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

Điều này tải tập tin cấu hình đó khi máy chủ thỏ được khởi động và sẽ chuyển các tùy chọn cho Erlang.

Bây giờ bạn sẽ có tất cả các quy trình Erlang / RabbitMQ chỉ nghe trên localhost! Điều này có thể được kiểm tra vớinetstat -ntlap

EDIT: Trong các phiên bản cũ hơn của RabbitMQ, tệp cấu hình là : /etc/rabbitmq/rabbitmq.conf. Tuy nhiên, tập tin này đã được thay thế bởi rabbit-env.conftập tin.


1
Bravo! Cảm ơn. Lưu ý: Tôi cần 'rabbitmq-env.conf' trên RabbitMQ cho CentOS / RHEL qua EPEL. Và trong khi xuất khẩu 'thỏ' cho 'rabbit.config' có vẻ lạ đối với tôi, nó đã hoạt động với hậu tố.
astrostl

"Mở /etc/rabbitmq/rabbitmq.conflại lần nữa". Lần nữa ư, tại sao"? Ý bạn là rabbitmq-env.confsao
phinz

Biến môi trường ERL_EPMD_ADDRESSchỉ kiểm soát IP nghe của epmd, nếu bạn muốn thay đổi cổng cụm (25672) IP của RabbitMQ, thì bạn cần sử dụng inet_dist_use_interfacetùy chọn. 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

Để làm cho RabbitMQ lắng nghe trên localhost / chỉ liên kết với localhost:

3 cách khác nhau (tất cả tương đương):

  • Đặt NODE_IP_ADDRESS = 127.0.0.1 trong tệp biến môi trường (Xem http://www.rabbitmq.com/configure.html#define-en môi-biến )

  • Đặt các thuộc tính tcp_listener và ssl_listener trong tệp cấu hình: Các mục cấu hình tcp_listener và ssl_listener chi phối các giao diện mà RabbitMQ lắng nghe. Một mục nhập cho chỉ nghe trên localhost sẽ là ví dụ, {tcp_listeners, [{ '127.0.0.1', 5672}]} (Cú pháp có thể không chính xác, kiểm tra xem nó) http://www.rabbitmq.com/configure.html# tập tin cấu hình

  • xuất khẩu env. biến trong tập lệnh khởi động (/etc/init.d/rabbitmq-server) xuất RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

Sau này làm việc cho tôi.

EPMD:

Chương trình Epmd làm cho các phần phân tán của thời gian chạy Erlang hoạt động. Nếu bạn đang xây dựng một cụm nhiều máy, bạn cần để chúng có thể truy cập được vào các nút khác và chắc chắn là localhost. Nhưng nó có tích hợp bảo vệ thông qua tập tin cookie.

Nó hầu như không bao giờ yêu cầu bất kỳ sự chú ý. Chỉ cần lưu ý rằng các chương trình erlang (ví dụ như rabbitmqctl chẳng hạn) cần truy cập vào cổng đó để liên hệ với các chương trình erlang khác.

Nhưng, nếu bạn đang xử lý dữ liệu tài chính hoặc hồ sơ sức khỏe, bảo vệ epmd có thể là một ý tưởng tốt. Sử dụng cổng epmd mặc định là 4369, các chương trình khác kết nối với nó qua tcp.

Xem thêm: http://www.erlang.org/doc/man/epmd.html#envir_variables

Nếu bạn cần bảo mật RabbitMQ hơn nữa,

  1. Vô hiệu hóa tài khoản khách tích hợp http://www.rabbitmq.com/admin-guide.html#default-state

  2. Cân nhắc sử dụng SSL và xác thực bằng chuỗi chứng chỉ

Tôi đã nhận được những câu trả lời từ kênh IRC của cộng đồng RabbitMQ.

Xin cảm ơn họ.

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

Hy vọng những điều trên giúp bạn tiết kiệm thời gian (mất 6 giờ để tìm câu trả lời).


Liên kết epmd ở trên có một mục nhập cho ERL_EPMD_ADDRESS, có lẽ là để đặt địa chỉ epmd sẽ liên kết đến, ngoại trừ tôi không thấy nơi đặt biến môi trường đó cho người dùng rabbitmq.
François Beausoleil

5

Nếu bạn chỉ định các biến môi trường trong tệp rabbitmq.conf, bạn phải bỏ tiền tố RABBITMQ_, vì vậy hãy thử:

NODE_IP_ADDRESS = 127.0.0.1


Ngày cài đặt của tôi, một trong hai RABBITMQ_NODE_IP_ADDRESShoặc NODE_IP_ADDRESScông trình, nhưng như đã đề cập chỉ dành cho các cổng AMQP.
Vebjorn Ljosa

1
Cổng epmd là một chức năng của trình ánh xạ cổng erlang và không thể giới hạn địa chỉ liên kết của nó.
cbz

Ngoài ra, cổng EPMD được bảo vệ bằng cookie để không ai có thể kết nối trừ khi họ biết cookie máy chủ RabbitMQ của bạn. Bạn sẽ chỉ cung cấp cookie đó cho các thành viên khác trong cụm RabbitMQ. Nguyên tắc tương tự như một khóa API.
Michael Dillon

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.