# GENEVE - Generic Network Virtualization Encapsulation

> Настройка GENEVE интерфейсов в VyOS для сетевой виртуализации - инкапсуляция L2 трафика в UDP, интеграция с SDN контроллерами в Yandex Cloud и VK Cloud

Source: https://opennix.org/docs/vyos/interfaces/vyos-geneve/


GENEVE (Generic Network Virtualization Encapsulation) - это протокол сетевой виртуализации, разработанный для преодоления ограничений VXLAN, NVGRE и STT. GENEVE поддерживает сценарии сетевой виртуализации, особенно для создания туннелей между виртуальными коммутаторами.

## Введение в GENEVE

### Что такое GENEVE?

GENEVE - это современный протокол инкапсуляции, который:
- Использует произвольные IP сети в качестве underlay
- Поддерживает архитектуры Clos network
- Обеспечивает гибкость через расширяемый заголовок
- Разработан IETF NVO3 Working Group

### Ключевые особенности

**Архитектура заголовка:**
- Version - версия протокола
- Option Length - длина опциональных полей
- VNI (Virtual Network Identifier) - идентификатор виртуальной сети
- Protocol Type - тип инкапсулированного протокола
- Variable Length Options - расширяемые опции

**Преимущества перед VXLAN:**
- Более гибкий формат заголовка
- Поддержка метаданных
- Лучшая расширяемость
- Совместимость с различными transport протоколами

### Когда использовать GENEVE?

**Рекомендуется для:**
- Cloud overlay networks
- Network virtualization в datacenter
- Multi-tenant environments
- SDN/NFV решений
- Kubernetes CNI (например, OVN-Kubernetes)

**Применение в облаках:**
- Yandex Cloud: Overlay networking для контейнерных платформ
- VK Cloud: Multi-tenant изоляция
- Private Cloud: Network virtualization infrastructure

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

### Базовая настройка

```bash
configure

# Создать GENEVE интерфейс
set interfaces geneve gnv0 remote 203.0.113.10
set interfaces geneve gnv0 vni 100
set interfaces geneve gnv0 address 10.10.0.1/24

commit
save
```

### Параметры конфигурации

#### VNI (Virtual Network Identifier)

```bash
# VNI идентифицирует виртуальную сеть (0-16777215)
set interfaces geneve gnv0 vni 100
```

**Диапазон VNI:** 0 - 16777215 (24-bit)

#### Remote Address

```bash
# IP адрес удаленной конечной точки туннеля
set interfaces geneve gnv0 remote 203.0.113.10

# Поддерживается IPv6
set interfaces geneve gnv0 remote 2001:db8::10
```

#### Source Address (опционально)

```bash
# Если не указан - выбирается автоматически на основе routing table
set interfaces geneve gnv0 source-address 203.0.113.1
```

#### UDP Port

```bash
# Порт назначения UDP (по умолчанию 6081)
set interfaces geneve gnv0 port 6081

# Использовать custom порт
set interfaces geneve gnv0 port 8472
```

**Default GENEVE port:** 6081 (IANA assigned)

#### IP Configuration

```bash
# IPv4 адрес
set interfaces geneve gnv0 address 10.10.0.1/24

# IPv6 адрес
set interfaces geneve gnv0 address 2001:db8:1::1/64

# Множественные IP адреса
set interfaces geneve gnv0 address 10.10.0.1/24
set interfaces geneve gnv0 address 10.10.1.1/24
```

#### MTU Settings

```bash
# Установить MTU (учесть overhead для инкапсуляции)
set interfaces geneve gnv0 mtu 1450

# GENEVE overhead:
# - IPv4: 50 bytes (20 IP + 8 UDP + 8 GENEVE + 14 Ethernet)
# - IPv6: 70 bytes (40 IP + 8 UDP + 8 GENEVE + 14 Ethernet)
```

**Рекомендации MTU:**
- Underlay MTU 1500: GENEVE MTU = 1450
- Underlay MTU 9000 (Jumbo): GENEVE MTU = 8950

#### MAC Address

```bash
# Установить custom MAC адрес
set interfaces geneve gnv0 mac '00:50:56:00:00:01'
```

#### Description

```bash
# Добавить описание интерфейса
set interfaces geneve gnv0 description 'GENEVE to DC-EAST'
```

## Практические сценарии

### Сценарий 1: Point-to-Point GENEVE Tunnel

**Топология:**
```
[VyOS-R1] ===== GENEVE Tunnel ===== [VyOS-R2]
10.0.1.1/24                          10.0.2.1/24
         |                                |
    Overlay: 172.16.0.0/30
```

**Конфигурация VyOS-R1:**

```bash
configure

# WAN интерфейс
set interfaces ethernet eth0 address 10.0.1.1/24

# GENEVE tunnel
set interfaces geneve gnv0 remote 10.0.2.1
set interfaces geneve gnv0 vni 1000
set interfaces geneve gnv0 address 172.16.0.1/30
set interfaces geneve gnv0 mtu 1450
set interfaces geneve gnv0 description 'Tunnel to R2'

# Static route через туннель
set protocols static route 192.168.2.0/24 next-hop 172.16.0.2

commit
save
```

**Конфигурация VyOS-R2:**

```bash
configure

# WAN интерфейс
set interfaces ethernet eth0 address 10.0.2.1/24

# GENEVE tunnel
set interfaces geneve gnv0 remote 10.0.1.1
set interfaces geneve gnv0 vni 1000
set interfaces geneve gnv0 address 172.16.0.2/30
set interfaces geneve gnv0 mtu 1450
set interfaces geneve gnv0 description 'Tunnel to R1'

# Static route через туннель
set protocols static route 192.168.1.0/24 next-hop 172.16.0.1

commit
save
```

**Проверка:**

```bash
# Проверить интерфейс
show interfaces geneve

# Ping через туннель
ping 172.16.0.2 source-address 172.16.0.1

# Проверить routing
show ip route
```

### Сценарий 2: Multi-Tenant Network Virtualization

**Задача:** Изоляция трафика нескольких клиентов через отдельные VNI

**Топология:**
```
Tenant A (VNI 100): 10.100.0.0/16
Tenant B (VNI 200): 10.200.0.0/16
Tenant C (VNI 300): 10.300.0.0/16
```

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

```bash
configure

# Tenant A
set interfaces geneve gnv100 remote 203.0.113.10
set interfaces geneve gnv100 vni 100
set interfaces geneve gnv100 address 10.100.0.1/16
set interfaces geneve gnv100 description 'Tenant-A Network'

# Tenant B
set interfaces geneve gnv200 remote 203.0.113.10
set interfaces geneve gnv200 vni 200
set interfaces geneve gnv200 address 10.200.0.1/16
set interfaces geneve gnv200 description 'Tenant-B Network'

# Tenant C
set interfaces geneve gnv300 remote 203.0.113.10
set interfaces geneve gnv300 vni 300
set interfaces geneve gnv300 address 10.300.0.1/16
set interfaces geneve gnv300 description 'Tenant-C Network'

# Firewall для изоляции
set firewall group network-group TENANT-A network 10.100.0.0/16
set firewall group network-group TENANT-B network 10.200.0.0/16
set firewall group network-group TENANT-C network 10.300.0.0/16

set firewall name TENANT-ISOLATION default-action drop
set firewall name TENANT-ISOLATION rule 10 action accept
set firewall name TENANT-ISOLATION rule 10 state established enable
set firewall name TENANT-ISOLATION rule 10 state related enable

commit
save
```

### Сценарий 3: GENEVE в Yandex Cloud

**Задача:** Overlay network между VMs в Yandex Cloud

**Особенности Yandex Cloud:**
- Поддержка custom протоколов между VMs
- Требуется security group разрешающий UDP 6081
- MTU в Yandex Cloud: 1500 (использовать GENEVE MTU 1450)

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

```bash
configure

# Определить cloud metadata для получения IP
set system option performance throughput

# GENEVE tunnel между облачными VMs
set interfaces geneve gnv0 remote 10.128.0.20
set interfaces geneve gnv0 vni 1000
set interfaces geneve gnv0 address 172.16.100.1/24
set interfaces geneve gnv0 mtu 1450
set interfaces geneve gnv0 description 'Yandex Cloud Overlay'

# Source address - внутренний IP VM
set interfaces geneve gnv0 source-address 10.128.0.10

commit
save
```

**Yandex Cloud Security Group:**

```bash
# Через Yandex Cloud Console или CLI
yc vpc security-group-rule create \
  --security-group-id <sg-id> \
  --direction ingress \
  --protocol udp \
  --port 6081 \
  --cidr-blocks 10.128.0.0/24 \
  --description "GENEVE tunnel"
```

### Сценарий 4: GENEVE с Dynamic Routing

**Задача:** OSPF через GENEVE tunnel

```bash
configure

# GENEVE tunnel
set interfaces geneve gnv0 remote 203.0.113.10
set interfaces geneve gnv0 vni 1000
set interfaces geneve gnv0 address 172.16.0.1/30
set interfaces geneve gnv0 mtu 1450

# OSPF через GENEVE
set protocols ospf area 0 network 172.16.0.0/30
set protocols ospf area 0 network 192.168.1.0/24

# Interface parameters для OSPF
set protocols ospf interface gnv0 hello-interval 10
set protocols ospf interface gnv0 dead-interval 40
set protocols ospf interface gnv0 priority 100

commit
save
```

**Проверка OSPF:**

```bash
show ip ospf neighbor
show ip ospf route
```

## Интеграция с Bridge

GENEVE интерфейсы можно добавлять в bridge для L2 connectivity:

```bash
configure

# Создать bridge
set interfaces bridge br0 address 192.168.100.1/24

# Добавить GENEVE в bridge
set interfaces bridge br0 member interface gnv0

# Добавить локальный интерфейс в bridge
set interfaces bridge br0 member interface eth1

commit
save
```

**Use case:** L2 extension через GENEVE tunnel

## Мониторинг и отладка

### Проверка статуса

```bash
# Общая информация
show interfaces geneve

# Детальная статистика
show interfaces geneve gnv0

# Только конфигурация
show interfaces geneve gnv0 brief
```

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

```
gnv0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450
    inet 172.16.0.1/30
    RX: bytes    packets  errors  dropped
        1048576  1024     0       0
    TX: bytes    packets  errors  dropped
        2097152  2048     0       0
```

### Packet Capture

```bash
# Захват трафика на GENEVE интерфейсе
monitor traffic interface gnv0

# Фильтр по протоколу
monitor traffic interface gnv0 filter "icmp"

# Сохранить в файл
monitor traffic interface gnv0 save /tmp/geneve-capture.pcap
```

### Debugging

```bash
# Проверить encapsulated трафик на underlay
monitor traffic interface eth0 filter "udp port 6081"

# Проверить kernel messages
show log kernel | match geneve
```

## Troubleshooting

### Проблема: GENEVE туннель не поднимается

**Диагностика:**

```bash
# 1. Проверить IP connectivity до remote endpoint
ping 203.0.113.10

# 2. Проверить что UDP 6081 не заблокирован
sudo tcpdump -i eth0 udp port 6081

# 3. Проверить routing до remote
show ip route 203.0.113.10

# 4. Проверить firewall
show firewall
```

**Типичные причины:**
- Firewall блокирует UDP 6081
- Нет IP connectivity до remote
- Неправильный source-address
- MTU problems

### Проблема: Packet Loss через туннель

**Диагностика:**

```bash
# Проверить MTU path
ping 172.16.0.2 size 1450 do-not-fragment

# Проверить фрагментацию
show interfaces geneve gnv0
# Смотреть TX/RX errors
```

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

```bash
# Уменьшить MTU
set interfaces geneve gnv0 mtu 1400
commit

# Или включить TCP MSS clamping
set interfaces geneve gnv0 ip adjust-mss 1360
commit
```

### Проблема: Низкая производительность

**Причины:**
- Высокий overhead инкапсуляции
- CPU ограничения при encap/decap
- Network latency underlay

**Оптимизация:**

```bash
# Включить offloading если поддерживается NIC
set interfaces ethernet eth0 offload gso
set interfaces ethernet eth0 offload gro
set interfaces ethernet eth0 offload tso

# Увеличить MTU на underlay (если возможно)
set interfaces ethernet eth0 mtu 9000
set interfaces geneve gnv0 mtu 8950

commit
```

## Сравнение GENEVE vs VXLAN

| Характеристика | GENEVE | VXLAN |
|---------------|---------|--------|
| **Default UDP Port** | 6081 | 4789 |
| **Header Size** | Variable (min 8 bytes) | Fixed 8 bytes |
| **VNI Bits** | 24-bit | 24-bit |
| **Extensibility** | Yes (TLV options) | Limited |
| **Multicast Support** | Optional | Yes |
| **Metadata Support** | Yes | No |
| **OAM Support** | Built-in | External |
| **IETF Standard** | Draft | RFC 7348 |
| **Adoption** | Growing (OVN, NSX) | Wide (most vendors) |

**Когда выбрать GENEVE:**
- Нужна расширяемость (metadata, OAM)
- SDN environment (OpenStack, Kubernetes)
- Требуется передача контекста между устройствами

**Когда выбрать VXLAN:**
- Требуется широкая совместимость
- Hardware offload критичен
- Существующая VXLAN инфраструктура

## Best Practices

### 1. Планирование VNI

```bash
# Используйте логичную схему VNI allocation
# Пример:
# 1000-1999: Production networks
# 2000-2999: Development networks
# 3000-3999: Test networks
# 4000-4999: Management networks

set interfaces geneve gnv-prod remote 10.0.1.1 vni 1000
set interfaces geneve gnv-dev remote 10.0.1.1 vni 2000
set interfaces geneve gnv-test remote 10.0.1.1 vni 3000
```

### 2. MTU Configuration

```bash
# Всегда учитывайте overhead
# Формула: GENEVE MTU = Underlay MTU - 50 (IPv4) или -70 (IPv6)

# Для underlay MTU 1500
set interfaces geneve gnv0 mtu 1450

# Для Jumbo frames (MTU 9000)
set interfaces geneve gnv0 mtu 8950
```

### 3. Monitoring

```bash
# Настройте SNMP для мониторинга
set service snmp community public authorization ro
set service snmp community public network 192.168.1.0/24

# Или используйте syslog для логирования
set system syslog host 192.168.1.100 facility all level info
```

### 4. Security

```bash
# Ограничьте доступ через firewall
set firewall name GENEVE-IN default-action drop
set firewall name GENEVE-IN rule 10 action accept
set firewall name GENEVE-IN rule 10 protocol udp
set firewall name GENEVE-IN rule 10 destination port 6081
set firewall name GENEVE-IN rule 10 source group network-group GENEVE-PEERS

set interfaces ethernet eth0 firewall in name GENEVE-IN
```

### 5. Documentation

```bash
# Всегда документируйте назначение туннелей
set interfaces geneve gnv0 description 'GENEVE to DC-EAST VNI:1000 Prod'
set interfaces geneve gnv1 description 'GENEVE to DC-WEST VNI:1001 Prod'
```

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

GENEVE - это современный, расширяемый протокол для network virtualization, который:

**Преимущества:**
- Гибкость через расширяемый заголовок
- Поддержка метаданных для SDN
- Совместимость с различными transport
- IETF стандартизация

**Применение:**
- Cloud overlay networks
- Multi-tenant environments
- Kubernetes/OpenStack networking
- Datacenter fabric virtualization

**Лучше всего подходит для:**
- Новых SDN/NFV deployments
- Environments требующих metadata
- Multi-vendor integration через open standard

GENEVE является отличным выбором для современных сетевых виртуализаций, особенно в контексте облачных платформ Yandex Cloud и VK Cloud, где требуется гибкая изоляция и overlay networking.

## Дополнительные ресурсы

- [GENEVE IETF Draft](https://datatracker.ietf.org/doc/html/draft-ietf-nvo3-geneve)
- [VyOS GENEVE Documentation](https://docs.vyos.io/en/latest/configuration/interfaces/geneve.html)
- [OVN and GENEVE](https://www.ovn.org/)
- [Comparing GENEVE, VXLAN and NVGRE](https://www.sdxcentral.com/)

