我在 Debian Linux Squeeze 机器上安装了 RabbitMQ,我希望它只监听本地主机接口。我添加了
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 配置选项可以让它执行我想要的操作?
答案1
输入以下内容/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 配置为仅使用 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"
这会在 Rabbit 服务器启动时加载该配置文件并将选项传递给 Erlang。
现在,所有 Erlang/RabbitMQ 进程应该只在本地主机上监听!可以使用以下命令进行检查:netstat -ntlap
编辑:在旧版本的 RabbitMQ 中,配置文件为:/etc/rabbitmq/rabbitmq.conf
。但是,此文件已被文件替换rabbit-env.conf
。
答案2
要使 RabbitMQ 监听本地主机/仅绑定到本地主机:
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 监听的接口。仅监听本地主机的条目例如为 {tcp_listeners, [{'127.0.0.1', 5672}]}(语法可能不正确,请检查) http://www.rabbitmq.com/configure.html#config-file
在启动脚本(/etc/init.d/rabbitmq-server)中导出环境变量export RABBITMQ_NODE_IP_ADDRESS=127.0.0.1
后者对我有用。
EPMD:
Epmd 程序使 Erlang 运行时的分布式部分能够正常工作。如果您正在构建多机集群,则需要让它们可供其他节点(当然还有本地主机)访问。但它通过 cookie 文件内置了保护功能。
它几乎不需要任何关注。只需记住,erlang 程序(例如,包括 rabbitmqctl)需要访问该端口才能联系其他 erlang 程序。
但是,如果您处理的是财务数据或健康记录,保护 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 并使用证书链进行身份验证
我从 RabbitMQ 社区 IRC 频道获得了这些答案。
想向他们表示感谢。
http://dev.rabbitmq.com/irclog/index.php?date=2011-06-14
希望以上内容可以为您节省一些时间(我花了 6 个小时才找到答案)。
答案3
如果您在 rabbitmq.conf 文件中指定环境变量,则必须删除 RABBITMQ_ 前缀,因此请尝试:
节点 IP 地址 =127.0.0.1
答案4
使用最新版本的 rabbitmq - 这足以将所有端口绑定到 localhost (ipv4):
/etc/rabbitmq/rabbitmq-env.conf:
export ERL_EPMD_ADDRESS=127.0.0.1
/etc/rabbitmq/rabbitmq.conf
listeners.tcp.1 = 127.0.0.1:5672
distribution.listener.interface = 127.0.0.1
management.tcp.ip = 127.0.0.1
prometheus.tcp.ip = 127.0.0.1
并重新启动rabbitmq。
此后,主机名部分RABBITMQ_NODENAME
(默认为rabbit@node-hostname
)必须解析127.0.0.1
为rabbitmqctl
才能工作。如果是这样 -rabbitmqctl status
和rabbitmqctl list_queues
应该可以工作并显示先前存在的数据,您无需进一步阅读。
如果不是这样,有两种方法:
节点名称条目可能会添加到
/etc/hosts
:127.0.0.1 节点主机名
,但这可能会反映在其他软件上(例如,需要将节点主机名解析为公共/其他 ip 地址)。
主机名部分可能设置
localhost
为/etc/rabbitmq/rabbitmq-env.conf
:导出 RABBITMQ_NODENAME=rabbit@localhost
,但在使用这种方法并重新启动 rabbitmq 之前 - 确定您是否需要现有的 rabbitmq 数据。如果不需要数据 - 只需重新启动 rabbitmq 即可解决问题rabbitmqctl
。否则,以下是将现有 rabbitmq 数据从旧名称移动到新名称的脚本,它意味着重新启动 rabbitmq(在运行脚本之前备份数据目录:停止 rabbitmq 并复制出/var/lib/rabbitmq
目录):
#!/bin/bash
# place here your nodenames
old=rabbit@nodename
new=rabbit@localhost
set -e
service rabbitmq-server stop
export RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia/
export RABBITMQ_MNESIA_DIR="/var/lib/rabbitmq/mnesia/$old"
export RABBITMQ_FEATURE_FLAGS_FILE="$RABBITMQ_MNESIA_BASE/$old-feature_flags"
rabbitmqctl rename_cluster_node "$old" "$new"
cd /var/lib/rabbitmq/mnesia
rm -f "$old.pid"
mv "$old" "$new"
mv "$old-feature_flags" "$new-feature_flags"
mv "$old-plugins-expand" "$new-plugins-expand"
service rabbitmq-server start
echo "Remove ${RABBITMQ_MNESIA_DIR}-rename directory after checking renamed cluster status and data"
更多信息:
https://www.rabbitmq.com/networking.html
https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/priv/schema/rabbit.schema