短路Erlang端口映射器守护进程

时间:2013-10-18 04:25:16

标签: erlang erlang-shell erlang-driver

给定远程beam.smp服务的已知TCP端口和名称,以及已知的cookie,可以将Erlang分发协议的Erlang Port Mapper守护程序握手阶段短路并直接建立Erlang shell目标beam.smp服务?

此处记录了协议:

http://erlang.org/doc/apps/erts/erl_dist_protocol.html

在这里:

https://github.com/blackberry/Erlang-OTP/blob/master/lib/kernel/internal_doc/distribution_handshake.txt

但我不清楚是否通过Erlang Port Mapper守护程序或绑定到特定端口的beam.smp服务发生recv_challenge / send_challenge认证。

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

在Erlang VM(beam或beam.smp)之间进行身份验证。 epmd只处理端口注册。简单地短路epmd并不是非常容易,其他方法可能更适合您的实际需要。

不幸的是, epmd不是默认分发协议inet_tcp_dist)或其SSL counterpart的选项。有两个未记录的选项看起来像您可以禁用epmd(-no_epmd)或提供​​替代实现(epmd_module)。但是,分发协议对epmd的依赖性为hard-coded,并不依赖于这些选项。

所以你可以:

  • 覆盖代码服务器级别的erl_epmd模块(可能是最脏的方法);
  • 提供另一种分发协议,除了调用erl_epmd的部分外,它将复制(或调用)inet_tcp_dist。主要是,您需要提供自己的setup/5
  • 实施

如果您不希望shell节点连接到epmd以注册其名称,您还需要覆盖listen/1。在这种情况下,您可以将-no_epmd传递给命令行。

或者,您可以连接到epmd以注册侦听节点,以便使用默认协议创建shell连接。

如果epmd丢失了节点的跟踪(例如,它被杀死,不幸的是,epmd是单点故障),这种方法特别有用。为此:

  1. 创建与epmd的TCP连接,并发送数据包以使用已知端口和名称注册丢失的节点。保持TCP连接打开或epmd将取消注册节点。
  2. 使用上一步中使用的名称将新shell连接到丢失的节点。
  3. 然后,您可以关闭(1)中建立的连接,并最终通过调用erl_epmd:register_node/2(并在需要时发送精心设计的tcp_closed消息)将丢失的节点重新注册到epmd。