Короткое замыкание Erlang Port Mapper Daemon

При наличии известного порта TCP и имени для удаленной службы beam.smp, ​​а также известного файла cookie возможно замкнуть фазу рукопожатия Erlang Port Mapper Daemon протокола распространения Erlang и установить оболочку Erlang непосредственно на целевой луч. Сервис.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 или службы beam.smp, ​​привязанной к определенному порту.

Спасибо за ваше время.

1 ответ

Решение

Аутентификация происходит между виртуальными машинами Erlang (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,

Если вы не хотите, чтобы узел оболочки подключался к epmd для регистрации его имени, вам также необходимо переопределить listen/1, В этом случае вы можете передать -no_epmd в командной строке.

Кроме того, вы можете подключиться к epmd, чтобы зарегистрировать прослушивающий узел, чтобы создать соединение оболочки с использованием протокола по умолчанию.

Этот подход особенно полезен, если epmd потерял след узла (например, он был убит, к сожалению, epmd является единственной точкой отказа). Для этого:

  1. Создайте TCP-соединение с epmd и отправьте пакет, чтобы зарегистрировать потерянный узел с его известным портом и именем. Оставьте TCP-соединение открытым, иначе epmd отменит регистрацию узла.
  2. Подключите новую оболочку к потерянному узлу, используя имя, использованное в предыдущем шаге.
  3. Затем вы можете закрыть соединение, установленное в (1), и в итоге перерегистрировать потерянный узел в epmd, вызвав erl_epmd:register_node/2 (и отправка хорошо продуманной tcp_closed сообщение при необходимости).
Другие вопросы по тегам