Короткое замыкание 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
И здесь:
Но мне не ясно, происходит ли аутентификация 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 является единственной точкой отказа). Для этого:
- Создайте TCP-соединение с epmd и отправьте пакет, чтобы зарегистрировать потерянный узел с его известным портом и именем. Оставьте TCP-соединение открытым, иначе epmd отменит регистрацию узла.
- Подключите новую оболочку к потерянному узлу, используя имя, использованное в предыдущем шаге.
- Затем вы можете закрыть соединение, установленное в (1), и в итоге перерегистрировать потерянный узел в epmd, вызвав
erl_epmd:register_node/2
(и отправка хорошо продуманнойtcp_closed
сообщение при необходимости).