Построение сети Meshwork

Настройка Meshwork сводится к тому, чтобы каждый узел знал своё имя и домен и имел хотя бы одного достижимого соседа. Дальше домен достраивает остальные связи сам. Все действия выполняются в веб-админке; изменение настроек Meshwork требует роли администратора. Точные поля и их расположение приведены в разделе Веб-интерфейс.

Требования и достижимость

  • Сетевая достижимость. Узел должен уметь установить TCP-соединение с административным веб-сервером соседа. Порт берётся из адреса соседа («хост:порт») либо из публичного порта, который сосед сообщает о себе (Параметры узла). Отдельного порта у Meshwork нет: это порт веб-сервера соседа или, при включённом у соседа HTTPS, его TLS-порт. Если сосед за NAT задал публичный порт, это порт, проброшенный на его веб-сервер. Значения для свежей установки приведены в Начальные настройки; нужный порт соседа должен быть открыт со стороны других узлов.

  • HTTPS для автообнаружения через интернет. Если автообнаруженные узлы домена связываются по публичным (интернет-)адресам, им нужно установить между собой защищённое соединение (HTTPS), чтобы безопасно подтвердить подлинность друг друга по открытой сети. Поэтому включите HTTPS хотя бы на узлах, через которые идёт обнаружение. Включение HTTPS вступает в силу после перезапуска сервера. Если узлы доступны только по публичным адресам и ни один не поднят по HTTPS, прямые автообнаруженные связи не аутентифицируются: узел всё равно виден (через ретрансляцию от соседа), но его прямая связь помечается причиной (см. Карта сети и каталог ресурсов).

  • Локальная сеть — HTTPS не требуется. Если узлы домена общаются по частным адресам одной доверенной сети (10.x.x.x, 172.16–31.x.x, 192.168.x.x, а также 127.x.x.x и 169.254.x.x), защищённое соединение для автообнаружения не нужно — узлы подтверждают подлинность и по обычному HTTP. Узел распознаётся как локальный по IP-адресу, поэтому в локальной сети задавайте соседей именно по IP-адресам, а не по доменным именам. HTTPS при этом можно включить — он будет использован, если доступен. Исключение — узел, которому задан интерфейс анонса с частным адресом. Он объявляет себя только для обычного HTTP. Если у узла несколько сетей (например, внутренняя и публичная, через которую идёт маршрут по умолчанию), без отдельной настройки он сообщает соседям публичный адрес. Такому узлу задайте интерфейс анонса (Узел с несколькими сетями).

  • Явная связь работает и по HTTP — на неё требование HTTPS не распространяется в любом случае.

  • Имя и секрет обязательны. Узел участвует в сети, только если у него заданы имя и секрет подписи.

  • Синхронизированные часы. С версии 2.0.2.416 узел отклоняет соседа, часы которого расходятся с его собственными больше чем на 5 минут, и такая связь показывается недоступной. Держите на всех узлах синхронизацию времени (NTP). При расхождении больше половины допуска оба узла пишут в журнал предупреждение с именем соседа и величиной расхождения. Допуск задаёт параметр cluster-hello-window-sec секции cluster файла настроек (Файл настроек pss.json): по умолчанию 300 секунд, от 0 до 86400; 0 выключает проверку часов, если синхронизировать их нельзя.

  • Ограничения на имена. Имя узла — от 2 до 16 символов, имя домена — не длиннее 16 символов; разрешены латинские буквы, цифры и знаки _, -, .. Пробелы и другие символы недопустимы (например, домен «Alex Home» задать нельзя — используйте Alex_Home).

Параметры узла

В настройках сервера задаётся, кем узел представляется в сети:

  • Имя узла — короткое уникальное имя, по которому узел узнают остальные. Пустое имя означает, что узел в сети не участвует.

  • Заметка — произвольная подпись узла (например, «Москва, стойка 3»), показывается в админке и на работу сети не влияет.

  • Домен — узлы с одинаковым доменом автоматически находят друг друга, делят общий каталог ресурсов и разносят оповещения. Пустое значение отключает автообнаружение (узел может работать только по явному списку соседей).

  • Публичные порты (HTTP и HTTPS) — порты, которые узел сообщает соседям для обратной достижимости при трансляции адресов (NAT). Если не заданы, узел сообщает собственные порты веб-сервера.

  • Интерфейс анонса — сетевой интерфейс, адрес которого узел сообщает соседям вместо имени хоста веб-сервера или своего публичного адреса. Нужен узлу с несколькими сетями (Узел с несколькими сетями). Частный адрес объявляется только для обычного HTTP, публичные порты к нему не применяются. Значение «По умолчанию (HTTP-имя хоста или публичный адрес)» — узел сообщает адрес по умолчанию.

  • Дополнительные домены (режим super-node) — узел состоит ещё и в перечисленных доменах. Ресурсы остаются изолированными по доменам — узел их не смешивает. В основном домене узел — полноправный участник автообнаружения. В дополнительном домене он связан только с соседями из своего списка (Соседи и секреты): от них он получает каталог ресурсов и оповещения этого домена, а остальные узлы домена видит через них и сам к ним не обращается. Поэтому для каждого дополнительного домена пропишите у super-node хотя бы одного соседа из этого домена.

Соседи и секреты

Здесь задаётся, с какими соседями узел поддерживает прямую связь и как стороны проверяют друг друга. Запросы между узлами подписываются общим секретом, поэтому без совпадающих секретов связь не установится. Длина каждого секрета — от 16 до 128 символов.

Список соседей — это записи вида «адрес — имя — секрет»:

  • Адрес соседа — «хост:порт» его админки. Запись может быть без адреса: такой сосед никогда не вызывается этим узлом (он только сам дозванивается) и опознаётся по имени и секрету. Так задают узел за NAT, который умеет только инициировать соединение.

  • Имя соседа должно в точности совпадать с именем, заданным у самого соседа.

  • Общий секрет связи с этим соседом должен быть одинаковым на обоих концах.

  • Интерфейс анонса (необязательно) — интерфейс, адрес которого узел сообщает именно этому соседу вместо своего общего интерфейса анонса (Узел с несколькими сетями). Значение «Как у узла» — действует общий.

Интерфейс анонса соседа привязан к его имени, а не к строке списка:

  • пока у строки нет корректного имени соседа, выбор интерфейса недоступен — настройку не под чем сохранить;

  • при переименовании соседа настройка переходит вместе с ним;

  • при удалении соседа из списка настройка сохраняется и продолжает действовать, если этот узел остаётся в сети через автообнаружение.

Такие настройки для узлов, которых нет в списке соседей, показаны в блоке «Интерфейс анонса для других узлов» под списком: там их можно изменить или удалить. Добавить в этот блок новый узел нельзя — настройку задают в строке соседа.

Запись о недоступном соседе удаляется не только здесь: действие «Забыть узел» на экранах «Узлы» и «Топология» (Узлы) вычёркивает его из этого списка. Это та же правка конфигурации, сделанная с экрана наблюдения, и отменить её нельзя.

Кроме списка соседей, у узла есть собственный секрет подписи: им узел подписывает свои исходящие запросы. Сосед проверяет подпись тем секретом, который хранит для этого узла, поэтому собственный секрет узла должен совпадать с секретом, записанным о нём у каждого соседа.

Ответы подписываются так же: узел принимает ответ соседа, только если тот подписан ключом, которым был подписан запрос, — секретом связи или ключом домена. Ответ с неверной подписью или от другого узла связь не устанавливает. Ключ домена между узлами передаётся в зашифрованном виде. Узлы версий до 2.0.2.415 ответы не подписывают; как вести себя в смешанном домене, описано в Обновление узлов домена. С версии 2.0.2.416 каждое сообщение узла несёт время отправки и имя адресата: сосед отклоняет сообщение, отправленное повторно или адресованное другому узлу, а также сообщение с временем вне допуска (см. «Синхронизированные часы» в Требования и достижимость).

Примечание

Практическое правило: для простой площадки задайте один общий секрет и используйте его и как собственный секрет подписи на каждом узле, и как секрет в каждой записи о соседе. Тогда любая пара узлов аутентифицируется одинаково. Для более строгого разграничения можно держать отдельный секрет на каждую связь.

Быстрый старт

Вариант A. Два узла напрямую (явная связь)

Самый простой Meshwork — два сервера, соединённых вручную.

  1. На каждом узле задайте уникальное короткое имя (например, node1 и node2).

  2. На каждом узле добавьте запись о соседе: адрес его админки, его имя и общий секрет.

  3. На каждом узле задайте собственный секрет подписи. Проще всего держать единый общий секрет на оба узла.

  4. Откройте в админке экран «Узлы» области Meshwork. В течение нескольких секунд оба узла увидят друг друга со статусом «Активен».

Домен при этом можно не задавать, но без общего домена вы получите только взаимную видимость узлов. Общий каталог ресурсов и разнос оповещений работают лишь между узлами с одинаковым доменом. Если они нужны, задайте узлам общий домен (вариант B).

Вариант B. Домен с автообнаружением

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

  1. На каждом узле задайте уникальное имя и общий домен площадки.

  2. Если узлы домена связываются через интернет (по публичным адресам), включите HTTPS хотя бы на одном-двух узлах домена и перезапустите их (см. Требования и достижимость). В локальной сети этот шаг можно пропустить; узлам, у которых не задано имя хоста веб-сервера, задайте интерфейс анонса — их внутренний интерфейс (Узел с несколькими сетями).

  3. Свяжите узлы «точкой входа»: на каждом узле пропишите хотя бы одного уже работающего соседа (адрес, имя, общий секрет), как в варианте A. Остальные узлы домена узел найдёт сам.

  4. Откройте карту сети. Через несколько секунд в ней появятся все узлы домена: явно прописанные — как постоянные, найденные автоматически — как автообнаруженные.

Узлы за NAT

Узел в частной сети, до которого извне не достучаться напрямую, может состоять в сети как инициатор. Он сам устанавливает соединение с доступным соседом, и через это одно соединение данные идут в обе стороны — узел и сообщает о себе, и получает сведения о других. Такому узлу достаточно прописать хотя бы одного достижимого соседа.

Сведения о NAT-узле распространяются по домену автоматически: сосед, который с ним на связи, ретранслирует его состояние остальным. У дальних соседей такой узел будет показан как полученный через ретрансляцию, но в состоянии «на связи».

Чтобы узел за NAT был достижим и для входа (например, служил точкой входа домена), настройте публикацию публичного порта (см. Параметры узла) и пробросьте этот порт на маршрутизаторе/файрволе на административный веб-сервер узла. Со стороны соседей такой узел держат записью «имя + секрет без адреса»: сосед не будет тщетно дозваниваться до частного адреса, а опознает узел по имени и секрету, когда тот подключится сам.

Узел с несколькими сетями

По умолчанию узел сообщает соседям адрес, по которому к нему следует обращаться: имя хоста, заданное для веб-сервера, а если оно не задано — адрес своего первого публичного интерфейса. Для узла с одной сетью этого достаточно. Если же у узла несколько сетей, выбор по умолчанию может оказаться неверным. Типичный случай — все узлы домена находятся во внутренней сети, но у одного из них есть ещё публичный интерфейс, через который идёт маршрут по умолчанию. Такой узел сообщает соседям публичный адрес, и соседи начинают обращаться к нему через публичную сеть и по HTTPS, хотя все узлы находятся в одной внутренней сети.

Чтобы узел объявлял нужный адрес, задайте ему интерфейс анонса (Параметры узла). Это сетевой интерфейс, адрес которого узел сообщает соседям вместо имени хоста и публичного адреса:

  • если адрес интерфейса частный (10.x.x.x, 172.16–31.x.x, 192.168.x.x, 127.x.x.x, 169.254.x.x), узел объявляет его только для обычного HTTP — на порту веб-сервера, без HTTPS и без публичных портов. Соседи во внутренней сети обращаются к нему по HTTP, HTTPS для обмена не требуется;

  • если адрес публичный, он объявляется так же, как публичный адрес узла: с HTTPS при включённом HTTPS и с учётом публичных портов.

Интерфейс анонса определяет только то, какой адрес узел сообщает о себе. Через какой интерфейс уходят собственные соединения узла к соседям, по-прежнему решает таблица маршрутизации сервера.

Порядок настройки внутреннего домена, в котором у одного узла есть ещё и публичная сеть:

  1. На узле с несколькими сетями задайте интерфейс анонса — интерфейс внутренней сети.

  2. На узлах домена, у которых не задано имя хоста веб-сервера, тоже задайте интерфейс анонса — их внутренний интерфейс. Без него узел, у которого есть только частные адреса, ничего о себе не сообщает, и автообнаружение его не находит: он связан лишь с теми, кто прописал его явно.

  3. Соседей друг у друга задавайте по внутренним IP-адресам.

  4. Проверьте карту сети (Карта сети и каталог ресурсов): адреса узлов — внутренние, признак NAT у узла с двумя сетями не выставлен, у связей нет причины неудачной аутентификации.

Если узел должен сообщать разным соседям разные адреса (например, соседям во внутренней сети внутренний адрес, а соседу в интернете публичный), задайте интерфейс анонса отдельным соседям (Соседи и секреты): он действует вместо общего интерфейса анонса узла. Учтите: если один и тот же узел объявляет себя в разных сетях по-разному, третий узел, получающий сведения о нём из обеих сетей, может видеть его адрес попеременно то одним, то другим. Поэтому разные адреса задают узлу, стоящему на границе сетей, соседи которого из разных сетей друг о друге не сообщают.

Результат виден на экране «Узлы» (Узлы) в строке самого узла: поля «Публичный HTTP» и «Публичный HTTPS» показывают то, что узел сообщает соседям. С частным интерфейсом анонса поля «Публичный HTTPS» нет, а «Публичный HTTP» содержит внутренний адрес и порт. Интерфейс, заданный отдельному соседу, в строке самого узла не отражается — его видно в строке этого узла на соседе, которому он предназначен.

В админке интерфейс анонса выбирается из списка сетевых интерфейсов сервера — имя и IPv4-адрес; в файле конфигурации его можно задать и IP-адресом. Интерфейс, которого на сервере нет, при сохранении отклоняется с сообщением вида cluster-bind-if: 'eth9' is neither a network interface of this host nor an IPv4 address. Если интерфейс пропадёт позже (например, отключится VPN), настройка сохраняется: узел продолжит работу и до возвращения интерфейса будет сообщать адрес по умолчанию, а в списке выбора сохранённый интерфейс показан одним именем, без адреса.

Обновление узлов домена

С версии 2.0.2.415 узлы проверяют подпись ответов соседей и передают ключ домена в зашифрованном виде (Соседи и секреты). Узлы прежних версий ответы не подписывают, поэтому порядок обновления имеет значение:

  • по возможности обновите все узлы домена за один раз;

  • если так нельзя, сначала обновите узлы, к которым подключаются остальные (центральные узлы и узлы с публичными адресами), а затем узлы за NAT.

Пока в домене работают узлы разных версий:

  • старый и новый узел продолжают видеть друг друга работающими;

  • данные старого узла (сеансы автовхода, общий каталог ресурсов, оповещения) попадают на новый узел, когда старый сам подключится к нему, — обычно в течение 30 секунд;

  • старый узел, который не может подключиться к новому (например, из-за NAT), до своего обновления показывается только как работающий, без своих данных;

  • полная защита от повторно отправленных записанных обменов действует, когда все узлы домена работают на версии 2.0.2.415 или новее.

Возврат на прежнюю версию безопасен.

С версии 2.0.2.416 узлы дополнительно сверяют время отправки сообщений, поэтому:

  • перед обновлением проверьте, что на всех узлах домена работает синхронизация времени (NTP) (Требования и достижимость);

  • обновляйте домен целиком: пока в нём есть узлы прежних версий, их сообщения ещё можно повторить;

  • узел, возвращённый с 2.0.2.416 на прежнюю версию, его соседи на 2.0.2.416 отклоняют до своего перезапуска. Откатывайте домен целиком или перезапустите узлы 2.0.2.416 после отката.

Типичные проблемы

  • Узлы не видят друг друга. Проверьте: у обоих задано имя узла; у каждого есть секрет подписи и он совпадает с тем, что записан о нём у соседа; адрес соседа верен и его админ-порт открыт со стороны другого узла.

  • Сосед в состоянии «Недоступен». Узел вышел за окно ожидания: проверьте сеть и работоспособность его веб-сервера. Для узла за NAT убедитесь, что он сам инициирует соединение к достижимому соседу либо что настроены публикация и проброс порта. Если в журнале есть предупреждение о расхождении часов с этим соседом, синхронизируйте время на обоих узлах (NTP).

  • Сосед стал недоступен после отката одного узла. Соседи на 2.0.2.416 отклоняют узел, возвращённый на прежнюю версию, до своего перезапуска: перезапустите их или откатите домен целиком.

  • Автообнаруженный сосед помечен причиной, прямая связь не работает. В домене не удаётся подтвердить подлинность узлов. Если они связываются через интернет, включите HTTPS хотя бы на одном узле домена и перезапустите его; в локальной сети проверьте, что соседи заданы по IP-адресам, а не по доменным именам, и что узлу с несколькими сетями задан интерфейс анонса. Явная связь (постоянные узлы) работает и без HTTPS.

  • Соседи обращаются к узлу по публичному адресу, хотя домен во внутренней сети. У узла несколько сетей, и по умолчанию он сообщает соседям публичный адрес. Задайте ему интерфейс анонса — внутренний интерфейс (Узел с несколькими сетями).

  • Ложный признак NAT. Если узлы заданы по доменным именам, а не по IP, признак NAT может не определяться по адресу — это не мешает работе. Для диагностики NAT используйте IP-адреса.

  • Смена домена «сбросила» карту. Изменение домена или набора дополнительных доменов пересобирает членство: автообнаруженные связи и общий каталог временно сбрасываются и собираются заново. Это нормально.