ฉันจะทำให้ RabbitMQ ฟังได้เฉพาะ localhost อย่างไร


40

ฉันได้ติดตั้ง RabbitMQ บนเครื่อง Debian Linux Squeeze และฉันต้องการให้ฟังเฉพาะ localhost interface ฉันได้เพิ่ม

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

ไปยัง/etc/rabbitmq/rabbitmq.confไฟล์ของฉันและนั่นทำให้เชื่อมโยงกับโลคัลโฮสต์อินเตอร์เฟสเท่านั้นเมื่อฟังบน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 มันเป็น daemon การตั้งชื่อ Erlang วิธีที่ดีที่สุดในการผูกกับ localhost เท่านั้นคือให้กระต่าย 'nodename @ localhost' แก่กระต่าย นี่คือชื่อโหนดที่ใช้ในการทำคลัสเตอร์เซิร์ฟเวอร์ RabbitMQ หลายเครื่องและ Erlang ใช้เพื่อค้นหาโหนดทั่วเครือข่าย ส่วนหลัง @ คือชื่อโฮสต์ที่ใช้ Rabbit และชัดเจน localhost ไม่ใช่ชื่อที่เข้าถึงได้จากภายนอก
Michael Dillon

คำตอบ:


48

การใส่สิ่งต่อไปนี้ใน/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 ตัวเลือกเคอร์เนลเพื่อให้ใช้เฉพาะอินเตอร์เฟสลูปแบ็ค

ต้องการทำเช่นนั้นสร้างไฟล์ใหม่ใน/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

แก้ไข: ในรุ่นเก่าของ RabbitMQ /etc/rabbitmq/rabbitmq.confไฟล์การกำหนดค่า: อย่างไรก็ตามไฟล์นี้ถูกแทนที่ด้วยrabbit-env.confไฟล์


1
ไชโย! ขอบคุณ หมายเหตุ: ฉันต้องการ 'rabbitmq-env.conf' บน RabbitMQ สำหรับ CentOS / RHEL ผ่าน EPEL และในขณะที่การส่งออก 'กระต่าย' สำหรับ 'rabbit.config' ดูแปลกสำหรับฉัน
astrostl

"เปิด/etc/rabbitmq/rabbitmq.confอีกครั้ง" ทำไม "อีกครั้ง" คุณหมายถึงrabbitmq-env.confอะไร
phinz

ตัวแปรสภาพแวดล้อมERL_EPMD_ADDRESSจะควบคุม IP การรับฟังของ epmd เท่านั้นหากคุณต้องการเปลี่ยนพอร์ตคลัสเตอร์ (25672) Listen 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# การตั้งค่าไฟล์

  • ส่งออก env ตัวแปรในสคริปต์เริ่มต้น (/etc/init.d/rabbitmq-server) เอ็กซ์พอร์ต RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1

หลังทำงานสำหรับฉัน

EPMD:

โปรแกรม Epmd ทำให้ชิ้นส่วนแบบกระจายของ Erlang ใช้งานได้ หากคุณกำลังสร้างคลัสเตอร์หลายเครื่องคุณต้องปล่อยให้พวกเขาสามารถเข้าถึงโหนดอื่น ๆ และ localhost ได้อย่างแน่นอน แต่มันมีการป้องกันในตัวผ่านไฟล์คุกกี้

มันแทบจะไม่เคยต้องการความสนใจใด ๆ เพียงจำไว้ว่าโปรแกรม 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 จะผูกไว้กับยกเว้นว่าฉันไม่เห็นว่าจะตั้งค่าตัวแปรสภาพแวดล้อมสำหรับผู้ใช้ที่กระต่ายหรือไม่
François Beausoleil

5

หากคุณระบุตัวแปรสภาพแวดล้อมในไฟล์ rabbitmq.conf คุณต้องวางคำนำหน้า RABBITMQ_ ดังนั้นให้ลอง:

NODE_IP_ADDRESS = 127.0.0.1


ในการติดตั้งของฉันอย่างใดอย่างหนึ่งRABBITMQ_NODE_IP_ADDRESSหรือใช้NODE_IP_ADDRESSงานได้ แต่ตามที่กล่าวไว้เฉพาะสำหรับพอร์ต amqp
Vebjorn Ljosa

1
พอร์ต epmd เป็นฟังก์ชั่นของ mapper พอร์ต erlang และ afaik มันเป็นไปไม่ได้ที่จะ จำกัด การผูกที่อยู่ของมัน
cbz

นอกจากนี้พอร์ต EPMD ยังได้รับการป้องกันด้วยคุกกี้ดังนั้นจึงไม่มีใครสามารถเชื่อมต่อได้เว้นแต่พวกเขาจะรู้จักคุกกี้เซิร์ฟเวอร์ RabbitMQ ของคุณ คุณจะให้คุกกี้นั้นแก่สมาชิกคนอื่น ๆ ของคลัสเตอร์ RabbitMQ เท่านั้น หลักการเดียวกับคีย์ API
Michael Dillon

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.