# Установка Nebula 1.10.3 на Ubuntu

Nebula — оверлейная mesh-VPN от Slack с собственным CA и P2P-соединениями через lighthouse-узлы.

> **Порядок важен.** Сертификаты выпускаются один раз на CA-хосте и раздаются вручную на каждый узел. Установка бинарника и systemd-юнита одинакова что для lighthouse, что для обычного узла — разница только в `config.yml`.

---

## 1. Каталоги

```bash
sudo mkdir -p /etc/nebula

```

Бинарник будет лежать в `/usr/local/bin`, конфиг и сертификаты — в `/etc/nebula`.

---

## 2. Скачивание бинарников (v1.10.3)

```bash
curl -LO https://github.com/slackhq/nebula/releases/download/v1.10.3/nebula-linux-amd64.tar.gz

```

Распаковка и установка:

```bash
sudo tar -xzf nebula-linux-amd64.tar.gz -C /usr/local/bin nebula nebula-cert && sudo chmod +x /usr/local/bin/nebula /usr/local/bin/nebula-cert && rm nebula-linux-amd64.tar.gz

```

Проверка версии:

```bash
nebula -version

```

Ожидается что-то вроде `Version: 1.10.3`.

> Для ARM-серверов (например, Oracle Ampere) вместо `linux-amd64` берите `linux-arm64` — архитектуру проверяйте через `uname -m`.

---

## 3. Сертификаты

### На CA-хосте (выполняется один раз для всей сети)

Если CA ещё не создан:

```bash
sudo nebula-cert ca -name "Ваша Организация"

```

Создаст `ca.crt` и `ca.key` в текущей директории. **`ca.key` не копируется на узлы** — он остаётся только там, где будут выпускаться новые сертификаты.

Выпуск сертификата под конкретный узел (пример для lighthouse с IP `192.168.100.1` во внутренней nebula-сети `/24`):

```bash
sudo nebula-cert sign -name "lighthouse1" -ip "192.168.100.1/24"

```

Для обычного узла — аналогично, со своим именем и IP из той же подсети:

```bash
sudo nebula-cert sign -name "node1" -ip "192.168.100.2/24"

```

### На каждом узле

Копируем на сервер (через `scp` с локальной машины или из CA-хоста) три файла в `/etc/nebula`:

- `ca.crt`
- `<имя_узла>.crt`
- `<имя_узла>.key`

```bash
sudo mv ca.crt node1.crt node1.key /etc/nebula/ && sudo chmod 600 /etc/nebula/*.key

```

---

## 4. Конфигурация

Берём образец конфига из репозитория как основу:

```bash
curl -Lo /tmp/config.yml https://raw.githubusercontent.com/slackhq/nebula/v1.10.3/examples/config.yml

```

```bash
sudo cp /tmp/config.yml /etc/nebula/config.yml && sudo nano /etc/nebula/config.yml

```

Ключевые параметры, которые нужно поправить:

```yaml
pki:
  ca: /etc/nebula/ca.crt
  cert: /etc/nebula/node1.crt
  key: /etc/nebula/node1.key

static_host_map:
  "192.168.100.1": ["ПУБЛИЧНЫЙ_IP_LIGHTHOUSE:4242"]

lighthouse:
  am_lighthouse: false      # true только на самом lighthouse
  hosts:
    - "192.168.100.1"

listen:
  host: 0.0.0.0
  port: 4242

```

На самом lighthouse-узле: `am_lighthouse: true`, а `lighthouse.hosts` оставляем пустым (он сам себе lighthouse).

---

## 5. Файрвол

Lighthouse должен принимать UDP на порту nebula (по умолчанию `4242`) из интернета:

```bash
sudo ufw allow 4242/udp

```

На обычных узлах отдельно открывать этот порт снаружи не обязательно, если исходящий трафик уже разрешён — соединение инициируется изнутри mesh-сети.

---

## 6. systemd-юнит

```bash
curl -Lo /tmp/nebula.service https://raw.githubusercontent.com/slackhq/nebula/v1.10.3/examples/service_scripts/nebula.service

```

```bash
sudo cp /tmp/nebula.service /etc/systemd/system/nebula.service

```

Проверяем, что пути в юните совпадают с реальными (`ExecStart=/usr/local/bin/nebula -config /etc/nebula/config.yml`):

```bash
cat /etc/systemd/system/nebula.service

```

> В типовом юните нет ожидания сети при загрузке — при использовании FQDN в `static_host_map` возможны обрывы после ребута, если DNS ещё не поднялся. Если lighthouse указан по IP (как в примере выше), проблема не актуальна.

Запуск:

```bash
sudo systemctl daemon-reload && sudo systemctl enable --now nebula

```

---

## 7. Проверка

Статус сервиса:

```bash
sudo systemctl status nebula

```

Появился ли туннельный интерфейс (обычно `nebula1`):

```bash
ip addr show nebula1

```

Пинг lighthouse по внутреннему nebula-адресу:

```bash
ping -c 3 192.168.100.1

```

Логи в реальном времени, если что-то не так:

```bash
sudo journalctl -u nebula -f

```

---

## Замечания

- `ca.key` храните отдельно от серверов сети — компрометация этого файла позволяет выпускать сертификаты для входа в mesh под видом любого узла.
- Сертификаты имеют срок действия (по умолчанию у `nebula-cert sign` — 1 год); истечение приводит к тихому разрыву соединения без явной ошибки в логах на стороне соединяющегося узла — стоит следить за `sudo nebula-cert print -path /etc/nebula/node1.crt` на предмет `details.notAfter`.
- Полный список опций конфига и changelog версии — в [релизах на GitHub](https://github.com/slackhq/nebula/releases/tag/v1.10.3).