5

给定一个已知的 TCP 端口和远程 beam.smp 服务的名称,以及一个已知的 cookie,是否可以将 Erlang 分发协议的 Erlang Port Mapper Daemon 握手阶段短路,并直接建立一个 Erlang shell 到目标波束.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

但我不清楚 recv_challenge/send_challenge 身份验证是通过 Erlang Port Mapper Daemon 还是绑定到特定端口的 beam.smp 服务发生的。

感谢您的时间。

4

1 回答 1

4

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

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

所以你可以:

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

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

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

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

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