Построение сети 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 — два сервера, соединённых вручную.
На каждом узле задайте уникальное короткое имя (например,
node1иnode2).На каждом узле добавьте запись о соседе: адрес его админки, его имя и общий секрет.
На каждом узле задайте собственный секрет подписи. Проще всего держать единый общий секрет на оба узла.
Откройте в админке экран «Узлы» области Meshwork. В течение нескольких секунд оба узла увидят друг друга со статусом «Активен».
Домен при этом можно не задавать, но без общего домена вы получите только взаимную видимость узлов. Общий каталог ресурсов и разнос оповещений работают лишь между узлами с одинаковым доменом. Если они нужны, задайте узлам общий домен (вариант B).
Вариант B. Домен с автообнаружением¶
Когда узлов больше двух, удобнее задать им общий домен и не перечислять каждую связь вручную.
На каждом узле задайте уникальное имя и общий домен площадки.
Если узлы домена связываются через интернет (по публичным адресам), включите HTTPS хотя бы на одном-двух узлах домена и перезапустите их (см. Требования и достижимость). В локальной сети этот шаг можно пропустить; узлам, у которых не задано имя хоста веб-сервера, задайте интерфейс анонса — их внутренний интерфейс (Узел с несколькими сетями).
Свяжите узлы «точкой входа»: на каждом узле пропишите хотя бы одного уже работающего соседа (адрес, имя, общий секрет), как в варианте A. Остальные узлы домена узел найдёт сам.
Откройте карту сети. Через несколько секунд в ней появятся все узлы домена: явно прописанные — как постоянные, найденные автоматически — как автообнаруженные.
Узлы за 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 и с учётом публичных портов.
Интерфейс анонса определяет только то, какой адрес узел сообщает о себе. Через какой интерфейс уходят собственные соединения узла к соседям, по-прежнему решает таблица маршрутизации сервера.
Порядок настройки внутреннего домена, в котором у одного узла есть ещё и публичная сеть:
На узле с несколькими сетями задайте интерфейс анонса — интерфейс внутренней сети.
На узлах домена, у которых не задано имя хоста веб-сервера, тоже задайте интерфейс анонса — их внутренний интерфейс. Без него узел, у которого есть только частные адреса, ничего о себе не сообщает, и автообнаружение его не находит: он связан лишь с теми, кто прописал его явно.
Соседей друг у друга задавайте по внутренним IP-адресам.
Проверьте карту сети (Карта сети и каталог ресурсов): адреса узлов — внутренние, признак 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-адреса.
Смена домена «сбросила» карту. Изменение домена или набора дополнительных доменов пересобирает членство: автообнаруженные связи и общий каталог временно сбрасываются и собираются заново. Это нормально.