00:00:00Это Headscale — бесплатная версия Tailscale с открытым исходным кодом, которую можно установить на любой сервер.
00:00:06Она дает вам полный контроль над вашей зашифрованной сетью на случай сбоев в интернете или резкого повышения цен в Tailscale.
00:00:13Но самое странное, что Headscale был создан сотрудником самой компании Tailscale.
00:00:18Зачем им платить кому-то за создание собственного конкурента?
00:00:22Жмите «подписаться», и давайте выясним.
00:00:25Прежде чем переходить к деталям, давайте быстро посмотрим на Headscale в действии.
00:00:30Итак, сейчас у меня есть три сервера Hetzner: один для управления Headscale и два узла здесь, которые я хочу соединить между собой.
00:00:40На данный момент эти два узла являются частью моей зашифрованной сети.
00:00:44Если я запущу эту команду, так как все работает в Docker, я смогу увидеть текущие узлы: Ubuntu Test и Ubuntu Test 2.
00:00:53А вот IP-адреса, которые я могу использовать для подключения к ним.
00:00:56Для начала давайте подключимся к этим двум узлам друг из друга.
00:00:59Сначала я скопирую этот IP-адрес.
00:01:02Теперь на Ubuntu Test 2 я зайду по SSH под пользователем root.
00:01:07Да, заходить под root не стоит, но это чисто для теста.
00:01:09И вот IP-адрес из Headscale.
00:01:11Нажимаю Enter, очищаю экран, и, как видите, я уже на Ubuntu Test 1.
00:01:17То есть я зашел на первый сервер со второго, и теперь могу выйти обратно.
00:01:24То же самое можно сделать и на Ubuntu Test 1, если прописать SSH root и вставить IP-адрес Ubuntu Test 2.
00:01:31Очищаем экран, и мы видим, что зашли на Ubuntu Test 2 с первого сервера.
00:01:36Но если я нахожусь вне сети tailnet... создам новую вкладку, это мой Mac... и попробую зайти по SSH на Ubuntu Test 2.
00:01:48Видите, соединение просто висит, потому что я нахожусь вне сети.
00:01:52Как вы только что видели, Headscale дает вам полный доступ к вашей сети.
00:01:56Вы контролируете каждую мелочь и можете добавлять сколько угодно узлов без привязки к конкретному поставщику.
00:02:03Система может работать без интернета, если подключить ее к NAS или старому Raspberry Pi.
00:02:08Но настройка здесь довольно сложная.
00:02:11Собственно, давайте я покажу вам, как это работает.
00:02:13Я создал новый сервер под названием Ubuntu Test 3 и собираюсь создать новую сеть с новым пользователем, чтобы соединить два узла.
00:02:24Это будут Ubuntu Test 3 и Ubuntu Test 1 — чисто для тестирования.
00:02:29На моем управляющем сервере Headscale уже установлен, но я пройдусь по всему процессу, как я это делал.
00:02:37Сейчас у меня запущены три Docker-контейнера.
00:02:40Один — это Headscale UI, второй — сам Headscale, и третий — Caddy.
00:02:45Если мы взглянем на файл Docker compose, то увидим, что конфигурация очень похожа на ту, что в документации Headscale.
00:02:56Хотя я кое-что изменил, например, версию Headscale и пути к моим директориям.
00:03:03Также у меня есть контейнер для Headscale UI — это один из многих веб-интерфейсов с открытым кодом для Headscale.
00:03:11Я покажу его чуть позже.
00:03:13Затем идет Caddy, который выступает в роли обратного прокси.
00:03:16Ссылку на этот конкретный файл Docker compose я оставлю в описании, если вам интересно.
00:03:21Также в этой директории у нас есть папки lib и config.
00:03:26Папка lib, как вы видите, нужна в основном для базы данных SQLite, где хранятся данные пользователей, узлов, DNS и прочее.
00:03:36Но в настройках вы можете сменить ее на Postgres, если не хотите использовать SQLite.
00:03:43В папке config лежат настройки Tailscale и список управления доступом (ACL) в формате JSON.
00:03:52Об этом мы поговорим позже, а пока глянем сюда: этот файл можно взять из документации или просто загрузить через curl, как сделал я.
00:04:01В примере конфигурации на GitHub можно увидеть всё, что доступно для изменений: от сервера до префиксов и пути к файлу политик.
00:04:11Моя конфигурация почти такая же, я только изменил URL сервера на домен Cloudflare, чтобы узлы знали, где искать друг друга.
00:04:23Еще я добавил путь к файлу политик, и на этом, собственно, всё.
00:04:28Домен обычный, в Cloudflare создана A-запись, связывающая поддомен headscale с IP-адресом моего управляющего сервера.
00:04:37Когда всё готово, в файле Caddy можно увидеть два используемых URL: один для интерфейса в папке /web, другой для прокси Headscale.
00:04:49После этого первым делом нужно создать нового пользователя. Это делается вот такой командой.
00:04:56Я создам пользователя Tom, но имя может быть любым.
00:05:00Пользователь создан, теперь командой users list мы видим, что в списке появился новый пользователь с ID 6.
00:05:08Но пока к этому пользователю не привязано ни одного узла.
00:05:11Так что давайте добавим Тому парочку узлов.
00:05:13На новом сервере Ubuntu Test 3 первым делом нужно установить клиент Tailscale. Для этого запускаем в терминале эту команду.
00:05:23Теперь у нас есть доступ к исполняемому файлу Tailscale.
00:05:27Учтите, если вы не под root, вам придется использовать sudo для запуска Tailscale.
00:05:31Но перед тем как запускать Tailscale или логиниться, нужно сделать это особым способом, чтобы всё заработало с Headscale.
00:05:38Для этого нам понадобятся ключи предварительной авторизации. Команду для них можно найти в документации Headscale.
00:05:46Прокручиваю страницу вниз и копирую команду.
00:05:49Затем на сервере управления Headscale я пишу docker exec и вставляю команду.
00:05:54Там, где указан ID пользователя, вводим ID Тома — 6.
00:05:59И перед запуском я добавлю еще одно слово headscale, так как мы заходим внутрь контейнера.
00:06:04И вот наш ключ предварительной авторизации.
00:06:07Теперь копируем эту команду и вставляем ее на сервере Ubuntu Test 3.
00:06:11Копируем наш ключ и вставляем его здесь.
00:06:15Затем нужно изменить адрес сервера логина на наш сервер Headscale, который мы настроили как headscale.pandor.css.
00:06:23Домен Pandora был занят, так что пришлось импровизировать.
00:06:26Нажимаем Enter, и теперь в нашей сети Headscale должен появиться новый узел.
00:06:31Возвращаемся на сервер управления, запускаем nodes list и видим Ubuntu Test 3, принадлежащий Тому, с его IP-адресами.
00:06:44Теперь давайте перенесем Ubuntu Test 1 к пользователю Тому.
00:06:47Но сначала я удалю старый узел Ubuntu Test с ID 1, причем сделаю это принудительно, чтобы не тратить время на подтверждения.
00:06:56Готово. Теперь создаю новый ключ авторизации для Ubuntu Test, не забыв включить SSH флагом --ssh, так как он там уже настроен.
00:07:06Также зайдем на Ubuntu Test 3 и включим SSH там, чтобы иметь возможность подключаться удаленно.
00:07:13Теперь в списке доступных узлов у меня есть Ubuntu Test 1 и Ubuntu Test 3, оба закреплены за Томом.
00:07:20Попробуем соединиться.
00:07:21Беру IP-адрес Ubuntu Test 3, иду на Ubuntu Test 1 и запускаю SSH root с этим IP.
00:07:30Принимаю ключ, и вот — я на сервере Ubuntu Test 3, подключившись с Ubuntu Test 1.
00:07:35И то же самое можно проделать в обратном направлении — со третьего сервера на первый.
00:07:41Если вы в точности повторяли мои действия, велик шанс, что у вас ничего не заработало, потому что нужно настроить правила доступа (ACL).
00:07:49Давайте я покажу свои.
00:07:51Очищу экран и зайду в директорию Headscale. В папке config у нас лежит JSON-файл с правилами ACL.
00:08:01Откроем его. Здесь простейшая конфигурация: разрешить любому источнику в моей сети доступ к любому назначению и порту.
00:08:11Также в разделе SSH разрешено любому узлу в сети подключаться к любому другому по SSH без подтверждения, но только под пользователем root.
00:08:24Конечно, в зависимости от вашей сети, вы можете захотеть ужесточить эти правила, ограничив доступ конкретными узлами или портами.
00:08:33Но для начала такой простой конфигурации вполне достаточно.
00:08:37И опять же, ссылку на этот файл я оставлю в описании.
00:08:40Вы спросите: а как же интерфейс Headscale UI? Упрощает ли он весь этот процесс?
00:08:43Я бы сказал, и да, и нет.
00:08:45Сейчас покажу.
00:08:47Вот адрес моего Headscale UI. Сейчас вы видите обоих моих пользователей, Tess и Tom, и информацию о них.
00:08:48Тут видны ключи и подключенные узлы.
00:08:57Для работы этого интерфейса сначала нужно добавить API-ключ Headscale, который можно получить специальной командой.
00:09:01Но главной проблемой для меня стал вид устройств (device view).
00:09:06Как видите, информации тут немного, и в консоли вылетает ошибка TypeScript — это явно не моя вина, ведь я не менял код.
00:09:09В этот момент приложение обычно зависает, и ничего не работает.
00:09:22По идее, отсюда можно добавлять устройства и менять настройки.
00:09:26Но из-за багов этот инструмент оказался для меня малополезным.
00:09:32Существуют и другие интерфейсы для Headscale, некоторые из них даже упрощают настройку правил доступа.
00:09:35Но лично я пока не нашел Headscale UI, который был бы действительно удобен.
00:09:42Так что да, настройка здесь довольно мудреная.
00:09:46Ладно, она ОЧЕНЬ мудреная.
00:09:49Человеку без технического бэкграунда или даже начинающему разработчику будет сложно настроить это самостоятельно.
00:09:51Наверное, поэтому команда Tailscale позволяет своему сотруднику работать над этим проектом — сейчас он не несет угрозы их бизнесу.
00:09:57Хотя, если кто-то додумается использовать Claude Opus для создания крутого интерфейса, у них может получиться что-то стоящее...
00:10:07Правда, это может упереться в лицензионные ограничения.
00:10:18Но когда всё уже настроено и запущено, Headscale работает просто потрясающе.
00:10:22Хотя некоторых функций всё еще не хватает, например, команд funnel и serve для публикации сервера в интернет или внутри сети.
00:10:32Также нет поддержки нескольких сетей (tailnets), эфемерных узлов и нативных логов сетевого трафика.
00:10:38Но для бесплатного инструмента это действительно впечатляющий уровень.
00:10:42И если я когда-нибудь решу перевести свою систему OpenClaw на полностью автономную работу с локальной нейросетью, то обязательно рассмотрю этот вариант.