# OSPF (Open Shortest Path First)

> Настройка OSPF на VyOS: OSPF areas, neighbors, аутентификация, redistribution, link-state маршрутизация для Yandex Cloud и VK Cloud

Source: https://opennix.org/docs/vyos/routing/vyos-ospf/


OSPF - link-state протокол маршрутизации для IP сетей, широко используемый в enterprise networks.

## Обзор

OSPF (RFC 2328 для OSPFv2, RFC 5340 для OSPFv3) - Interior Gateway Protocol (IGP) использующий алгоритм Dijkstra.

**Характеристики**:
- Link-state протокол (каждый роутер имеет полную топологию)
- Быстрая конвергенция
- Масштабируемость через иерархический дизайн (areas)
- VLSM и CIDR support
- Метрика - cost (на основе bandwidth)
- Multicast для обновлений (224.0.0.5, 224.0.0.6)

**Версии**:
- **OSPFv2** - для IPv4
- **OSPFv3** - для IPv6

**Применение**:
- Enterprise campus networks
- Data center networking
- WAN между офисами
- ISP backbone (в сочетании с BGP)

**Преимущества перед RIP**:
- Нет hop count limit
- Быстрая конвергенция
- Bandwidth-based метрика
- Поддержка VLSM
- Меньше трафика обновлений

## OSPF Areas

OSPF использует иерархический дизайн с областями (areas).

### Area 0 (Backbone)

**Area 0** - обязательная backbone area, к которой подключаются все другие areas.

**Правила**:
- Все areas должны подключаться к Area 0
- Area 0 должна быть contiguous (непрерывной)
- Inter-area трафик проходит через Area 0

### Типы роутеров

**Internal Router** - все интерфейсы в одной area.

**Area Border Router (ABR)** - роутер с интерфейсами в нескольких areas (обязательно включая Area 0).

**Autonomous System Boundary Router (ASBR)** - роутер, который redistribue внешние маршруты в OSPF.

**Backbone Router** - роутер с интерфейсом в Area 0.

### Area Types

**Normal Area** - стандартная area, получает все типы LSA.

**Stub Area** - не получает external LSA (Type 5), использует default route для внешних сетей.

**Totally Stubby Area** - Cisco-специфичная, не получает external и summary LSA.

**NSSA (Not-So-Stubby Area)** - как Stub, но позволяет import external routes через Type 7 LSA.

**Totally NSSA** - комбинация NSSA и Totally Stubby.

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

### Простая OSPF сеть

**Router 1**:
```
set protocols ospf parameters router-id 10.0.0.1

set protocols ospf area 0 network 10.0.0.0/30
set protocols ospf area 0 network 192.168.1.0/24

commit
save
```

**Router 2**:
```
set protocols ospf parameters router-id 10.0.0.2

set protocols ospf area 0 network 10.0.0.0/30
set protocols ospf area 0 network 192.168.2.0/24

commit
save
```

### Проверка

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

## Router ID

Уникальный идентификатор OSPF роутера (формат IPv4 адреса).

```
set protocols ospf parameters router-id 10.0.0.1
commit
```

**Автоматический выбор** (если не настроен):
1. Наибольший IP loopback интерфейса
2. Наибольший IP активного физического интерфейса

**Рекомендация**: Всегда настраивайте router-id явно.

**Best practice**: Использовать loopback адрес:

```
set interfaces loopback lo address 10.255.255.1/32
set protocols ospf parameters router-id 10.255.255.1
commit
```

## Network Configuration

### Network Statement

Активировать OSPF на сетях:

```
set protocols ospf area 0 network 192.168.1.0/24
set protocols ospf area 0 network 10.0.0.0/8
commit
```

Все интерфейсы с IP из указанных сетей будут участвовать в OSPF.

### Interface-specific

Активировать OSPF на конкретном интерфейсе:

```
set protocols ospf interface eth1 area 0
set protocols ospf interface eth2 area 1
commit
```

Более гибко чем network statement.

## Interface Parameters

### Cost

OSPF cost (метрика) интерфейса:

```
set protocols ospf interface eth1 cost 10
commit
```

**Формула по умолчанию**: `cost = reference-bandwidth / interface-bandwidth`

Reference bandwidth (по умолчанию 100 Mbps):
```
set protocols ospf auto-cost reference-bandwidth 1000
commit
```

**Рекомендуемые значения reference-bandwidth**:
- **1000** для Gigabit сетей
- **10000** для 10 Gigabit сетей
- **100000** для 100 Gigabit сетей

### Priority

Приоритет для выбора DR/BDR (Designated Router):

```
set protocols ospf interface eth1 priority 100
commit
```

Значения: 0-255 (по умолчанию 1).
- **0** - роутер не участвует в выборах DR/BDR
- **Выше** - больше шансов стать DR

### Hello и Dead Intervals

Hello interval (секунды):
```
set protocols ospf interface eth1 hello-interval 10
commit
```

Dead interval (секунды):
```
set protocols ospf interface eth1 dead-interval 40
commit
```

По умолчанию:
- Hello: 10 секунд
- Dead: 40 секунд (4x hello)

**Важно**: Должны совпадать между neighbors.

### Bandwidth

Для правильного расчета cost:

```
set interfaces ethernet eth1 speed 1000
commit
```

Или явно установить bandwidth:
```
set protocols ospf interface eth1 bandwidth 1000
commit
```

### Network Type

Тип сети OSPF:

```
set protocols ospf interface eth1 network point-to-point
commit
```

Типы:
- **broadcast** - Ethernet (по умолчанию)
- **point-to-point** - serial links, VPN tunnels
- **non-broadcast** - Frame Relay, X.25
- **point-to-multipoint** - частично mesh топологии

**Point-to-point** рекомендуется для VPN туннелей (избегает DR/BDR выборов).

## Authentication

Защита OSPF от несанкционированных роутеров.

### Plaintext Authentication

**Не рекомендуется** (пароль в открытом виде):

```
set protocols ospf interface eth1 authentication plaintext-password 'MyPassword'
commit
```

### MD5 Authentication

**Рекомендуется**:

```
set protocols ospf interface eth1 authentication md5 key-id 1 md5-key 'SecurePassword123!'
commit
```

**key-id** - идентификатор ключа (1-255), позволяет плавную смену паролей.

### Area-wide Authentication

Для всех интерфейсов в area:

```
set protocols ospf area 0 authentication md5
commit
```

Затем настроить ключи на каждом интерфейсе:

```
set protocols ospf interface eth1 authentication md5 key-id 1 md5-key 'Password!'
commit
```

## Passive Interface

Интерфейс анонсирует свою сеть, но не формирует adjacencies.

```
set protocols ospf interface eth2 passive
commit
```

Полезно для:
- LAN интерфейсов без других OSPF роутеров
- Предотвращения несанкционированных OSPF neighbors

Все интерфейсы passive по умолчанию:

```
set protocols ospf passive-interface default
commit
```

Затем явно активировать нужные:

```
set protocols ospf interface eth0 passive disable
set protocols ospf interface eth1 passive disable
commit
```

## Area Types Configuration

### Stub Area

Не получает external routes (Type 5 LSA):

```
set protocols ospf area 1 area-type stub
commit
```

Настраивается на **всех** роутерах в area.

Default cost для stub area:

```
set protocols ospf area 1 area-type stub default-cost 10
commit
```

### NSSA (Not-So-Stubby Area)

Позволяет import external routes внутри stub area:

```
set protocols ospf area 2 area-type nssa
commit
```

Translate Type 7 LSA в Type 5:

```
set protocols ospf area 2 area-type nssa translate always
commit
```

Опции translate:
- **candidate** - автоматический выбор translator
- **always** - всегда транслировать
- **never** - никогда не транслировать

### Totally Stubby / Totally NSSA

**Totally Stubby**:
```
set protocols ospf area 1 area-type stub no-summary
commit
```

**Totally NSSA**:
```
set protocols ospf area 2 area-type nssa no-summary
commit
```

`no-summary` блокирует Type 3 LSA (inter-area routes).

## Route Redistribution

Импорт маршрутов из других источников.

### Redistribution Sources

Connected:
```
set protocols ospf redistribute connected
commit
```

Static:
```
set protocols ospf redistribute static
commit
```

BGP:
```
set protocols ospf redistribute bgp
commit
```

Kernel:
```
set protocols ospf redistribute kernel
commit
```

### Metric и Metric-Type

Установить метрику:

```
set protocols ospf redistribute connected metric 100
commit
```

Metric type:

```
set protocols ospf redistribute connected metric-type 1
commit
```

Типы:
- **Type 1 (E1)** - external cost + internal cost
- **Type 2 (E2)** - только external cost (по умолчанию)

### Route-map для selective redistribution

```
set protocols ospf redistribute static route-map STATIC-TO-OSPF
commit
```

## Default Route

Анонс default route в OSPF.

### Default Information Originate

```
set protocols ospf default-information originate
commit
```

Анонсирует default route **только если** она существует в routing table.

С параметром `always`:

```
set protocols ospf default-information originate always
commit
```

Анонсирует всегда, даже если нет в routing table.

С метрикой:

```
set protocols ospf default-information originate always metric 10 metric-type 1
commit
```

### Route-map для default route

```
set protocols ospf default-information originate route-map DEFAULT-ROUTE
commit
```

## Area Range (Summarization)

Суммирование маршрутов на ABR.

```
set protocols ospf area 1 range 192.168.0.0/16
commit
```

ABR анонсирует суммарный префикс вместо более специфичных.

С cost:

```
set protocols ospf area 1 range 192.168.0.0/16 cost 100
commit
```

Not-advertise (suppress):

```
set protocols ospf area 1 range 192.168.0.0/16 not-advertise
commit
```

## Distance

Administrative distance для OSPF маршрутов.

Global:
```
set protocols ospf distance global 110
commit
```

По типу маршрута:

```
set protocols ospf distance ospf intra-area 30
set protocols ospf distance ospf inter-area 110
set protocols ospf distance ospf external 150
commit
```

По умолчанию все OSPF маршруты имеют distance 110.

## Timers

### SPF Throttle

Управление частотой SPF calculation:

```
set protocols ospf timers throttle spf delay 200
set protocols ospf timers throttle spf initial-holdtime 1000
set protocols ospf timers throttle spf max-holdtime 10000
commit
```

Значения в миллисекундах:
- **delay** - задержка перед первым SPF (0-600000 мс)
- **initial-holdtime** - начальная задержка между SPF (0-600000 мс)
- **max-holdtime** - максимальная задержка (0-600000 мс)

### LSA Timers

Управление генерацией LSA:

```
set protocols ospf timers lsa min-arrival 1000
commit
```

Минимальный интервал между приемом одинаковых LSA (миллисекунды).

## Graceful Restart

Позволяет продолжить forwarding во время restart OSPF процесса.

```
set protocols ospf parameters graceful-restart
commit
```

Helper mode (помощь соседям при их restart):

```
set protocols ospf parameters graceful-restart helper enable
commit
```

Grace period:

```
set protocols ospf parameters graceful-restart grace-period 120
commit
```

## BFD Integration

Bidirectional Forwarding Detection для быстрого обнаружения отказов.

```
set protocols ospf interface eth1 bfd
commit
```

Настройка BFD профиля:

```
set protocols bfd profile ospf-peers interval transmit 300
set protocols bfd profile ospf-peers interval receive 300
set protocols bfd profile ospf-peers interval multiplier 3

set protocols ospf interface eth1 bfd profile ospf-peers

commit
```

BFD обнаруживает отказ за секунды vs десятки секунд с OSPF dead interval.

## Virtual Link

Соединение non-backbone area с Area 0 через другую area.

```
set protocols ospf area 1 virtual-link 10.0.0.2
commit
```

**10.0.0.2** - router-id удаленного ABR.

С authentication:

```
set protocols ospf area 1 virtual-link 10.0.0.2 authentication md5 key-id 1 md5-key 'Secret!'
commit
```

## Logging

### Adjacency Changes

```
set protocols ospf log-adjacency-changes
commit
```

С деталями:

```
set protocols ospf log-adjacency-changes detail
commit
```

## Advanced Parameters

### Max Metric Router LSA

Объявить максимальную метрику (эффективно "вывести из использования"):

Administrative:
```
set protocols ospf max-metric router-lsa administrative
commit
```

On startup (временно после загрузки):

```
set protocols ospf max-metric router-lsa on-startup 300
commit
```

300 секунд после загрузки роутер анонсирует max metric.

On shutdown:

```
set protocols ospf max-metric router-lsa on-shutdown 60
commit
```

### ABR Type

Поведение Area Border Router:

```
set protocols ospf parameters abr-type cisco
commit
```

Типы:
- **cisco** - Cisco-совместимый (по умолчанию)
- **ibm** - IBM-совместимый
- **standard** - RFC 2328
- **shortcut** - с виртуальными links

### RFC1583 Compatibility

Совместимость со старыми OSPF реализациями:

```
set protocols ospf parameters rfc1583-compatibility
commit
```

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

### Простая двухточечная сеть

**HQ Router**:
```
set interfaces loopback lo address 10.255.255.1/32

set protocols ospf parameters router-id 10.255.255.1
set protocols ospf auto-cost reference-bandwidth 1000

set protocols ospf area 0 network 10.255.255.1/32
set protocols ospf area 0 network 10.0.0.0/30
set protocols ospf area 0 network 192.168.1.0/24

set protocols ospf interface eth1 network point-to-point
set protocols ospf interface eth1 authentication md5 key-id 1 md5-key 'SecureOSPF123!'

set protocols ospf interface eth2 passive

commit
save
```

**Branch Router**:
```
set interfaces loopback lo address 10.255.255.2/32

set protocols ospf parameters router-id 10.255.255.2
set protocols ospf auto-cost reference-bandwidth 1000

set protocols ospf area 0 network 10.255.255.2/32
set protocols ospf area 0 network 10.0.0.0/30
set protocols ospf area 0 network 192.168.2.0/24

set protocols ospf interface eth1 network point-to-point
set protocols ospf interface eth1 authentication md5 key-id 1 md5-key 'SecureOSPF123!'

set protocols ospf interface eth2 passive

commit
save
```

### Multi-area с ABR

**Core ABR (Area 0 и Area 1)**:
```
set interfaces loopback lo address 10.255.255.1/32

set protocols ospf parameters router-id 10.255.255.1
set protocols ospf auto-cost reference-bandwidth 1000

# Area 0 (backbone)
set protocols ospf area 0 network 10.255.255.1/32
set protocols ospf area 0 network 10.0.0.0/24

# Area 1
set protocols ospf area 1 network 10.1.0.0/24

set protocols ospf interface eth1 authentication md5 key-id 1 md5-key 'Area0Pass!'
set protocols ospf interface eth2 authentication md5 key-id 1 md5-key 'Area1Pass!'

commit
save
```

**Area 1 Router**:
```
set interfaces loopback lo address 10.255.255.10/32

set protocols ospf parameters router-id 10.255.255.10
set protocols ospf auto-cost reference-bandwidth 1000

set protocols ospf area 1 network 10.255.255.10/32
set protocols ospf area 1 network 10.1.0.0/24
set protocols ospf area 1 network 192.168.10.0/24

set protocols ospf interface eth1 authentication md5 key-id 1 md5-key 'Area1Pass!'
set protocols ospf interface eth2 passive

commit
save
```

### Stub Area с default route

**ABR**:
```
set protocols ospf area 1 area-type stub default-cost 10
commit
```

**Internal Router в Stub Area**:
```
set protocols ospf area 1 area-type stub
set protocols ospf area 1 network 192.168.20.0/24
commit
```

Роутер получает default route с cost 10 от ABR.

### NSSA с redistribution

**ASBR в NSSA**:
```
set protocols ospf area 2 area-type nssa

set protocols ospf area 2 network 192.168.30.0/24

# Redistribute static routes
set protocols static route 203.0.113.0/24 blackhole
set protocols ospf redistribute static metric 20 metric-type 1

commit
save
```

**ABR для NSSA**:
```
set protocols ospf area 0 network 10.0.0.0/24
set protocols ospf area 2 area-type nssa translate always
set protocols ospf area 2 network 10.2.0.0/24

commit
save
```

### OSPF с BGP redistribution

**Edge Router**:
```
# OSPF internal
set protocols ospf parameters router-id 10.255.255.1
set protocols ospf area 0 network 10.0.0.0/8

# BGP для external
set protocols bgp system-as 65001
set protocols bgp neighbor 203.0.113.1 remote-as 65000
set protocols bgp address-family ipv4-unicast network 192.0.2.0/24

# Redistribute BGP в OSPF
set protocols ospf redistribute bgp metric 100 metric-type 2

# Redistribute OSPF в BGP (selective)
set protocols bgp address-family ipv4-unicast redistribute ospf route-map OSPF-TO-BGP

set policy route-map OSPF-TO-BGP rule 10 action permit
set policy route-map OSPF-TO-BGF rule 10 match ip address prefix-list INTERNAL-NETWORKS

set policy prefix-list INTERNAL-NETWORKS rule 10 action permit
set policy prefix-list INTERNAL-NETWORKS rule 10 prefix 10.0.0.0/8 le 24

commit
save
```

### OSPF через VPN (VTI)

**Site A**:
```
# VTI interface
set interfaces vti vti0 address 172.16.0.1/30

# OSPF через VTI
set protocols ospf parameters router-id 10.0.0.1
set protocols ospf interface vti0 area 0
set protocols ospf interface vti0 network point-to-point
set protocols ospf interface vti0 authentication md5 key-id 1 md5-key 'VPN-OSPF!'

set protocols ospf area 0 network 192.168.1.0/24
set protocols ospf interface eth1 passive

commit
save
```

**Site B**:
```
# VTI interface
set interfaces vti vti0 address 172.16.0.2/30

# OSPF через VTI
set protocols ospf parameters router-id 10.0.0.2
set protocols ospf interface vti0 area 0
set protocols ospf interface vti0 network point-to-point
set protocols ospf interface vti0 authentication md5 key-id 1 md5-key 'VPN-OSPF!'

set protocols ospf area 0 network 192.168.2.0/24
set protocols ospf interface eth1 passive

commit
save
```

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

### OSPF Neighbors

```
show ip ospf neighbor
```

Вывод:
```
Neighbor ID     Pri State           Dead Time Address         Interface
10.0.0.2          1 Full/DR         00:00:35  10.0.0.2        eth1
```

Детали neighbor:
```
show ip ospf neighbor detail
```

### OSPF Database

Link State Database:
```
show ip ospf database
```

Router LSA:
```
show ip ospf database router
```

Network LSA:
```
show ip ospf database network
```

Summary LSA:
```
show ip ospf database summary
```

External LSA:
```
show ip ospf database external
```

### OSPF Routes

```
show ip ospf route
```

Только OSPF маршруты в routing table:
```
show ip route ospf
```

### OSPF Interface

```
show ip ospf interface
```

Конкретный интерфейс:
```
show ip ospf interface eth1
```

### OSPF Border Routers

```
show ip ospf border-routers
```

### Clear OSPF Process

Restart OSPF:
```
restart ospf
```

## Troubleshooting

### Neighbor не формируется

Проверьте:

1. **IP connectivity**:
   ```
   ping <neighbor-ip>
   ```

2. **Subnet mask** совпадает

3. **Hello/Dead intervals** совпадают:
   ```
   show ip ospf interface eth1
   ```

4. **Authentication** совпадает:
   ```
   show ip ospf interface eth1
   ```

5. **Area ID** совпадает

6. **Network type** совпадает (broadcast vs point-to-point)

7. **MTU** совпадает:
   ```
   show interfaces ethernet eth1
   ```

### Neighbor в состоянии INIT/2WAY

**INIT** - получает Hello, но не видит свой Router ID в Hello от neighbor.

**2WAY** - нормально для broadcast сетей если роутер не DR/BDR.

Проверьте Router ID:
```
show ip ospf
```

### Routes не появляются

Проверьте:

1. **Neighbor в состоянии FULL**:
   ```
   show ip ospf neighbor
   ```

2. **Database** содержит LSA:
   ```
   show ip ospf database
   ```

3. **ABR** между areas:
   ```
   show ip ospf border-routers
   ```

4. **Area configuration** правильная

5. **Stub/NSSA** настроены на всех роутерах area

### High CPU usage

OSPF SPF calculation:

1. **Проверьте флapping** интерфейсов:
   ```
   show interfaces
   ```

2. **Tune SPF timers**:
   ```
   set protocols ospf timers throttle spf delay 1000
   set protocols ospf timers throttle spf initial-holdtime 5000
   set protocols ospf timers throttle spf max-holdtime 30000
   commit
   ```

3. **Используйте BFD** вместо коротких hello intervals

### Routing loops

Проверьте:

1. **Area 0** contiguous (непрерывна)

2. **ABR** подключены к Area 0

3. **Virtual links** настроены правильно (если нужны)

4. **Route summarization** не перекрывается

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

1. **Router ID** - всегда используйте loopback адреса
2. **Reference bandwidth** - настройте для Gigabit+ сетей
3. **Authentication** - используйте MD5 на всех интерфейсах
4. **Passive interfaces** - для LAN без OSPF neighbors
5. **Point-to-point** network type для VPN туннелей
6. **Area design**:
   - Area 0 - backbone
   - Area 1+ - edge/branch networks
   - Stub areas для leaf networks
7. **Summarization** на ABR для уменьшения LSA
8. **BFD** для быстрого failover
9. **Timers** - не изменяйте без необходимости
10. **Monitoring** - отслеживайте neighbor states

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

### Рекомендации

1. **MD5 Authentication**:
   ```
   set protocols ospf interface eth1 authentication md5 key-id 1 md5-key 'StrongPassword!'
   ```

2. **Passive interfaces** для LAN:
   ```
   set protocols ospf interface eth2 passive
   ```

3. **Firewall** для OSPF трафика:
   ```
   set firewall ipv4 input filter rule 100 action accept
   set firewall ipv4 input filter rule 100 destination address 224.0.0.5
   set firewall ipv4 input filter rule 100 protocol ospf

   set firewall ipv4 input filter rule 101 action accept
   set firewall ipv4 input filter rule 101 destination address 224.0.0.6
   set firewall ipv4 input filter rule 101 protocol ospf
   ```

4. **Ограничьте source** для OSPF пакетов:
   ```
   set firewall ipv4 input filter rule 100 source address 10.0.0.0/24
   ```

5. **Log adjacency changes**:
   ```
   set protocols ospf log-adjacency-changes detail
   ```

6. **Не используйте plaintext** authentication

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

### Optimization

1. **Reference bandwidth**:
   ```
   set protocols ospf auto-cost reference-bandwidth 10000
   ```

2. **SPF throttle timers** для нестабильных сетей:
   ```
   set protocols ospf timers throttle spf delay 1000
   set protocols ospf timers throttle spf initial-holdtime 5000
   set protocols ospf timers throttle spf max-holdtime 30000
   ```

3. **Summarization** на ABR:
   ```
   set protocols ospf area 1 range 192.168.0.0/16
   ```

4. **Stub areas** для уменьшения LSA:
   ```
   set protocols ospf area 1 area-type stub
   ```

5. **BFD** вместо коротких OSPF timers

## Сравнение с другими протоколами

### OSPF vs RIP

| Характеристика | OSPF | RIP |
|---------------|------|-----|
| Тип | Link-state | Distance-vector |
| Метрика | Cost (bandwidth) | Hop count |
| Hop limit | Нет | 15 |
| Конвергенция | Быстрая | Медленная |
| Масштабируемость | Высокая | Низкая |
| Сложность | Средняя | Простая |
| VLSM | Да | RIPv2 да |

### OSPF vs BGP

**OSPF** - для internal routing (IGP).
**BGP** - для external routing (EGP).

Часто используются вместе: OSPF internal, BGP для ISP connectivity.

## Следующие шаги

- [BGP](/docs/vyos/routing/vyos-bgp/) - для подключения к ISP
- [Static Routes](/docs/vyos/routing/vyos-static/) - backup для OSPF
- [BFD](/docs/vyos/routing/vyos-bfd/) - быстрое обнаружение отказов
- [VTI Interfaces](/docs/vyos/interfaces/vyos-vti/) - OSPF через VPN

