Vyatta - sumaryzacja w OSPF

Posted on pon 13 wrzesień 2010 in Routing

Vyatta to ciekawym system open source dla routerów. Jest to rozwiązanie stosunkowo niedrogie (zwłaszcza porównując do cen routerów sprzętowych) i niezwykle skalowalne. Zamiast opisu całego systemu przedstawię na szybko jak skonfigurować go do pracy jako router OSPF i przy okazji opowiem troszkę o sumaryzacji sieci.

Sumaryzacja?

Sieć z routingiem opartym o OSPF możemy podzielić na tzw. obszary (ang. Area). Robi się to głównie ze względów wydajnościowych - każdy router OSPF zna pełną topologię swojego obszaru i na tej podstawie wylicza optymalne trasy do wszystkich podsieci w obszarze. Wyobraźmy sobie jak wiele informacji taki router posiada w przypadku gdy mamy np. 40 routerów. Co więcej kolejnego przeliczenia tras musi dokonać przy każdej zmianie topologii, co sprawia, że maszyna musi się nieźle napoić gdy np. wypadnie jakiś link lub któreś z urządzeń odmówi posłuszeństwa.

Co w takim razie daje nam podział na obszary? Jak wspomniałem każdy router w obszarze wie wszystko o swoim obszarze. Załóżmy, że mamy dwa obszary backbone 0.0.0.0 i dodatkowy obszar o numerze 0.0.0.1. Każdy router przyłączony do obszaru 0.0.0.0 zna pełną topologię swojego obszaru, podobnie każdy router w obszarze 0.0.0.1. Wymianę informacji pomiędzy obszarami zapewnia tzw. ABR - Area Border Router. Na podstawie tego, co już sobie wyjaśniliśmy, kilka faktów staje się dość oczywistych:

  • ABR przyłączony jest do obu obszarów (tzn. ma interfejsy skonfigurowane odpowiednio dla obszaru 0.0.0.0 i 0.0.0.1)
  • Wie wszystko o obu obszarach
  • Wykonuje mnóstwo pracy, więc jest to z reguły nieco mocniejsza maszyna niż pozostałe ;)

Wspomniałem, że podziału na obszary dokonuje się ze względów wydajnościowych. Otóż z jednego obszaru do drugiego wstrzykiwane są jedynie trasy, nie zaś pełna topologia sieci. W związku z tym jeżeli zmiany jakie zaszły w jednym obszarze nie powodują całkowitego "wypadnięcia" trasy (np. zmieniła się trasa do danej podsieci, ale sieć jest osiągalna), to dla routerów z pozostałych obszarów wszystko pozostaje bez zmian. Gdyby były w jednym obszarze, musiałyby wszystkie przeliczyć swoje trasy.

Ok. Czyli wszystko fajnie. Ale teraz wyobraźmy sobie, że mamy sporo małych podsieci (np. linki p-p zaadresowane /32). Tablice routingu zaczynają robić się duże. Co więcej - wyobraźmy sobie, że mamy w sieci koncentrator PPPoE - każdy użytkownik to kolejna podsieć /32 i kolejny wpis w tablicy routingu. Taki użytkownik łączy się z usługą i rozłącza a sieć pojawia się i znika. Dla OSPF'a to lekka masakra :) I tu z pomocą przychodzi nam sumaryzacja - ABR potrafi skleić mniejsze podsieci w jedną większą i taką trasę ogłaszać do obszaru - ale uwaga! Tylko ABR - w obrębie obszaru zmiany w topologii i podsieci nadal będą widoczne. Wyobraźmy sobie, że mamy w obszarze 0.0.0.1 takie podsieci:

  • 192.168.10.0/28
  • 192.168.10.16/28
  • 192.168.10.32/28
  • ....
  • 192.168.10.240/28

Na ABR możemy je z zsumaryzować do 192.169.10.0/24 i tak ogłosić do obszaru 0.0.0.0. W efekcie routery w obszarze 0 będą miały trasę do jednej sieci 192.168.10.0/24 a nie 16 wpisów prowadzących do podsieci /28. ABR sobie poradzi z przeroutowaniem pakietu do danej podsieci bo ma dokładniejsze wpisy (z maskami /28) niż wpis /24. Fajnie. Wyobraźmy sobie, że podsieć np. 192.168.10.32/28 staje się nieosiągalna. Co robi ABR kiedy odbierze pakiet adresowany do tej podsieci? To co powinien - nie znajduje wpisu /28, przegląda tablice routingu dalej i znajduje /24 ale okazuje się, że prowadzi on do Null, czyli donikąd. Pakiet jest odrzucany i wszystko kończy się tak jak powinno.

Tyle teorii

Vyatta - sumaryzacja ospf

Załóżmy, że mamy dwa obszary, w których skonfigurowane są takie sieci:

OSPF areas

Konfiguracja może nie szczególnie szczęśliwa, ale tak to wygląda w mojej testowej sieci. Sieci /32 to interfejsy loopback na routerach.

Konfiguracja OSPF na ABR wygląda tak:


root@vyatta1# show protocols ospf
 area 0.0.0.0 {
     area-type {
         normal
     }
     network 10.0.0.224/28
     network 172.30.30.6/32
 }
 area 0.0.0.1 {
     network 192.168.12.0/30
     network 192.168.13.0/30
 }
 parameters {
     abr-type cisco
     router-id 172.30.30.6
 }
[edit]
root@vyatta1#

Router do obszaru 0 ogłasza sieci: 10.0.0.244/28 oraz 172.30.30.6/32 natomiast do obszaru 1 sieci 192.168.12.0/30 i 192.168.13.0/30. Sumaryzacja na chwilę obecną jest wyłączona.

Przyjrzyjmy się tablicy routingu na naszym ABR:


root@vyatta1# run show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

O   0.0.0.0/0 [110/1] via 10.0.0.238, 02:11:05
S>* 0.0.0.0/0 [2/0] via 10.0.0.238, eth0
O>* 10.0.0.192/30 [110/20] via 10.0.0.238, eth0, 02:11:06
O>* 10.0.0.196/30 [110/30] via 10.0.0.238, eth0, 02:11:06
O   10.0.0.224/28 [110/10] is directly connected, eth0, 02:11:19
C>* 10.0.0.224/28 is directly connected, eth0
O>* 10.0.0.240/28 [110/30] via 10.0.0.238, eth0, 02:11:06
C>* 127.0.0.0/8 is directly connected, lo
O>* 172.30.30.2/32 [110/30] via 10.0.0.238, eth0, 02:11:06
O>* 172.30.30.3/32 [110/20] via 10.0.0.238, eth0, 02:11:06
O>* 172.30.30.4/32 [110/20] via 10.0.0.236, eth0, 02:11:02
O   172.30.30.6/32 [110/10] is directly connected, lo, 02:11:22
C>* 172.30.30.6/32 is directly connected, lo
O>* 172.30.31.1/32 [110/20] via 192.168.12.2, eth1, 02:09:05
O>* 172.30.31.2/32 [110/20] via 192.168.13.2, eth2, 02:07:25
O   192.168.12.0/30 [110/10] is directly connected, eth1, 02:11:18
C>* 192.168.12.0/30 is directly connected, eth1
O   192.168.13.0/30 [110/10] is directly connected, eth2, 02:11:21
C>* 192.168.13.0/30 is directly connected, eth2
O>* 192.168.14.0/30 [110/20] via 192.168.12.2, eth1, 02:07:25
  *                          via 192.168.13.2, eth2, 02:07:25
[edit]

Jak wspomniałem ABR ma pełną informację o wszystkich obszarach do których jest przyłączony. Natomiast do obszaru 1 wstrzykuje jedynie trasy do podsieci z obszaru 0 i vice versa. Poniżej jeszcze tablica routingu routera z obszaru 0. Jak widać posiada wszystkie trasy, łączenie z tymi obszaru 0:


vyatta2:~# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route

O>* 0.0.0.0/0 [110/1] via 192.168.12.1, eth3, 00:07:09
O>* 10.0.0.192/30 [110/30] via 192.168.12.1, eth3, 00:00:07
O>* 10.0.0.196/30 [110/40] via 192.168.12.1, eth3, 00:00:07
O>* 10.0.0.224/28 [110/20] via 192.168.12.1, eth3, 00:00:07
O>* 10.0.0.240/28 [110/40] via 192.168.12.1, eth3, 00:00:07
C>* 127.0.0.0/8 is directly connected, lo
O>* 172.30.30.2/32 [110/40] via 192.168.12.1, eth3, 00:00:07
O>* 172.30.30.3/32 [110/30] via 192.168.12.1, eth3, 00:00:07
O>* 172.30.30.4/32 [110/30] via 192.168.12.1, eth3, 00:00:07
O>* 172.30.30.6/32 [110/20] via 192.168.12.1, eth3, 00:00:07
C>* 172.30.30.7/32 is directly connected, lo
O   172.30.31.1/32 [110/10] is directly connected, lo, 00:07:15
C>* 172.30.31.1/32 is directly connected, lo
O>* 172.30.31.2/32 [110/20] via 192.168.14.2, eth4, 00:05:06
O   192.168.12.0/30 [110/10] is directly connected, eth3, 00:07:21
C>* 192.168.12.0/30 is directly connected, eth3
O>* 192.168.13.0/30 [110/20] via 192.168.12.1, eth3, 00:07:10
O   192.168.14.0/30 [110/10] is directly connected, eth4, 00:07:15
C>* 192.168.14.0/30 is directly connected, eth4

Trochę tego jest. Skonfigurujmy w takim razie sumaryzację dla sieci z obu obszarów. Mamy podsieci:

- obszar 0: 172.30.30.2/32-172.30.30.6/32 - sumaryzuje się nam to ładnie do 172.30.30.0/29 (oczywiście można zostawić miejsce na zapas, ale niech będzie tak) - obszar 0: 10.0.0.224/28, 10.0.0.240/28, 10.0.0.192/30, 10.0.0.196/30 - co może równie dobrze dać 10.0.0.192/26 - zgadza się? - obszar 1: 192.168.12.0/30, 192.168.13.0/30, 192.168.14.0/30 - tu nienajlepiej ale od biedy można zrobić z tego 192.168.0.0/20 - obszar 1: 172.30.31.1 i 172.30.31.2 - zsumaryzujemy do 172.30.31.0/29

To do roboty:


[edit]
root@vyatta1#set protocols ospf area 0.0.0.0 range 10.0.0.192/26
[edit]
root@vyatta1#set protocols ospf area 0.0.0.0 range 172.30.30.0/29
[edit]
root@vyatta1#set protocols ospf area 0.0.0.1 range 172.30.31.0/29
[edit]
root@vyatta1#set protocols ospf area 0.0.0.1 range 192.168.0.0/20
[edit]
root@vyatta1#commit
root@vyatta1# show protocols ospf
 area 0.0.0.0 {
     area-type {
         normal
     }
     network 10.0.0.224/28
     network 172.30.30.6/32
     range 10.0.0.192/26 {
     }
     range 172.30.30.0/29 {
     }
 }
 area 0.0.0.1 {
     network 192.168.12.0/30
     network 192.168.13.0/30
     network 192.168.14.0/30
     range 172.30.31.0/29 {
     }
     range 192.168.0.0/20 {
     }
 }
 parameters {
     abr-type cisco
     router-id 172.30.30.6
 }
[edit]
root@vyatta1#save

Ok. Zajrzyjmy teraz do tablicy routingu ABR:


root@vyatta1# run show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route

O   0.0.0.0/0 [110/1] via 10.0.0.238, 02:22:09
S>* 0.0.0.0/0 [2/0] via 10.0.0.238, eth0
O>* 10.0.0.192/26 [110/0] is directly connected, Null0, bh, 02:18:29
O>* 10.0.0.192/30 [110/20] via 10.0.0.238, eth0, 02:22:10
O>* 10.0.0.196/30 [110/30] via 10.0.0.238, eth0, 02:22:10
O   10.0.0.224/28 [110/10] is directly connected, eth0, 02:22:23
C>* 10.0.0.224/28 is directly connected, eth0
O>* 10.0.0.240/28 [110/30] via 10.0.0.238, eth0, 02:22:10
C>* 127.0.0.0/8 is directly connected, lo
O>* 172.30.30.0/29 [110/0] is directly connected, Null0, bh, 02:18:29
O>* 172.30.30.2/32 [110/30] via 10.0.0.238, eth0, 02:22:10
O>* 172.30.30.3/32 [110/20] via 10.0.0.238, eth0, 02:22:10
O>* 172.30.30.4/32 [110/20] via 10.0.0.236, eth0, 02:22:06
O   172.30.30.6/32 [110/10] is directly connected, lo, 02:22:26
C>* 172.30.30.6/32 is directly connected, lo
O>* 172.30.31.0/29 [110/0] is directly connected, Null0, bh, 02:18:29
O>* 172.30.31.1/32 [110/20] via 192.168.12.2, eth1, 02:20:09
O>* 172.30.31.2/32 [110/20] via 192.168.13.2, eth2, 02:18:29
O>* 192.168.0.0/20 [110/0] is directly connected, Null0, bh, 02:18:29
O   192.168.12.0/30 [110/10] is directly connected, eth1, 02:22:22
C>* 192.168.12.0/30 is directly connected, eth1
O   192.168.13.0/30 [110/10] is directly connected, eth2, 02:22:25
C>* 192.168.13.0/30 is directly connected, eth2
O>* 192.168.14.0/30 [110/20] via 192.168.12.2, eth1, 02:18:29
*                          via 192.168.13.2, eth2, 02:18:29
[edit]
root@vyatta1#

Zwracam uwagę na wpisy gdzie jako interfejs pojawia się Null0. To wpisy dotyczące naszej sumaryzacji. Jeśli Router nie znajdzie dokładniejszego wpisu dla adresu docelowego, skieruje pakiet do interfejsu Null0, czyli najzwyczajniej w świecie go odrzuci.

Przyjrzyjmy się teraz tablicy routingu na routerze w obszarze 1:


vyatta2:~# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route

O>* 0.0.0.0/0 [110/1] via 192.168.12.1, eth3, 00:02:56
O>* 10.0.0.192/26 [110/40] via 192.168.12.1, eth3, 00:02:57
C>* 127.0.0.0/8 is directly connected, lo
O>* 172.30.30.0/29 [110/40] via 192.168.12.1, eth3, 00:02:57
O   172.30.31.1/32 [110/10] is directly connected, lo, 00:03:02
C>* 172.30.31.1/32 is directly connected, lo
O>* 172.30.31.2/32 [110/20] via 192.168.14.2, eth4, 00:00:53
O   192.168.12.0/30 [110/10] is directly connected, eth3, 00:03:08
C>* 192.168.12.0/30 is directly connected, eth3
O>* 192.168.13.0/30 [110/20] via 192.168.12.1, eth3, 00:02:57
O   192.168.14.0/30 [110/10] is directly connected, eth4, 00:03:02
C>* 192.168.14.0/30 is directly connected, eth4

Widać różnicę w stosunku do stanu sprzed wprowadzenia zmian? Części tras brakuje, w ich miejsce pojawiły się:


O>* 172.30.30.0/29 [110/40] via 192.168.12.1, eth3, 00:02:57
O>* 10.0.0.192/26 [110/40] via 192.168.12.1, eth3, 00:02:57

Właśnie nauczyliśmy się sumaryzować podsieci w OSPF :)