EPMD 是什么
EPMD(Erlang Port Mapper Daemon)是 Erlang 分布式节点体系的端口映射服务:每个节点启动时向它注册自己的名字与监听端口,其他节点通过它完成查找后再直连通信。默认监听 TCP 4369,RabbitMQ、CouchDB 等基于 BEAM 的系统集群化时都靠它。节点之间的实际通信走随机高阶端口,因此只放行 4369 并不足以让集群组建成功。
基本信息
| 服务 | EPMD(Erlang Port Mapper Daemon) |
|---|---|
| 协议 | TCP 4369;节点通信走可配置的高阶端口段 |
| 典型宿主 | RabbitMQ、CouchDB、基于 Erlang 的通信与游戏后端 |
| 认证机制 | Erlang 分布式 cookie |
| 安全等级 | 仅集群内网,cookie 必须保密 |
典型使用场景
- RabbitMQ 集群组建:节点之间通过 EPMD 找到彼此后再建立分布式连接
- 排障:新节点无法加入集群时,确认 4369 与节点通信端口是否互通
- 容量规划:固定节点通信端口段,便于防火墙按段放行与审计
- 安全评估:确认 cookie 是否为默认值、EPMD 是否对外可达
- 跨机房设计:延迟敏感场景改用 federation 或 shovel 做跨域分发
查询 EPMD 注册的节点
查询 EPMD 注册的节点
epmd -names # 列出本机注册的节点名与端口
ss -lntp | grep 4369
rabbitmqctl cluster_status # 集群视角的节点与分区状态
rabbitmq-diagnostics ping # 节点运行状态快速判定固定节点通信端口(RabbitMQ 示例)
固定节点通信端口(RabbitMQ 示例)
# /etc/rabbitmq/rabbitmq.conf
# 固定 Erlang 分布式监听端口,便于防火墙收敛
kernel.inet_dist_listen_min = 35672
kernel.inet_dist_listen_max = 35682
# 集群防火墙需放行:4369 与上面的端口段(节点之间互访)集群放行清单
| 端口 | 用途 | 注意点 |
|---|---|---|
| 4369/tcp | EPMD 节点注册与查找 | 节点间互访,集群内网即可 |
| 高阶端口段 | Erlang 分布式通信 | 需固定后按段放行 |
| 5672/tcp | AMQP 客户端 | 业务网段按需放行 |
| 15672/tcp | 管理界面 | 仅管理网段,默认账号要改 |
Erlang 分布式 cookie 是节点间唯一的凭据:一旦泄露,攻击者可直接接管节点执行代码;集群内任意主机都能读取到它时,等于整个集群失守。
网络规划:除 4369 与固定后的分布式端口段,还要放行客户端与管理端口;跨机房组集群对延迟敏感,通常改用 federation 或 shovel 做跨域分发更稳。