【问题标题】:Short Circuit Erlang Port Mapper Daemon短路 Erlang 端口映射器守护进程
【发布时间】:2013-10-26 19:40:56
【问题描述】:

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

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

感谢您的宝贵时间。

【问题讨论】:

    标签: erlang erlang-shell erlang-driver


    【解决方案1】:

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

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

    所以你可以:

    • 在代码服务器级别覆盖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) 中建立的连接,并最终通过调用 erl_epmd:register_node/2 将丢失的节点重新注册到 epmd(如果需要,还可以发送精心设计的 tcp_closed 消息)。

    【讨论】:

    • 感谢 Paul,这非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多