我已经在Debian Linux Squeeze机器上安装了RabbitMQ,我希望它只能监听localhost接口。 我已经添加了
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,还是有额外的RabbitMQconfiguration选项,将使它做我想要的?
在/etc/rabbitmq/rabbitmq-env.conf
join以下内容将使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
这需要更多的工作来configurationErlang只使用本地主机的更高编号的端口(用于集群节点,据我所知)。 如果你不关心集群,只想让Rabbit完全在本地运行,那么你可以通过Erlang的内核选项来使用它,只使用loopback接口。
为此,在/etc/rabbitmq/
创build一个新文件 – 我将它rabbit.config
。 在这个文件中,我们将把我们需要在运行时加载的Erlang选项。
[{kernel,[{inet_dist_use_interface,{127,0,0,1}}]}].
如果你正在使用pipe理插件,也想限制到本地,你需要分别configuration它的端口,使rabbit.config包括这个:
[ {rabbitmq_management, [ {listener, [{port, 15672}, {ip, "127.0.0.1"}]} ]}, {kernel, [ {inet_dist_use_interface,{127,0,0,1}} ]} ].
(请注意,RabbitMQ在closures时会让epmd运行,所以如果您想阻塞Erlang的群集端口,则需要从与Rabbit分开的位置重新启动epmd。)
接下来,我们需要让RabbitMQ在启动时加载。 再次打开/etc/rabbitmq/rabbitmq.conf
并在顶部放置以下内容:
export RABBITMQ_CONFIG_FILE="/etc/rabbitmq/rabbit"
当Rabbit服务器启动时,这会加载该configuration文件,并将选项传递给Erlang。
你现在应该只有在本地主机上监听所有的Erlang / RabbitMQ进程! 这可以用netstat -ntlap
来检查
编辑:在老版本的RabbitMQ中,configuration文件是: /etc/rabbitmq/rabbitmq.conf
。 但是,该文件已被rabbit-env.conf
文件replace。
为了使RabbitMQ监听本地主机/只绑定到本地主机:
3种不同的方式(全部相同):
将NODE_IP_ADDRESS = 127.0.0.1放入环境variables文件(请参阅http://www.rabbitmq.com/configure.html#define-environment-variables )
将tcp_listeners和ssl_listeners属性放在configuration文件中:configuration条目tcp_listeners和ssl_listenerspipe理着RabbitMQ监听的接口。 在本地主机上监听的条目应该是例如{tcp_listeners,[{'127.0.0.1',5672}]}(语法可能不正确,请检查它) http://www.rabbitmq.com/configure.html#configuration文件
导出env。 启动脚本中的variables(/etc/init.d/rabbitmq-server)export RABBITMQ_NODE_IP_ADDRESS = 127.0.0.1
后者为我工作。
EPMD:
Epmd程序使Erlang运行时的分布式部分工作。 如果您正在构build多机群集,则需要让其他节点以及localhost可以访问它们。 但它具有通过cookie文件的内置保护。
它几乎不需要任何关注。 请记住,erlang程序(例如rabbitmqctl)需要访问该端口来联系其他的erlang程序。
但是,如果您正在处理财务数据或健康logging,保护epmd可能是一个好主意。 epmd使用的默认端口是4369,其他程序通过tcp连接到它。
另请参阅: http : //www.erlang.org/doc/man/epmd.html#environment_variables
如果您需要进一步保护RabbitMQ,
禁用内置的访客帐户http://www.rabbitmq.com/admin-guide.html#default-state
考虑使用SSL并使用证书链进行身份validation
我从RabbitMQ社区IRC频道获得了这些答案。
想感谢他们。
http://dev.rabbitmq.com/irclog/index.php?date=2011-06-14
希望以上为你节省了一些时间(花了我6个小时才find答案)。
如果在rabbitmq.conf文件中指定环境variables,则必须删除RABBITMQ_前缀,因此请尝试:
NODE_IP_ADDRESS = 127.0.0.1
AFAIK你不能真正configurationepmd接口。 您只能设置epmd端口: http ://www.erlang.org/faq/how_do_i.html#id55132