# DMVPN - Dynamic Multipoint VPN в VyOS

> Настройка DMVPN в VyOS - динамический mesh VPN с NHRP, mGRE, IPsec, hub-and-spoke и spoke-to-spoke туннели для облачных сред

Source: https://opennix.org/docs/vyos/vpn/vyos-dmvpn/


DMVPN (Dynamic Multipoint VPN) - технология создания динамических mesh VPN сетей с автоматическим установлением туннелей между spoke узлами без необходимости предварительной конфигурации всех возможных соединений.

## Обзор

DMVPN объединяет три ключевые технологии для создания масштабируемых и гибких VPN сетей:

1. **NHRP (Next Hop Resolution Protocol)** - RFC 2332
   - Протокол динамического разрешения адресов для NBMA сетей
   - Позволяет spoke узлам находить друг друга для прямых туннелей
   - Регистрация и запросы адресов через NHS (Next Hop Server)

2. **mGRE (Multipoint GRE)** - RFC 1702
   - Multipoint Generic Routing Encapsulation
   - Один туннельный интерфейс для множества удаленных peer
   - Динамическое создание туннелей без предварительной конфигурации

3. **IPsec** - RFC 4301
   - Шифрование и аутентификация GRE трафика
   - Защита данных в туннелях
   - IKE для обмена ключами

### Ключевые возможности

- **Динамические туннели**: Spoke узлы автоматически создают прямые туннели между собой
- **Масштабируемость**: Добавление новых spoke без изменения конфигурации существующих
- **Spoke-to-Spoke**: Прямые туннели между spoke без транзита через hub
- **Отказоустойчивость**: Поддержка нескольких hub для redundancy
- **Простая конфигурация**: Минимальная настройка на spoke узлах
- **Динамическая маршрутизация**: Интеграция с BGP/EIGRP/OSPF

### Архитектура

```
                  ┌─────────────┐
                  │   Hub (NHS) │
                  │ 203.0.113.1 │
                  └──────┬──────┘
                         │
        ┌────────────────┼────────────────┐
        │                │                │
   ┌────▼────┐      ┌────▼────┐     ┌────▼────┐
   │ Spoke 1 │      │ Spoke 2 │     │ Spoke 3 │
   │  .10    │◄────►│  .20    │◄───►│  .30    │
   └─────────┘      └─────────┘     └─────────┘

   Spoke-to-Spoke туннели создаются автоматически
```

**Преимущества перед традиционным VPN**:
- Не требуется N×(N-1)/2 туннелей для full mesh
- Hub масштабируется до сотен spoke
- Spoke добавляются без изменения конфигурации hub
- Автоматическая оптимизация маршрутов (spoke-to-spoke)

## Компоненты DMVPN

### Hub (NHS - Next Hop Server)

**Функции**:
- Центральная точка регистрации для spoke узлов
- База данных NHRP mapping (tunnel IP ↔ NBMA IP)
- Обработка NHRP resolution requests
- Отправка redirect для spoke-to-spoke tunnels
- Маршрутизация трафика между spoke (до создания direct tunnel)

**Требования**:
- Статический публичный IP адрес
- Всегда доступен для spoke узлов
- Должен принимать NHRP registrations

### Spoke

**Функции**:
- Регистрация своего tunnel IP ↔ NBMA IP mapping на NHS
- NHRP resolution requests для поиска других spoke
- Создание динамических spoke-to-spoke туннелей
- Обработка NHRP redirect от hub

**Требования**:
- Может иметь динамический публичный IP
- Должен достигать hub через интернет
- Инициирует NHRP регистрацию и IPsec соединения

## Фазы DMVPN

VyOS поддерживает DMVPN Phase 2 и Phase 3 функциональность:

### Phase 2 - Spoke-to-Spoke on Demand

**Характеристики**:
- Spoke имеют специфичные маршруты для сетей за другими spoke
- Hub может инициировать NHRP redirect
- Spoke создают direct tunnel после redirect от hub
- Требуется summarization на hub для маршрутов

**Конфигурация на Hub**:
- `set protocols nhrp tunnel tun0 redirect`

**Конфигурация на Spoke**:
- `set protocols nhrp tunnel tun0 shortcut`

### Phase 3 - Spoke-to-Spoke with Summarization

**Характеристики**:
- Spoke используют default или summary маршруты
- NHRP redirect работает с summarized routes
- Более масштабируемо (меньше маршрутов)
- Автоматическое создание spoke-to-spoke после первого пакета

**Отличия от Phase 2**:
- На spoke один summary маршрут вместо множества специфичных
- Hub анонсирует summary/default route
- Redirect работает без необходимости специфичных маршрутов

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

### Базовая конфигурация Hub

```bash
# Tunnel интерфейс
set interfaces tunnel tun0 address '10.255.0.1/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '203.0.113.1'
set interfaces tunnel tun0 parameters ip key '1'

# NHRP на Hub
set protocols nhrp tunnel tun0 cisco-authentication 'SecretNHRP123'
set protocols nhrp tunnel tun0 holding-time '300'
set protocols nhrp tunnel tun0 multicast 'dynamic'
set protocols nhrp tunnel tun0 redirect

# Разрешить GRE на firewall
set firewall ipv4 input filter rule 200 action 'accept'
set firewall ipv4 input filter rule 200 protocol 'gre'
set firewall ipv4 input filter rule 200 description 'Allow GRE for DMVPN'

# Разрешить IPsec
set firewall ipv4 input filter rule 210 action 'accept'
set firewall ipv4 input filter rule 210 protocol 'esp'
set firewall ipv4 input filter rule 210 description 'Allow ESP for IPsec'

set firewall ipv4 input filter rule 211 action 'accept'
set firewall ipv4 input filter rule 211 destination port '500'
set firewall ipv4 input filter rule 211 protocol 'udp'
set firewall ipv4 input filter rule 211 description 'Allow ISAKMP'

set firewall ipv4 input filter rule 212 action 'accept'
set firewall ipv4 input filter rule 212 destination port '4500'
set firewall ipv4 input filter rule 212 protocol 'udp'
set firewall ipv4 input filter rule 212 description 'Allow NAT-T'

commit
save
```

### Параметры NHRP на Hub

#### cisco-authentication

NHRP authentication password (максимум 8 символов):

```bash
set protocols nhrp tunnel tun0 cisco-authentication 'MySecret1'
```

**Важно**: Пароль должен совпадать на hub и всех spoke.

#### holding-time

Время жизни NHRP registration entry (в секундах):

```bash
set protocols nhrp tunnel tun0 holding-time '300'
```

По умолчанию: 600 секунд. Spoke должны re-register до истечения.

#### multicast

Обработка multicast трафика:

```bash
set protocols nhrp tunnel tun0 multicast 'dynamic'
```

Опции:
- **dynamic**: Автоматическая репликация multicast к зарегистрированным spoke
- **nhs**: Отправка multicast только к NHS (для spoke)
- Не указывать: Multicast не обрабатывается

Необходимо для динамической маршрутизации (OSPF/EIGRP) через DMVPN.

#### redirect

Отправка NHRP redirect spoke узлам для создания direct tunnels:

```bash
set protocols nhrp tunnel tun0 redirect
```

Включает DMVPN Phase 2/3 функциональность.

### Параметры Tunnel интерфейса на Hub

#### address

IP адрес в DMVPN сети (host address с prefix):

```bash
set interfaces tunnel tun0 address '10.255.0.1/24'
```

Рекомендуется использовать приватные сети (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16).

#### encapsulation

Тип инкапсуляции (для DMVPN используется GRE):

```bash
set interfaces tunnel tun0 encapsulation 'gre'
```

Для DMVPN всегда GRE (multipoint).

#### multicast enable

Включить multicast на туннеле:

```bash
set interfaces tunnel tun0 multicast 'enable'
```

Необходимо для NHRP multicast replication и динамической маршрутизации.

#### source-address

Локальный IP адрес для туннеля (NBMA address):

```bash
set interfaces tunnel tun0 source-address '203.0.113.1'
```

Должен быть публичным IP или IP на WAN интерфейсе.

#### parameters ip key

GRE key для идентификации туннеля:

```bash
set interfaces tunnel tun0 parameters ip key '1'
```

Должен совпадать на hub и всех spoke. Значение: 0-4294967295.

#### mtu

Максимальный размер пакета в туннеле:

```bash
set interfaces tunnel tun0 mtu '1400'
```

По умолчанию: 1476 (1500 - 24 байт GRE header). Уменьшите если есть IPsec (до 1400).

#### description

Описание интерфейса:

```bash
set interfaces tunnel tun0 description 'DMVPN Hub to Spoke Network'
```

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

### Базовая конфигурация Spoke

```bash
# Tunnel интерфейс
set interfaces tunnel tun0 address '10.255.0.10/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '198.51.100.10'
set interfaces tunnel tun0 parameters ip key '1'

# NHRP на Spoke
set protocols nhrp tunnel tun0 cisco-authentication 'SecretNHRP123'
set protocols nhrp tunnel tun0 map '10.255.0.1/24' nbma-address '203.0.113.1'
set protocols nhrp tunnel tun0 map '10.255.0.1/24' register
set protocols nhrp tunnel tun0 nhs '10.255.0.1'
set protocols nhrp tunnel tun0 shortcut
set protocols nhrp tunnel tun0 multicast 'nhs'

# Firewall (аналогично hub)
set firewall ipv4 input filter rule 200 action 'accept'
set firewall ipv4 input filter rule 200 protocol 'gre'

set firewall ipv4 input filter rule 210 action 'accept'
set firewall ipv4 input filter rule 210 protocol 'esp'

set firewall ipv4 input filter rule 211 action 'accept'
set firewall ipv4 input filter rule 211 destination port '500'
set firewall ipv4 input filter rule 211 protocol 'udp'

set firewall ipv4 input filter rule 212 action 'accept'
set firewall ipv4 input filter rule 212 destination port '4500'
set firewall ipv4 input filter rule 212 protocol 'udp'

commit
save
```

### Параметры NHRP на Spoke

#### nhs

Адрес Next Hop Server (Hub tunnel IP):

```bash
set protocols nhrp tunnel tun0 nhs '10.255.0.1'
```

Можно указать несколько NHS для redundancy:

```bash
set protocols nhrp tunnel tun0 nhs '10.255.0.1'
set protocols nhrp tunnel tun0 nhs '10.255.0.2'
```

#### map

Статический NHRP mapping (tunnel IP → NBMA IP):

```bash
set protocols nhrp tunnel tun0 map '10.255.0.1/32' nbma-address '203.0.113.1'
```

**Назначение**: Указывает spoke как достичь hub до установления NHRP.

**Опции map**:
- **register**: Автоматическая регистрация spoke на NHS

```bash
set protocols nhrp tunnel tun0 map '10.255.0.1/24' register
```

#### shortcut

Разрешить создание spoke-to-spoke shortcuts:

```bash
set protocols nhrp tunnel tun0 shortcut
```

Включает DMVPN Phase 2/3 - spoke будут создавать прямые туннели после redirect от hub.

#### multicast nhs

Отправка multicast трафика к NHS:

```bash
set protocols nhrp tunnel tun0 multicast 'nhs'
```

Необходимо для динамической маршрутизации на spoke (OSPF/EIGRP).

### Параметры Tunnel интерфейса на Spoke

Аналогичны hub с отличиями:

```bash
# Уникальный tunnel IP для каждого spoke
set interfaces tunnel tun0 address '10.255.0.10/24'  # Spoke 1
set interfaces tunnel tun0 address '10.255.0.20/24'  # Spoke 2
set interfaces tunnel tun0 address '10.255.0.30/24'  # Spoke 3

# source-address - локальный публичный IP spoke
set interfaces tunnel tun0 source-address '198.51.100.10'

# Остальные параметры идентичны hub
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 parameters ip key '1'
```

## IPsec интеграция

DMVPN обычно комбинируется с IPsec для шифрования GRE трафика.

### IPsec профиль для DMVPN

VyOS использует IPsec профили привязанные к туннельным интерфейсам:

```bash
# IPsec профиль
set vpn ipsec profile DMVPN-PROFILE authentication mode 'pre-shared-secret'
set vpn ipsec profile DMVPN-PROFILE authentication pre-shared-secret 'MyIPsecSecret123'
set vpn ipsec profile DMVPN-PROFILE bind tunnel 'tun0'
set vpn ipsec profile DMVPN-PROFILE esp-group 'DMVPN-ESP'
set vpn ipsec profile DMVPN-PROFILE ike-group 'DMVPN-IKE'

# ESP группа (шифрование)
set vpn ipsec esp-group DMVPN-ESP lifetime '3600'
set vpn ipsec esp-group DMVPN-ESP mode 'transport'
set vpn ipsec esp-group DMVPN-ESP pfs 'dh-group2'
set vpn ipsec esp-group DMVPN-ESP proposal 1 encryption 'aes256'
set vpn ipsec esp-group DMVPN-ESP proposal 1 hash 'sha256'

# IKE группа (key exchange)
set vpn ipsec ike-group DMVPN-IKE ikev2-reauth
set vpn ipsec ike-group DMVPN-IKE key-exchange 'ikev2'
set vpn ipsec ike-group DMVPN-IKE lifetime '28800'
set vpn ipsec ike-group DMVPN-IKE proposal 1 dh-group '14'
set vpn ipsec ike-group DMVPN-IKE proposal 1 encryption 'aes256'
set vpn ipsec ike-group DMVPN-IKE proposal 1 hash 'sha256'

commit
save
```

### Параметры IPsec

#### ESP Group (Encryption)

**mode transport**:
```bash
set vpn ipsec esp-group DMVPN-ESP mode 'transport'
```

Для DMVPN всегда используется transport mode (IPsec шифрует GRE, а не создает свой туннель).

**encryption**:
```bash
set vpn ipsec esp-group DMVPN-ESP proposal 1 encryption 'aes256'
```

Рекомендуемые: aes256, aes128, aes256gcm128

**hash**:
```bash
set vpn ipsec esp-group DMVPN-ESP proposal 1 hash 'sha256'
```

Рекомендуемые: sha256, sha384, sha512

**PFS (Perfect Forward Secrecy)**:
```bash
set vpn ipsec esp-group DMVPN-ESP pfs 'dh-group14'
```

Опции: dh-group2, dh-group5, dh-group14, dh-group19, dh-group20

#### IKE Group (Key Exchange)

**IKEv2**:
```bash
set vpn ipsec ike-group DMVPN-IKE key-exchange 'ikev2'
```

IKEv2 рекомендуется для DMVPN (лучше для NAT traversal, быстрее reconnect).

**DH Group**:
```bash
set vpn ipsec ike-group DMVPN-IKE proposal 1 dh-group '14'
```

Минимум group 14 (2048-bit) для безопасности.

**Dead Peer Detection**:
```bash
set vpn ipsec ike-group DMVPN-IKE dead-peer-detection action 'restart'
set vpn ipsec ike-group DMVPN-IKE dead-peer-detection interval '30'
set vpn ipsec ike-group DMVPN-IKE dead-peer-detection timeout '120'
```

Автоматическое восстановление при обрыве туннеля.

### Привязка профиля к туннелю

IPsec профиль автоматически применяется к туннелю:

```bash
set vpn ipsec profile DMVPN-PROFILE bind tunnel 'tun0'
```

После commit все GRE пакеты через tun0 автоматически шифруются IPsec.

## Network ID

Network ID группирует DMVPN туннели в логические сети:

```bash
set protocols nhrp tunnel tun0 network-id '1'
```

**Применение**:
- Изоляция разных DMVPN сетей на одном роутере
- Несколько DMVPN туннелей с разными network-id
- Spoke регистрируется только на NHS с matching network-id

**Пример с несколькими network-id**:

```bash
# Туннель для production
set interfaces tunnel tun0 ...
set protocols nhrp tunnel tun0 network-id '1'

# Туннель для development
set interfaces tunnel tun1 ...
set protocols nhrp tunnel tun1 network-id '2'
```

## Динамическая маршрутизация с DMVPN

DMVPN обычно комбинируется с протоколами динамической маршрутизации для автоматического обмена маршрутами.

### BGP через DMVPN

BGP наиболее популярен для DMVPN сетей (особенно service provider).

**Конфигурация Hub**:

```bash
# BGP на Hub
set protocols bgp system-as '65000'
set protocols bgp parameters router-id '10.255.0.1'

# Spoke 1
set protocols bgp neighbor '10.255.0.10' remote-as '65001'
set protocols bgp neighbor '10.255.0.10' address-family ipv4-unicast

# Spoke 2
set protocols bgp neighbor '10.255.0.20' remote-as '65002'
set protocols bgp neighbor '10.255.0.20' address-family ipv4-unicast

# Spoke 3
set protocols bgp neighbor '10.255.0.30' remote-as '65003'
set protocols bgp neighbor '10.255.0.30' address-family ipv4-unicast

# Анонсирование сетей
set protocols bgp address-family ipv4-unicast network '192.168.0.0/24'
```

**Конфигурация Spoke**:

```bash
# BGP на Spoke 1
set protocols bgp system-as '65001'
set protocols bgp parameters router-id '10.255.0.10'

# Neighbor - Hub
set protocols bgp neighbor '10.255.0.1' remote-as '65000'
set protocols bgp neighbor '10.255.0.1' address-family ipv4-unicast

# Анонсирование локальной сети
set protocols bgp address-family ipv4-unicast network '192.168.1.0/24'
```

**Преимущества BGP**:
- Масштабируемость (сотни spoke)
- Гибкая политика маршрутизации
- Next-hop self на hub для spoke-to-spoke
- Поддержка атрибутов (communities, AS-path)

### OSPF через DMVPN

OSPF требует broadcast/multicast, DMVPN поддерживает через NHRP multicast.

**Конфигурация Hub**:

```bash
set interfaces tunnel tun0 ip ospf network 'broadcast'
set interfaces tunnel tun0 ip ospf priority '255'

set protocols ospf area '0' network '10.255.0.0/24'
set protocols ospf area '0' network '192.168.0.0/24'
set protocols ospf parameters router-id '10.255.0.1'
```

**Конфигурация Spoke**:

```bash
set interfaces tunnel tun0 ip ospf network 'broadcast'
set interfaces tunnel tun0 ip ospf priority '0'

set protocols ospf area '0' network '10.255.0.0/24'
set protocols ospf area '0' network '192.168.1.0/24'
set protocols ospf parameters router-id '10.255.0.10'
```

**Важно**:
- Hub должен быть DR (priority 255)
- Spoke - DROther (priority 0)
- NHRP multicast dynamic на hub
- NHRP multicast nhs на spoke

### EIGRP через DMVPN

EIGRP хорошо подходит для DMVPN (особенно в Cisco-compatible окружении).

**Примечание**: VyOS использует FRR, который не поддерживает EIGRP напрямую. Для EIGRP используйте BGP или OSPF.

## Dual-Hub Redundancy

Для критичных сетей настраивается несколько hub для отказоустойчивости.

### Топология Dual-Hub

```
         ┌─────────────┐        ┌─────────────┐
         │   Hub 1     │        │   Hub 2     │
         │ 203.0.113.1 │        │ 203.0.113.2 │
         │ 10.255.0.1  │        │ 10.255.0.2  │
         └──────┬──────┘        └──────┬──────┘
                │                      │
       ┌────────┼──────────────────────┼────────┐
       │        │                      │        │
  ┌────▼────┐  │                      │   ┌────▼────┐
  │ Spoke 1 │  │                      │   │ Spoke 3 │
  │  .10    │  │                      │   │  .30    │
  └─────────┘  │                      │   └─────────┘
               │                      │
          ┌────▼────┐                 │
          │ Spoke 2 │                 │
          │  .20    │◄────────────────┘
          └─────────┘
```

### Конфигурация Hub 1

```bash
# Tunnel tun0
set interfaces tunnel tun0 address '10.255.0.1/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '203.0.113.1'
set interfaces tunnel tun0 parameters ip key '1'

# NHRP Hub 1
set protocols nhrp tunnel tun0 cisco-authentication 'SecretNHRP123'
set protocols nhrp tunnel tun0 holding-time '300'
set protocols nhrp tunnel tun0 multicast 'dynamic'
set protocols nhrp tunnel tun0 redirect

# IPsec
set vpn ipsec profile DMVPN-PROFILE authentication mode 'pre-shared-secret'
set vpn ipsec profile DMVPN-PROFILE authentication pre-shared-secret 'MyIPsecSecret123'
set vpn ipsec profile DMVPN-PROFILE bind tunnel 'tun0'
set vpn ipsec profile DMVPN-PROFILE esp-group 'DMVPN-ESP'
set vpn ipsec profile DMVPN-PROFILE ike-group 'DMVPN-IKE'

# BGP для dual-hub
set protocols bgp system-as '65000'
set protocols bgp parameters router-id '10.255.0.1'
set protocols bgp neighbor '10.255.0.2' remote-as '65000'  # Hub 2 iBGP
set protocols bgp neighbor '10.255.0.2' address-family ipv4-unicast

commit
save
```

### Конфигурация Hub 2

Аналогично Hub 1 с изменением адресов:

```bash
set interfaces tunnel tun0 address '10.255.0.2/24'
set interfaces tunnel tun0 source-address '203.0.113.2'

set protocols bgp parameters router-id '10.255.0.2'
set protocols bgp neighbor '10.255.0.1' remote-as '65000'  # Hub 1 iBGP
```

### Конфигурация Spoke для Dual-Hub

Spoke конфигурируется с двумя NHS:

```bash
# Tunnel
set interfaces tunnel tun0 address '10.255.0.10/24'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '198.51.100.10'
set interfaces tunnel tun0 parameters ip key '1'

# NHRP с двумя NHS
set protocols nhrp tunnel tun0 cisco-authentication 'SecretNHRP123'
set protocols nhrp tunnel tun0 shortcut
set protocols nhrp tunnel tun0 multicast 'nhs'

# Hub 1
set protocols nhrp tunnel tun0 map '10.255.0.1/32' nbma-address '203.0.113.1'
set protocols nhrp tunnel tun0 map '10.255.0.1/32' register
set protocols nhrp tunnel tun0 nhs '10.255.0.1'

# Hub 2
set protocols nhrp tunnel tun0 map '10.255.0.2/32' nbma-address '203.0.113.2'
set protocols nhrp tunnel tun0 map '10.255.0.2/32' register
set protocols nhrp tunnel tun0 nhs '10.255.0.2'

# IPsec
set vpn ipsec profile DMVPN-PROFILE authentication mode 'pre-shared-secret'
set vpn ipsec profile DMVPN-PROFILE authentication pre-shared-secret 'MyIPsecSecret123'
set vpn ipsec profile DMVPN-PROFILE bind tunnel 'tun0'
set vpn ipsec profile DMVPN-PROFILE esp-group 'DMVPN-ESP'
set vpn ipsec profile DMVPN-PROFILE ike-group 'DMVPN-IKE'

# BGP к обоим hub
set protocols bgp system-as '65001'
set protocols bgp parameters router-id '10.255.0.10'
set protocols bgp neighbor '10.255.0.1' remote-as '65000'  # Hub 1
set protocols bgp neighbor '10.255.0.1' address-family ipv4-unicast
set protocols bgp neighbor '10.255.0.2' remote-as '65000'  # Hub 2
set protocols bgp neighbor '10.255.0.2' address-family ipv4-unicast

# Анонсирование локальной сети
set protocols bgp address-family ipv4-unicast network '192.168.1.0/24'

commit
save
```

**Failover**:
- Spoke регистрируется на обоих NHS
- BGP соседства с обоими hub
- При отказе Hub 1 - автоматическое переключение на Hub 2
- Spoke-to-spoke tunnels продолжают работать

## Практический пример: Yandex Cloud Service Provider Hub

### Сценарий

Service provider размещает DMVPN hub в Yandex Cloud для подключения множества клиентских филиалов.

**Топология**:
- Hub: VyOS в Yandex Cloud (публичный IP: 158.160.10.50)
- Spoke 1: Клиент A, офис Москва (динамический IP)
- Spoke 2: Клиент A, офис Санкт-Петербург (динамический IP)
- Spoke 3: Клиент B, офис Екатеринбург (статический IP: 95.163.20.100)

**Сети**:
- DMVPN tunnel: 10.100.0.0/24
- Hub: 10.100.0.1
- Клиент A, Москва: 10.100.0.10, LAN 192.168.10.0/24
- Клиент A, СПб: 10.100.0.11, LAN 192.168.11.0/24
- Клиент B, Екб: 10.100.0.20, LAN 192.168.20.0/24

### Конфигурация Hub в Yandex Cloud

```bash
# Tunnel интерфейс
set interfaces tunnel tun0 address '10.100.0.1/24'
set interfaces tunnel tun0 description 'DMVPN Hub for Service Provider'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '10.128.0.10'  # Внутренний IP VM в Yandex Cloud
set interfaces tunnel tun0 parameters ip key '100'
set interfaces tunnel tun0 mtu '1400'

# NHRP Hub конфигурация
set protocols nhrp tunnel tun0 cisco-authentication 'YC_DMVPN_2025'
set protocols nhrp tunnel tun0 holding-time '600'
set protocols nhrp tunnel tun0 multicast 'dynamic'
set protocols nhrp tunnel tun0 redirect
set protocols nhrp tunnel tun0 network-id '100'

# IPsec профиль
set vpn ipsec profile YC-DMVPN authentication mode 'pre-shared-secret'
set vpn ipsec profile YC-DMVPN authentication pre-shared-secret 'SuperSecretYC2025!'
set vpn ipsec profile YC-DMVPN bind tunnel 'tun0'
set vpn ipsec profile YC-DMVPN esp-group 'YC-ESP'
set vpn ipsec profile YC-DMVPN ike-group 'YC-IKE'

# ESP группа
set vpn ipsec esp-group YC-ESP lifetime '3600'
set vpn ipsec esp-group YC-ESP mode 'transport'
set vpn ipsec esp-group YC-ESP pfs 'dh-group14'
set vpn ipsec esp-group YC-ESP proposal 1 encryption 'aes256gcm128'
set vpn ipsec esp-group YC-ESP proposal 1 hash 'sha256'
set vpn ipsec esp-group YC-ESP proposal 2 encryption 'aes256'
set vpn ipsec esp-group YC-ESP proposal 2 hash 'sha256'

# IKE группа
set vpn ipsec ike-group YC-IKE ikev2-reauth
set vpn ipsec ike-group YC-IKE key-exchange 'ikev2'
set vpn ipsec ike-group YC-IKE lifetime '28800'
set vpn ipsec ike-group YC-IKE proposal 1 dh-group '14'
set vpn ipsec ike-group YC-IKE proposal 1 encryption 'aes256gcm128'
set vpn ipsec ike-group YC-IKE proposal 1 hash 'sha256'
set vpn ipsec ike-group YC-IKE proposal 2 dh-group '14'
set vpn ipsec ike-group YC-IKE proposal 2 encryption 'aes256'
set vpn ipsec ike-group YC-IKE proposal 2 hash 'sha256'
set vpn ipsec ike-group YC-IKE dead-peer-detection action 'restart'
set vpn ipsec ike-group YC-IKE dead-peer-detection interval '30'
set vpn ipsec ike-group YC-IKE dead-peer-detection timeout '120'

# BGP для маршрутизации (каждый клиент - свой AS)
set protocols bgp system-as '65500'
set protocols bgp parameters router-id '10.100.0.1'

# Клиент A spokes (iBGP внутри клиента A)
set protocols bgp neighbor '10.100.0.10' remote-as '65001'
set protocols bgp neighbor '10.100.0.10' description 'Client A - Moscow'
set protocols bgp neighbor '10.100.0.10' address-family ipv4-unicast

set protocols bgp neighbor '10.100.0.11' remote-as '65001'
set protocols bgp neighbor '10.100.0.11' description 'Client A - SPb'
set protocols bgp neighbor '10.100.0.11' address-family ipv4-unicast

# Клиент B spoke
set protocols bgp neighbor '10.100.0.20' remote-as '65002'
set protocols bgp neighbor '10.100.0.20' description 'Client B - Ekaterinburg'
set protocols bgp neighbor '10.100.0.20' address-family ipv4-unicast

# Анонсирование сетей в Yandex Cloud (если есть)
set protocols bgp address-family ipv4-unicast network '10.128.0.0/24'

# Firewall правила для DMVPN
set firewall ipv4 name WAN_LOCAL rule 100 action 'accept'
set firewall ipv4 name WAN_LOCAL rule 100 protocol 'gre'
set firewall ipv4 name WAN_LOCAL rule 100 description 'Allow GRE for DMVPN'

set firewall ipv4 name WAN_LOCAL rule 110 action 'accept'
set firewall ipv4 name WAN_LOCAL rule 110 protocol 'esp'
set firewall ipv4 name WAN_LOCAL rule 110 description 'Allow ESP for IPsec'

set firewall ipv4 name WAN_LOCAL rule 111 action 'accept'
set firewall ipv4 name WAN_LOCAL rule 111 destination port '500'
set firewall ipv4 name WAN_LOCAL rule 111 protocol 'udp'
set firewall ipv4 name WAN_LOCAL rule 111 description 'Allow ISAKMP'

set firewall ipv4 name WAN_LOCAL rule 112 action 'accept'
set firewall ipv4 name WAN_LOCAL rule 112 destination port '4500'
set firewall ipv4 name WAN_LOCAL rule 112 protocol 'udp'
set firewall ipv4 name WAN_LOCAL rule 112 description 'Allow NAT-T'

# Применение firewall к WAN интерфейсу
set firewall ipv4 input filter rule 1000 action 'jump'
set firewall ipv4 input filter rule 1000 jump-target 'WAN_LOCAL'
set firewall ipv4 input filter rule 1000 inbound-interface name 'eth0'

# Разрешить forward между spokes (для spoke-to-spoke)
set firewall ipv4 forward filter rule 200 action 'accept'
set firewall ipv4 forward filter rule 200 inbound-interface name 'tun0'
set firewall ipv4 forward filter rule 200 outbound-interface name 'tun0'

commit
save
```

### Конфигурация Spoke (Клиент A, Москва)

```bash
# Tunnel интерфейс
set interfaces tunnel tun0 address '10.100.0.10/24'
set interfaces tunnel tun0 description 'DMVPN to YC Hub - Client A Moscow'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '192.0.2.50'  # WAN IP spoke
set interfaces tunnel tun0 parameters ip key '100'
set interfaces tunnel tun0 mtu '1400'

# NHRP Spoke конфигурация
set protocols nhrp tunnel tun0 cisco-authentication 'YC_DMVPN_2025'
set protocols nhrp tunnel tun0 map '10.100.0.1/32' nbma-address '158.160.10.50'
set protocols nhrp tunnel tun0 map '10.100.0.1/32' register
set protocols nhrp tunnel tun0 nhs '10.100.0.1'
set protocols nhrp tunnel tun0 shortcut
set protocols nhrp tunnel tun0 multicast 'nhs'
set protocols nhrp tunnel tun0 network-id '100'

# IPsec профиль (идентичный hub)
set vpn ipsec profile YC-DMVPN authentication mode 'pre-shared-secret'
set vpn ipsec profile YC-DMVPN authentication pre-shared-secret 'SuperSecretYC2025!'
set vpn ipsec profile YC-DMVPN bind tunnel 'tun0'
set vpn ipsec profile YC-DMVPN esp-group 'YC-ESP'
set vpn ipsec profile YC-DMVPN ike-group 'YC-IKE'

set vpn ipsec esp-group YC-ESP lifetime '3600'
set vpn ipsec esp-group YC-ESP mode 'transport'
set vpn ipsec esp-group YC-ESP pfs 'dh-group14'
set vpn ipsec esp-group YC-ESP proposal 1 encryption 'aes256gcm128'
set vpn ipsec esp-group YC-ESP proposal 1 hash 'sha256'
set vpn ipsec esp-group YC-ESP proposal 2 encryption 'aes256'
set vpn ipsec esp-group YC-ESP proposal 2 hash 'sha256'

set vpn ipsec ike-group YC-IKE ikev2-reauth
set vpn ipsec ike-group YC-IKE key-exchange 'ikev2'
set vpn ipsec ike-group YC-IKE lifetime '28800'
set vpn ipsec ike-group YC-IKE proposal 1 dh-group '14'
set vpn ipsec ike-group YC-IKE proposal 1 encryption 'aes256gcm128'
set vpn ipsec ike-group YC-IKE proposal 1 hash 'sha256'
set vpn ipsec ike-group YC-IKE proposal 2 dh-group '14'
set vpn ipsec ike-group YC-IKE proposal 2 encryption 'aes256'
set vpn ipsec ike-group YC-IKE proposal 2 hash 'sha256'
set vpn ipsec ike-group YC-IKE dead-peer-detection action 'restart'
set vpn ipsec ike-group YC-IKE dead-peer-detection interval '30'
set vpn ipsec ike-group YC-IKE dead-peer-detection timeout '120'

# BGP
set protocols bgp system-as '65001'
set protocols bgp parameters router-id '10.100.0.10'

# Neighbor к Hub
set protocols bgp neighbor '10.100.0.1' remote-as '65500'
set protocols bgp neighbor '10.100.0.1' description 'YC Hub'
set protocols bgp neighbor '10.100.0.1' address-family ipv4-unicast

# iBGP к другому spoke клиента A (СПб)
set protocols bgp neighbor '10.100.0.11' remote-as '65001'
set protocols bgp neighbor '10.100.0.11' description 'Client A - SPb'
set protocols bgp neighbor '10.100.0.11' address-family ipv4-unicast

# Анонсирование локальной сети
set protocols bgp address-family ipv4-unicast network '192.168.10.0/24'

# Firewall
set firewall ipv4 input filter rule 200 action 'accept'
set firewall ipv4 input filter rule 200 protocol 'gre'

set firewall ipv4 input filter rule 210 action 'accept'
set firewall ipv4 input filter rule 210 protocol 'esp'

set firewall ipv4 input filter rule 211 action 'accept'
set firewall ipv4 input filter rule 211 destination port '500'
set firewall ipv4 input filter rule 211 protocol 'udp'

set firewall ipv4 input filter rule 212 action 'accept'
set firewall ipv4 input filter rule 212 destination port '4500'
set firewall ipv4 input filter rule 212 protocol 'udp'

commit
save
```

### Проверка подключения

На Hub:

```bash
# Показать NHRP cache (registered spokes)
show ip nhrp cache

# Показать NHS статус
show ip nhrp nhs

# Показать IPsec SA
show vpn ipsec sa

# Показать BGP neighbors
show ip bgp summary

# Показать BGP routes
show ip bgp
```

На Spoke:

```bash
# Проверить NHRP registration
show ip nhrp cache

# Проверить NHS
show ip nhrp nhs

# Проверить shortcut туннели
show ip nhrp shortcut

# Проверить IPsec SA
show vpn ipsec sa

# Ping hub
ping 10.100.0.1 source-address 10.100.0.10

# Ping другой spoke (инициирует spoke-to-spoke)
ping 10.100.0.20 source-address 10.100.0.10

# Проверить BGP
show ip bgp summary
show ip route bgp
```

## Практический пример: VK Cloud Enterprise Branch Connectivity

### Сценарий

Enterprise размещает DMVPN hub в VK Cloud для подключения филиалов компании.

**Топология**:
- Hub: VyOS в VK Cloud (публичный IP: 95.142.100.200)
- Spoke 1: Филиал Казань (192.168.100.0/24)
- Spoke 2: Филиал Нижний Новгород (192.168.101.0/24)
- Spoke 3: Филиал Самара (192.168.102.0/24)

**DMVPN tunnel**: 172.16.0.0/24

### Конфигурация Hub в VK Cloud

```bash
# Tunnel интерфейс
set interfaces tunnel tun0 address '172.16.0.1/24'
set interfaces tunnel tun0 description 'VK Cloud DMVPN Hub for Enterprise'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '10.0.1.10'  # Внутренний IP VM в VK Cloud
set interfaces tunnel tun0 parameters ip key '200'
set interfaces tunnel tun0 mtu '1400'

# NHRP Hub
set protocols nhrp tunnel tun0 cisco-authentication 'VK_Ent_25'
set protocols nhrp tunnel tun0 holding-time '600'
set protocols nhrp tunnel tun0 multicast 'dynamic'
set protocols nhrp tunnel tun0 redirect

# IPsec
set vpn ipsec profile VK-ENTERPRISE authentication mode 'pre-shared-secret'
set vpn ipsec profile VK-ENTERPRISE authentication pre-shared-secret 'EnterpriseVK!2025'
set vpn ipsec profile VK-ENTERPRISE bind tunnel 'tun0'
set vpn ipsec profile VK-ENTERPRISE esp-group 'VK-ESP'
set vpn ipsec profile VK-ENTERPRISE ike-group 'VK-IKE'

set vpn ipsec esp-group VK-ESP lifetime '3600'
set vpn ipsec esp-group VK-ESP mode 'transport'
set vpn ipsec esp-group VK-ESP pfs 'dh-group19'
set vpn ipsec esp-group VK-ESP proposal 1 encryption 'aes256gcm128'
set vpn ipsec esp-group VK-ESP proposal 1 hash 'sha256'

set vpn ipsec ike-group VK-IKE ikev2-reauth
set vpn ipsec ike-group VK-IKE key-exchange 'ikev2'
set vpn ipsec ike-group VK-IKE lifetime '28800'
set vpn ipsec ike-group VK-IKE proposal 1 dh-group '19'
set vpn ipsec ike-group VK-IKE proposal 1 encryption 'aes256gcm128'
set vpn ipsec ike-group VK-IKE proposal 1 hash 'sha256'
set vpn ipsec ike-group VK-IKE dead-peer-detection action 'restart'
set vpn ipsec ike-group VK-IKE dead-peer-detection interval '30'
set vpn ipsec ike-group VK-IKE dead-peer-detection timeout '120'

# OSPF для маршрутизации между филиалами
set interfaces tunnel tun0 ip ospf network 'broadcast'
set interfaces tunnel tun0 ip ospf priority '255'

set protocols ospf area '0' network '172.16.0.0/24'
set protocols ospf area '0' network '10.0.1.0/24'
set protocols ospf parameters router-id '172.16.0.1'

# Firewall
set firewall ipv4 input filter rule 300 action 'accept'
set firewall ipv4 input filter rule 300 protocol 'gre'

set firewall ipv4 input filter rule 310 action 'accept'
set firewall ipv4 input filter rule 310 protocol 'esp'

set firewall ipv4 input filter rule 311 action 'accept'
set firewall ipv4 input filter rule 311 destination port '500'
set firewall ipv4 input filter rule 311 protocol 'udp'

set firewall ipv4 input filter rule 312 action 'accept'
set firewall ipv4 input filter rule 312 destination port '4500'
set firewall ipv4 input filter rule 312 protocol 'udp'

commit
save
```

### Конфигурация Spoke (Филиал Казань)

```bash
# Tunnel
set interfaces tunnel tun0 address '172.16.0.10/24'
set interfaces tunnel tun0 description 'DMVPN to VK Cloud Hub - Kazan Branch'
set interfaces tunnel tun0 encapsulation 'gre'
set interfaces tunnel tun0 multicast 'enable'
set interfaces tunnel tun0 source-address '93.80.50.100'  # WAN IP филиала
set interfaces tunnel tun0 parameters ip key '200'
set interfaces tunnel tun0 mtu '1400'

# NHRP
set protocols nhrp tunnel tun0 cisco-authentication 'VK_Ent_25'
set protocols nhrp tunnel tun0 map '172.16.0.1/32' nbma-address '95.142.100.200'
set protocols nhrp tunnel tun0 map '172.16.0.1/32' register
set protocols nhrp tunnel tun0 nhs '172.16.0.1'
set protocols nhrp tunnel tun0 shortcut
set protocols nhrp tunnel tun0 multicast 'nhs'

# IPsec (идентичный hub)
set vpn ipsec profile VK-ENTERPRISE authentication mode 'pre-shared-secret'
set vpn ipsec profile VK-ENTERPRISE authentication pre-shared-secret 'EnterpriseVK!2025'
set vpn ipsec profile VK-ENTERPRISE bind tunnel 'tun0'
set vpn ipsec profile VK-ENTERPRISE esp-group 'VK-ESP'
set vpn ipsec profile VK-ENTERPRISE ike-group 'VK-IKE'

set vpn ipsec esp-group VK-ESP lifetime '3600'
set vpn ipsec esp-group VK-ESP mode 'transport'
set vpn ipsec esp-group VK-ESP pfs 'dh-group19'
set vpn ipsec esp-group VK-ESP proposal 1 encryption 'aes256gcm128'
set vpn ipsec esp-group VK-ESP proposal 1 hash 'sha256'

set vpn ipsec ike-group VK-IKE ikev2-reauth
set vpn ipsec ike-group VK-IKE key-exchange 'ikev2'
set vpn ipsec ike-group VK-IKE lifetime '28800'
set vpn ipsec ike-group VK-IKE proposal 1 dh-group '19'
set vpn ipsec ike-group VK-IKE proposal 1 encryption 'aes256gcm128'
set vpn ipsec ike-group VK-IKE proposal 1 hash 'sha256'
set vpn ipsec ike-group VK-IKE dead-peer-detection action 'restart'
set vpn ipsec ike-group VK-IKE dead-peer-detection interval '30'
set vpn ipsec ike-group VK-IKE dead-peer-detection timeout '120'

# OSPF
set interfaces tunnel tun0 ip ospf network 'broadcast'
set interfaces tunnel tun0 ip ospf priority '0'

set protocols ospf area '0' network '172.16.0.0/24'
set protocols ospf area '0' network '192.168.100.0/24'
set protocols ospf parameters router-id '172.16.0.10'

# Firewall
set firewall ipv4 input filter rule 300 action 'accept'
set firewall ipv4 input filter rule 300 protocol 'gre'

set firewall ipv4 input filter rule 310 action 'accept'
set firewall ipv4 input filter rule 310 protocol 'esp'

set firewall ipv4 input filter rule 311 action 'accept'
set firewall ipv4 input filter rule 311 destination port '500'
set firewall ipv4 input filter rule 311 protocol 'udp'

set firewall ipv4 input filter rule 312 action 'accept'
set firewall ipv4 input filter rule 312 destination port '4500'
set firewall ipv4 input filter rule 312 protocol 'udp'

commit
save
```

## Операционные команды

### Проверка NHRP

#### show ip nhrp cache

Показать NHRP cache (известные mappings):

```bash
show ip nhrp cache
```

Пример вывода на Hub:

```
Iface    Type    Protocol    NBMA            Tunnel          Flags
tun0     dynamic nhrp        198.51.100.10   10.255.0.10/32  registered UP
tun0     dynamic nhrp        198.51.100.20   10.255.0.20/32  registered UP
tun0     dynamic nhrp        95.163.20.100   10.255.0.30/32  registered UP
```

Флаги:
- **registered**: Spoke зарегистрирован на NHS
- **UP**: Туннель активен
- **dynamic**: Entry создан динамически

#### show ip nhrp nhs

Показать Next Hop Server статус:

```bash
show ip nhrp nhs
```

Пример вывода на Spoke:

```
Iface    NBMA            Tunnel          Flags
tun0     203.0.113.1     10.255.0.1/32   UP
```

#### show ip nhrp shortcut

Показать active spoke-to-spoke shortcuts:

```bash
show ip nhrp shortcut
```

Пример вывода:

```
Iface    Target          Via             Type
tun0     192.168.2.0/24  10.255.0.20     shortcut
```

Означает: трафик к 192.168.2.0/24 идет напрямую к 10.255.0.20 (spoke-to-spoke).

### Проверка IPsec

#### show vpn ipsec sa

Показать IPsec Security Associations:

```bash
show vpn ipsec sa
```

Пример вывода:

```
Connection        State    Uptime    Bytes In/Out
tun0-1            up       00:15:23  1.2M/856K
tun0-2            up       00:10:45  523K/412K
```

#### show vpn ipsec status

Показать общий статус IPsec:

```bash
show vpn ipsec status
```

### Проверка туннеля

#### show interfaces tunnel

Показать все туннельные интерфейсы:

```bash
show interfaces tunnel
```

#### show interfaces tunnel tun0

Детальная информация о туннеле:

```bash
show interfaces tunnel tun0
```

Пример вывода:

```
tun0: <POINTOPOINT,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast
    link/ipip 203.0.113.1 peer 0.0.0.0
    inet 10.255.0.1/24 brd 10.255.0.255 scope global tun0
    RX:  bytes    packets     errors    dropped    overrun      mcast
           1.2M       8543          0          0          0          0
    TX:  bytes    packets     errors    dropped    carrier   collisions
         856.3K       5432          0          0          0          0
```

#### ping через туннель

Проверить connectivity через DMVPN:

```bash
# Ping tunnel IP
ping 10.255.0.10

# Ping сеть за spoke
ping 192.168.1.1

# Ping с указанием source
ping 10.255.0.10 source-address 10.255.0.1
```

### Проверка маршрутизации

#### show ip route

Показать таблицу маршрутизации:

```bash
show ip route
```

Ищите маршруты через tun0 интерфейс.

#### show ip bgp

Показать BGP таблицу:

```bash
show ip bgp
```

#### show ip bgp summary

Краткая информация о BGP neighbors:

```bash
show ip bgp summary
```

#### show ip ospf neighbor

Показать OSPF соседей:

```bash
show ip ospf neighbor
```

### Диагностика трафика

#### monitor interfaces tunnel tun0 traffic

Мониторинг трафика в реальном времени:

```bash
monitor interfaces tunnel tun0 traffic
```

Для выхода: `Ctrl+C`

#### tcpdump на туннеле

Захват пакетов для детальной диагностики:

```bash
sudo tcpdump -i tun0 -nn
```

Пример - смотреть только NHRP:

```bash
sudo tcpdump -i tun0 -nn proto gre
```

## Устранение неполадок

### Туннель не поднимается

**Симптомы**:
- `show ip nhrp cache` на hub пустой
- `show ip nhrp nhs` на spoke показывает DOWN
- Нет connectivity через туннель

**Чек-лист**:

1. **Проверьте GRE на firewall**

На hub и spoke:
```bash
show firewall ipv4 input filter
```

Должно быть правило разрешающее GRE (protocol 47).

2. **Проверьте IPsec**

```bash
show vpn ipsec sa
```

Если SA не установлен:
- Проверьте pre-shared-secret (должен совпадать)
- Проверьте ESP/IKE groups (должны совпадать)
- Проверьте firewall для UDP 500, 4500 и ESP

3. **Проверьте NHRP authentication**

Пароль `cisco-authentication` должен совпадать на hub и spoke.

4. **Проверьте source-address на spoke**

```bash
show interfaces tunnel tun0
```

source-address должен быть реальным WAN IP или IP на WAN интерфейсе.

5. **Проверьте connectivity к hub**

```bash
ping 203.0.113.1  # Публичный IP hub
```

Если не пингуется - проблемы с маршрутизацией/firewall до hub.

### NHRP регистрация не происходит

**Симптомы**:
- Туннель UP, но spoke не появляется в `show ip nhrp cache` на hub
- На spoke `show ip nhrp nhs` показывает DOWN

**Решение**:

1. Проверьте NHRP map на spoke:

```bash
show protocols nhrp tunnel tun0
```

Должен быть map с register для hub:

```
map 10.255.0.1/32 nbma-address 203.0.113.1 register
```

2. Проверьте holding-time на hub:

```bash
show protocols nhrp tunnel tun0
```

Убедитесь что holding-time достаточный (300-600 секунд).

3. Проверьте network-id:

Если используется network-id, он должен совпадать на hub и spoke.

4. Перезапустите NHRP на spoke:

```bash
restart nhrp tunnel tun0
```

### Spoke-to-Spoke туннели не создаются

**Симптомы**:
- Hub-to-spoke работает
- Spoke-to-spoke трафик идет через hub
- `show ip nhrp shortcut` на spoke пустой

**Решение**:

1. Проверьте redirect на hub:

```bash
show protocols nhrp tunnel tun0
```

Должен быть `redirect` включен.

2. Проверьте shortcut на spoke:

```bash
show protocols nhrp tunnel tun0
```

Должен быть `shortcut` включен.

3. Проверьте маршрутизацию на spoke:

Spoke должны иметь маршруты к сетям за другими spoke через hub:

```bash
show ip route
```

Если маршрутов нет - проблема с динамической маршрутизацией (BGP/OSPF).

4. Инициируйте трафик spoke-to-spoke:

```bash
ping 192.168.2.1  # Сеть за другим spoke
```

После первых пакетов через hub должен создаться shortcut.

5. Проверьте NHRP resolution:

```bash
show log | match nhrp
```

Ищите NHRP resolution requests и responses.

### IPsec SA постоянно пересоздается

**Симптомы**:
- `show vpn ipsec sa` показывает малое uptime
- Туннель работает но нестабильно
- Логи показывают постоянное пересоздание SA

**Решение**:

1. Проверьте Dead Peer Detection:

```bash
show vpn ipsec ike-group
```

Убедитесь что DPD настроен корректно:
- action: restart
- interval: 30
- timeout: 120

2. Проверьте MTU:

Слишком большой MTU может вызывать проблемы. Попробуйте:

```bash
set interfaces tunnel tun0 mtu '1400'
commit
```

3. Проверьте NAT traversal:

Если spoke за NAT, убедитесь что UDP 4500 открыт.

4. Проверьте lifetime:

```bash
show vpn ipsec esp-group
show vpn ipsec ike-group
```

Слишком короткий lifetime вызывает частые rekeying.

### Производительность DMVPN низкая

**Симптомы**:
- Медленная передача данных через туннель
- Высокая latency
- Packet loss

**Решение**:

1. Проверьте MTU:

Фрагментация пакетов снижает производительность:

```bash
# Тест PMTU
ping 10.255.0.1 size 1400 do-not-fragment
```

Если пакеты не проходят, уменьшите MTU:

```bash
set interfaces tunnel tun0 mtu '1380'
commit
```

2. Проверьте MSS clamping:

Для TCP трафика настройте MSS clamping:

```bash
set firewall ipv4 forward filter rule 50 action 'accept'
set firewall ipv4 forward filter rule 50 protocol 'tcp'
set firewall ipv4 forward filter rule 50 tcp flags syn
set firewall ipv4 forward filter rule 50 tcp mss '1360:1536'
commit
```

3. Проверьте загрузку CPU:

```bash
show system cpu
```

GRE + IPsec требуют CPU. Если загрузка высокая - проблема в железе.

4. Проверьте bandwidth на WAN:

```bash
monitor interfaces eth0 traffic
```

Возможно WAN канал насыщен.

5. Отключите compression (если включен):

GRE compression обычно не нужен и снижает производительность.

### Multicast трафик не проходит

**Симптомы**:
- OSPF соседства не формируются
- Multicast приложения не работают
- EIGRP hello не проходят

**Решение**:

1. Проверьте multicast на туннеле:

```bash
show interfaces tunnel tun0
```

Должно быть `multicast enable`.

2. Проверьте NHRP multicast:

На hub:
```bash
show protocols nhrp tunnel tun0
```
Должно быть `multicast dynamic`.

На spoke:
```bash
show protocols nhrp tunnel tun0
```
Должно быть `multicast nhs`.

3. Проверьте IGMP:

```bash
show ip igmp groups
```

4. Тестируйте multicast:

На spoke отправьте multicast:
```bash
sudo ping -I tun0 224.0.0.5
```

На других spoke мониторьте:
```bash
sudo tcpdump -i tun0 -nn dst 224.0.0.5
```

## Лучшие практики

### Безопасность

1. **Используйте сильную аутентификацию**

- NHRP authentication минимум 8 символов
- IPsec pre-shared-secret минимум 20 символов
- Рассмотрите сертификаты для IPsec

2. **Современная криптография**

- AES-256-GCM для ESP encryption
- SHA-256 минимум для hash
- DH group 14 минимум (лучше 19/20)
- IKEv2 вместо IKEv1

3. **Ограничьте firewall**

Разрешайте GRE/IPsec только от известных источников (если возможно):

```bash
set firewall ipv4 input filter rule 200 action 'accept'
set firewall ipv4 input filter rule 200 protocol 'gre'
set firewall ipv4 input filter rule 200 source group address-group 'KNOWN_SPOKES'
```

4. **Ротация ключей**

Периодически меняйте:
- NHRP authentication password
- IPsec pre-shared-secrets
- IKE/ESP lifetime настройте для автоматического rekeying

### Масштабируемость

1. **Используйте BGP для больших сетей**

BGP масштабируется лучше OSPF для сотен spoke:
- Гибкая политика маршрутизации
- Атрибуты для traffic engineering
- Route reflectors для еще большего масштаба

2. **Summary маршруты на hub**

Не анонсируйте специфичные /32 маршруты spoke - используйте summarization.

3. **DMVPN Phase 3**

Для больших сетей используйте Phase 3 (summary routes + shortcut).

4. **Мониторинг ресурсов hub**

Hub - критичный компонент, мониторьте:
- CPU utilization
- Memory usage
- NHRP cache size
- IPsec SA count

### Надежность

1. **Dual-hub архитектура**

Для критичных сетей используйте два hub:
- Разные публичные IP
- Разные датацентры/облака
- Spoke с двумя NHS

2. **Dead Peer Detection**

Настройте DPD для быстрого обнаружения обрывов:

```bash
set vpn ipsec ike-group DMVPN-IKE dead-peer-detection action 'restart'
set vpn ipsec ike-group DMVPN-IKE dead-peer-detection interval '30'
set vpn ipsec ike-group DMVPN-IKE dead-peer-detection timeout '120'
```

3. **NHRP holding-time**

Баланс между overhead и скоростью обнаружения отказов:
- 300-600 секунд для стабильных сетей
- 120-300 секунд для нестабильных WAN

4. **Backup маршруты**

Настройте floating static routes как backup для DMVPN.

### Производительность

1. **Правильный MTU**

Определите оптимальный MTU для вашей сети:
- Стандартно: 1400 для GRE + IPsec
- Тестируйте PMTU: `ping size <value> do-not-fragment`
- MSS clamping для TCP

2. **Минимизируйте overhead**

- Не используйте compression без необходимости
- GRE key используйте только если нужна изоляция
- Избегайте nested туннелей

3. **Offloading (если доступен)**

На поддерживаемом железе включите crypto offloading для IPsec.

4. **QoS**

Для критичного трафика настройте QoS:

```bash
set traffic-policy shaper DMVPN-SHAPER bandwidth '100mbit'
set traffic-policy shaper DMVPN-SHAPER class 10 match 'voice' ip dscp 'ef'
set traffic-policy shaper DMVPN-SHAPER class 10 bandwidth '20%'
set traffic-policy shaper DMVPN-SHAPER class 10 priority '1'

set interfaces tunnel tun0 traffic-policy out 'DMVPN-SHAPER'
```

### Управление и мониторинг

1. **Документация**

Документируйте:
- Топологию DMVPN (какой spoke где)
- IP addressing plan (tunnel IPs, NBMA IPs)
- BGP AS numbers
- Контакты для каждого spoke

2. **Мониторинг**

Настройте мониторинг:
- NHRP cache size на hub
- IPsec SA status
- BGP/OSPF neighbor state
- Bandwidth utilization
- Packet loss/latency

3. **Логирование**

Включите логи для DMVPN событий:

```bash
set system syslog global facility local7 level 'debug'
set system syslog host 192.168.1.100 facility local7 level 'info'
```

4. **Централизованное управление**

Для больших сетей используйте:
- Ansible для автоматизации конфигурации
- Git для версионирования config
- VyOS API для программного управления

5. **Регулярное тестирование**

Периодически тестируйте:
- Failover на dual-hub
- Spoke-to-spoke tunnels
- Performance (throughput, latency)
- Recovery после сбоев

## Сравнение с другими VPN технологиями

| Характеристика | DMVPN | WireGuard | IPsec Site-to-Site | OpenVPN |
|---------------|-------|-----------|-------------------|---------|
| **Spoke-to-Spoke** | Да, динамически | Нет (manual) | Нет (manual) | Нет (manual) |
| **Масштабируемость** | Отлично (сотни spoke) | Хорошо | Плохо (N*N туннелей) | Средне |
| **Конфигурация spoke** | Минимальная | Простая | Для каждого peer | Простая (server-client) |
| **Динамические IP spoke** | Да | Да | Ограничено | Да |
| **Производительность** | Хорошо | Отлично | Хорошо | Средне |
| **Multicast** | Да (через NHRP) | Нет | Нет | Нет |
| **Динамическая маршрутизация** | Да (BGP/OSPF) | Нет нативно | Да (BGP/OSPF) | Да (BGP/OSPF) |
| **NAT traversal** | Да (через NAT-T) | Да | Да (NAT-T) | Да |
| **Redundancy** | Да (dual-hub) | Manual | Manual | Manual |
| **Стандартизация** | RFC | RFC | RFC | Нет (de-facto) |

**Когда использовать DMVPN**:
- Service provider с множеством клиентов
- Enterprise с множеством филиалов
- Нужны spoke-to-spoke туннели
- Масштабируемость критична
- Динамическая маршрутизация требуется

**Когда НЕ использовать DMVPN**:
- Малое количество site (2-3) - используйте WireGuard или IPsec
- Простота важнее функциональности - используйте WireGuard
- Производительность критична - используйте WireGuard
- Нет опыта с NHRP/GRE - используйте WireGuard

## Ресурсы и дополнительные материалы

### Официальная документация

- [VyOS DMVPN Documentation](https://docs.vyos.io/en/latest/configuration/vpn/dmvpn.html)
- [RFC 2332 - NBMA Next Hop Resolution Protocol (NHRP)](https://datatracker.ietf.org/doc/html/rfc2332)
- [RFC 1702 - Generic Routing Encapsulation over IPv4 networks](https://datatracker.ietf.org/doc/html/rfc1702)
- [RFC 4301 - Security Architecture for the Internet Protocol](https://datatracker.ietf.org/doc/html/rfc4301)

### VyOS командная справка

```bash
# Показать все NHRP команды
show ip nhrp ?

# Показать все IPsec команды
show vpn ipsec ?

# Показать все tunnel команды
show interfaces tunnel ?
```

### Связанные разделы документации

- [IPsec VPN](/docs/vyos/vpn/vyos-ipsec/) - для понимания IPsec интеграции
- [WireGuard](/docs/vyos/vpn/vyos-wireguard/) - альтернатива для простых сценариев
- [Firewall](/docs/vyos/firewall/) - настройка firewall для DMVPN
- [BGP](/docs/vyos/routing/vyos-bgp/) - динамическая маршрутизация через DMVPN
- [OSPF](/docs/vyos/routing/vyos-ospf/) - альтернативная маршрутизация

### Облачные платформы

- [Yandex Cloud VPC](https://cloud.yandex.ru/docs/vpc/)
- [VK Cloud Networks](https://cloud.vk.com/docs/networks)

### Сообщество и поддержка

- [VyOS Community Forums](https://forum.vyos.io/)
- [VyOS Slack](https://slack.vyos.io/)
- [VyOS GitHub](https://github.com/vyos)
- [OpenNIX Support](mailto:support@opennix.org) - для коммерческой поддержки

## Заключение

DMVPN - мощная технология для создания масштабируемых VPN сетей с динамическими spoke-to-spoke туннелями. VyOS предоставляет полную поддержку DMVPN включая NHRP, mGRE и IPsec интеграцию.

**Ключевые преимущества DMVPN**:
- Масштабируемость до сотен spoke узлов
- Автоматическое создание spoke-to-spoke туннелей
- Минимальная конфигурация на spoke
- Поддержка динамических IP адресов
- Интеграция с динамической маршрутизацией
- Отказоустойчивость через dual-hub

**Рекомендации**:
- Для service provider сетей - DMVPN идеален
- Для enterprise с множеством филиалов - DMVPN отличный выбор
- Для малых сетей (2-5 site) - рассмотрите WireGuard
- Используйте BGP для больших масштабируемых сетей
- Настройте dual-hub для критичных сетей
- Регулярно мониторьте и тестируйте

DMVPN в VyOS обеспечивает enterprise-grade функциональность для построения сложных VPN инфраструктур с отличной масштабируемостью и надежностью.

