Короткое замыкание 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 Daemon или через службу beam.smp, ​​привязанную к определенному порту.

Спасибо за уделенное время.


person Anthony Roe    schedule 18.10.2013    source источник


Ответы (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, если требуется).
person Paul Guyot    schedule 22.10.2013
comment
Спасибо, Пол, это исключительно полезно. - person Anthony Roe; 06.11.2013