# Mesh

> **Бета.** Tuna Mesh в бете и включается для команды по запросу в [поддержку](https://tuna.am/docs/support.md). После этого в личном кабинете появится раздел [Mesh](https://my.tuna.am/mesh).

Tuna Mesh объединяет ноутбуки, серверы и виртуальные машины команды в частную сеть. Каждое устройство получает постоянный адрес и DNS-имя вида `laptop.tuna`, и устройства обращаются друг к другу напрямую по любым протоколам и портам. Публичный IP-адрес и открытые порты не нужны.

Туннель публикует один локальный сервис в интернет. Mesh — закрытая сеть: в ней видны только устройства вашей команды, а снаружи к ним не попасть.

![Раздел «Мои устройства»: список устройств с Mesh IP, ОС, точкой выхода и последней активностью](/docs/img/mesh/devices.webp)

Что ещё умеет mesh:

* [точки выхода](https://tuna.am/docs/mesh/exit-nodes.md) — выходить в интернет через другое устройство команды, например через сервер в нужной стране;
* [подсети](https://tuna.am/docs/mesh/exit-nodes.md#subnets) — открыть доступ к офисной сети через одно устройство, не ставя клиент на каждый хост;
* [правила доступа](https://tuna.am/docs/mesh/acl.md) — задать, какие устройства и по каким портам могут общаться;
* отзыв устройств из личного кабинета: сессия обрывается сразу.

Трафик шифруется WireGuard. Если в сети режется UDP, клиент сам переключается на запасной транспорт поверх SSH.

## Требования

* Linux, macOS или Windows. Раздавать [точку выхода и подсети](https://tuna.am/docs/mesh/exit-nodes.md) можно только с Linux и macOS, пользоваться ими можно на всех трёх системах.
* Клиент [tuna](https://tuna.am/docs/guides/install/install-cli.md). Рекомендуем версию 0.38.0 и новее, а tunad — 0.1.2 и новее.
* Служба `tunad`. Она настраивает сетевой интерфейс, поэтому работает с правами root или администратора. Сами команды `tuna mesh` запускаются от обычного пользователя, `sudo` для них не нужен.

Внутри Docker-контейнера `tunad` не запускается, ставьте её на хост.

## Установка tunad

**Linux**

Пакет `tunad` лежит в том же репозитории, что и tuna. Подключите репозиторий по [инструкции по установке](https://tuna.am/docs/guides/install/install-cli.md#linux-manual) и установите пакет:

```shell
# Debian, Ubuntu
sudo apt install -y tunad

# RHEL, Fedora
sudo dnf install -y tunad

# SUSE, openSUSE
sudo zypper install -y tunad

```

Пакет сам включит и запустит службу `tunad.service`.

**macOS**

```shell
brew install yuccastream/tap/tunad
sudo tunad install

```

Управлять службой можно командами `sudo tunad status`, `sudo tunad restart` и `sudo tunad uninstall`. Логи лежат в `/var/log/tunad.out.log` и `/var/log/tunad.err.log`.

**Windows**

Скачайте установщик [tunad_x64.msi](https://releases.tuna.am/tunad/latest/tunad_x64.msi) или, для ARM, [tunad_arm64.msi](https://releases.tuna.am/tunad/latest/tunad_arm64.msi) и запустите его. Установщик сам зарегистрирует службу.

## Подключение устройства

### С браузером

На рабочем компьютере выполните:

```shell
tuna mesh login

```

Команда откроет браузер со страницей подтверждения. Проверьте, что имя устройства, ОС и IP-адрес ваши, и нажмите **Подключить**. Если браузер не открылся, CLI напечатает ссылку. На подтверждение есть 10 минут.

После подтверждения браузер возвращает результат в CLI по адресу `127.0.0.1`, поэтому браузер должен быть открыт на том же компьютере. Для удалённого сервера, к которому вы подключены по SSH, используйте [токен подключения](#enroll).

![Страница «Подключение устройства к mesh»: ОС, среда запуска, окружение, IP инициатора и кнопки «Подключить» и «Отклонить»](/docs/img/mesh/authorize.webp)

> **Warning.** Устройство попадёт в ту команду, которая сейчас выбрана в личном кабинете. Если вы состоите в нескольких командах, переключитесь на нужную в боковой панели до подтверждения.

После подтверждения подключите устройство к сети:

```shell
tuna mesh up

```

### Сервер без браузера

Для серверов, виртуальных машин и CI используйте токен подключения:

1. В кабинете откройте **Mesh → Токены подключения** и нажмите **Создать токен**.
2. Выберите срок действия, от 1 часа до 1 дня, и число активаций, от 1 до 10. Одним токеном можно подключить несколько серверов.
3. Скопируйте токен: он показывается один раз.

![Форма «Новый токен подключения»: срок действия и количество активаций](/docs/img/mesh/token-form.webp)

На сервере выполните:

```shell
tuna mesh enroll <токен>
tuna mesh up

```

Токен можно передать и через переменную окружения `TUNA_MESH_ENROLL_TOKEN`. После срока действия токен перестаёт работать, даже если активации остались. Устройства, подключённые по токену, принадлежат тому, кто его создал.

### Метка окружения

При подключении устройству можно задать метку окружения, например `production` или `staging`:

```shell
tuna mesh enroll <токен> --env=production

```

Вместо флага подойдёт переменная `TUNA_MESH_ENV`, без неё метка — `default`. Метка видна в списке устройств, администратор команды может её поменять. Пока это только подпись для удобства, на доступ она не влияет.

## Адреса и имена

Каждое устройство получает адрес IPv4 из диапазона `100.100.0.0/16` и парный адрес IPv6 из `fd74:756e:6100:100::/64`. Адрес закреплён за устройством и не меняется при переподключении. Диапазон одинаковый у всех команд, но сети команд изолированы друг от друга.

Имя устройства — его hostname в зоне `.tuna`, например `office-gw.tuna`. Если имя занято, сервер добавит суффикс: `laptop-1`, `laptop-2`. Переименовать устройство из кабинета нельзя: чтобы сменить имя, поменяйте hostname и подключите устройство заново.

Имена работают в любых программах:

```shell
ssh ubuntu@office-gw.tuna
psql -h prod-db-1.tuna -U app
curl http://k8s-worker-3.tuna:8080/healthz

```

tunad настраивает DNS только для зоны `.tuna`, остальные запросы идут через ваш обычный DNS-сервер.

## Статус и диагностика

| Команда                                 | Что показывает                                                                                           |
| --------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| `tuna mesh status`                      | состояние сети, имя и адреса устройства, транспорт, точку выхода, раздаваемые и полученные подсети       |
| `tuna mesh ip`                          | адреса устройства, `-4` или `-6` — только один                                                           |
| `tuna mesh peers`                       | устройства команды и их состояние                                                                        |
| `tuna mesh trace <устройство>`          | путь до устройства и задержку                                                                            |
| `tuna mesh debug trace <откуда> <куда>` | пропустят ли [правила доступа](https://tuna.am/docs/mesh/acl.md#check) соединение, без реального трафика |

Для скриптов у `status`, `peers` и `debug trace` есть флаг `--json`.

После перезагрузки служба tunad сама поднимает сеть с теми же настройками, если она была включена.

## Отключение

Команда `tuna mesh down` отключает устройство от сети, но оставляет его в команде: снова подключиться можно командой `tuna mesh up`.

Команда `tuna mesh logout` отключает устройство, отзывает его и удаляет ключи с компьютера. После этого устройство можно подключить заново, в том числе под другим пользователем.

Отозвать устройство можно и в кабинете: **Mesh → Мои устройства → Отозвать**. Сессия обрывается сразу. Администратор команды может отозвать любое устройство в разделе [Команда → Устройства](https://tuna.am/docs/mesh/team.md#devices).

## Тарифы

| Тариф   | Устройств на участника | Точки выхода и подсети     | Свои правила доступа |
| ------- | ---------------------- | -------------------------- | -------------------- |
| Новичок | 5                      | только пользоваться чужими | нет                  |
| Профи   | 10                     | раздавать и пользоваться   | нет                  |
| Легенда | 100                    | раздавать и пользоваться   | до 100 правил        |

Отозванные устройства в лимит не входят.

Без своих правил доступа устройства одного пользователя видят друг друга, а устройства разных участников — нет. Чтобы коллеги могли подключаться к устройствам друг друга, нужен тариф «Легенда» и [разрешающее правило](https://tuna.am/docs/mesh/acl.md).

## Ограничения беты

* Точку выхода выбирают вручную, автоматического выбора нет.
* Раздавать точку выхода и одновременно выходить через другое устройство нельзя.
* Если запустить `tuna mesh up` без флагов `--advertise-*`, ранее объявленные точка выхода и подсети снимаются. Повторяйте флаги при каждом запуске.
* Службой tunad на компьютере пользуется один пользователь ОС — тот, кто первым подключил устройство. Другой пользователь получит отказ, пока первый не выполнит `tuna mesh logout`.
* Если клонировать виртуальную машину, переустановить ОС или заменить материнскую плату, устройство нужно подключить заново.
* Сертификат устройства действует 7 дней и продлевается сам, пока устройство включено. Если устройство было выключено дольше, подключите его заново командой `tuna mesh login` или `tuna mesh enroll`. Подсказка `tuna mesh down && tuna mesh up` в выводе `tuna mesh status` в этом случае не поможет.
* Адреса mesh `100.100.0.0/16` входят в диапазон, который использует Tailscale. Если на устройстве работают оба, маршруты могут пересечься.
