如何使RabbitMQ仅监听本地主机?


40

我已经在Debian Linux Squeeze机器上安装了RabbitMQ,我希望它仅侦听localhost接口。我已经添加了

RABBITMQ_NODE_IP_ADDRESS=127.0.0.1

到我的/etc/rabbitmq/rabbitmq.conf文件,这使得它在侦听amqp端口(5672)时仅绑定到localhost接口。但是,当侦听端口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的一部分。这是Erlang命名守护程序。仅绑定到本地主机的最佳方法是为Rabbit指定节点名“ rabbit @ localhost”。这是用于集群多个RabbitMQ服务器的节点名,被Erlang用于在网络上查找该节点。@之后的部分是运行Rabbit的主机名,显然,localhost不是可从外部访问的名称。
Michael Dillon

Answers:


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配置为仅对更高编号的端口使用本地主机(据我所知,它用于群集节点)需要花费更多的工作。如果您不关心集群,只希望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的群集端口,则需要与Rabbit分开重新启动epmd。)

接下来,我们需要在启动时让RabbitMQ加载它。/etc/rabbitmq/rabbitmq.conf再次打开并将以下内容放在顶部:

export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"

这会在启动Rabbit服务器时加载该配置文件,并将选项传递给Erlang。

现在,您应该让所有Erlang / RabbitMQ进程仅在localhost上侦听!可以用netstat -ntlap

编辑:在较旧的RabbitMQ版本中,配置文件为:/etc/rabbitmq/rabbitmq.conf。但是,此文件已被替换rabbit-env.conf


1
太棒了!谢谢。注意:我需要通过EPEL在RabbitMQ上为CentOS / RHEL使用'rabbitmq-env.conf'。虽然“ rabbit.config”的“ rabbit”导出对我来说很奇怪,但它的后缀有效。
astrostl

/etc/rabbitmq/rabbitmq.conf再次打开”。为什么要“再次”?你是说rabbitmq-env.conf
菲茨

环境变量ERL_EPMD_ADDRESS仅控制epmd的侦听IP,如果要更改RabbitMQ的群集端口(25672)侦听IP,则需要使用该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种不同方式(所有等效方式):

后者为我工作。

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并使用证书链进行身份验证

我从RabbitMQ社区IRC频道获得了这些答案。

在此感谢他们。

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端口提及。
Vebjorn Ljosa

1
epmd端口是erlang端口映射器的功能,因此不能限制其绑定地址。
cbz 2011年

同样,EPMD端口受cookie保护,因此除非他们知道您的RabbitMQ服务器cookie,否则任何人都无法连接。您只可以将该Cookie提供给RabbitMQ集群的其他成员。与API密钥的原理相同。
Michael Dillon

1

抱歉,您无法真正配置epmd接口。您只能设置epmd端口:http ://www.erlang.org/faq/how_do_i.html#id55132

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.