/ Linux Reviews / Networking / Kształtowanie Ruchu i Zaawansowany Routing HOWTO - en - pl


4.2. Routing dla wielu łącz/do wielu dostawców usług

Często spotyka się konfiugrację taką jak poniższa - w której mamy dwóch dostawców Internetu dla sieci lokalnej (lub czasami nawet pojedyńczej maszyny).

                                                                 ________
                                          +------------+        /
                                          |            |       |
                            +-------------+ Dostawca 1 +-------
        __                  |             |            |     /
    ___/  \_         +------+-------+     +------------+    |
  _/        \__      |     if1      |                      /
 /             \     |              |                      |
| Sieć lokalna  -----+ Router       |                      |     Internet
 \_          __/     |    Linuksowy |                      |
   \__    __/        |     if2      |                      \
      \__/           +------+-------+     +------------+    |
                            |             |            |     \
                            +-------------+ Dostawca 2 +-------
                                          |            |       |
                                          +------------+        \________

Zwykle w takiej konfiguracji pojawiają się dwa pytania.

4.2.1. Dostęp rozłączny (ang. split access)

Pierwsze to jak routować odpowiedzi na pakiety przychodzące od powiedzmy dostawcy pierwszego, z powrotem tą samą drogą (nie wykorzystując drugiego łącza).

Zdefiniujmy parę nazw symbolicznych. Niech $IF1 oznacza pierwszy interfejs (if1 na rysunku powyżej) a $IF2 drugi interfejs. Następnie niech $IP1 będzie adresem IP interfejsu $IF1 a $IP2 adresem IP skojarzonym z interfejsem $IF2. Następnie, niech $P1 oznacza adres IP pierwszego dostawcy a $P2 drugiego. Na koniec niech $P1_NET będzie siecią IP w której znajduje się $P1, a $P2_NET odpowiednio siecią IP w której jest $P2.

Należy stworzyć dwa dodatkowe wpisy w tabeli routingu, powiedzmy T1 i T2. Dodaje się je do /etc/iproute2/rt_tables. Następnie należy dodać odpowiednio routing w sposób jak poniżej:

         ip route add $P1_NET dev $IF1 src $IP1 table T1
         ip route add default via $P1 table T1
         ip route add $P2_NET dev $IF2 src $IP2 table T2
         ip route add default via $P2 table T2
       
Nic spektakularnego, tworzymy trasy do bramy i dodajemy trasę domyślną przez tą bramę - tak jakbyśmy mieli do czynienia z pojedyńczym dostawcą, z tym wyjątkiem, że mamy osobne tablice dla każdego dostawcy. Zauważ, że wystarczy samo wpisanie trasy - ponieważ mówi jak znaleźć dowolny host w danej sieci, obejmując również bramę tak jak w przykładzie powyżej.

Teraz należy skonfigurować główną tabelę routingu. Dobrym pomysłem jest kierować ruch do bezpośredniego sąsiada przez interfejs, którym ten sąsiad jest podłączony. Zwróć uwagę na argumenty 'src' - zapewniają że wybrany zostanie poprawny wychodzący adres IP.

           ip route add $P1_NET dev $IF1 src $IP1
           ip route add $P2_NET dev $IF2 src $IP2
         
Następnie należy dodać trasę domyślną:
           ip route add default via $P1
         
A na koniec skonfigurować tabele routingu. To one wybierają która tablica zostanie wybrana. Chcemy się upewnić, że wykonujemy routing interfejsem, który ma odpowiedni źródłowy adres IP:
           ip rule add from $IP1 table T1
           ip rule add from $IP2 table T2
         
Powyższy zestaw poleceń powoduje, że wszystkie odpowiedzi na ruch przechodzący przez dany interfejs, zostaną wysłane tym właśnie interfejsem.

Ostrzeżenie

Czytelnik Rod Roark zauważył: Jeśli $P0_NET to lokalna sieć a $IF0 to jej interfejs, warto dodać dodatkowe wpisy:

ip route add $P0_NET     dev $IF0 table T1
ip route add $P2_NET     dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo   table T1
ip route add $P0_NET     dev $IF0 table T2
ip route add $P1_NET     dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo   table T2                                      
'

Jest to oczywiście bardzo prosta konfiguracja. Będzie działała prawidłowo dla wszystkich procesów działających na routerze i dla wszystkich połączeń z sieci lokalnej (jeśli włączono translację adresów). Jeśli translacji nie włączono, to albo dostałeś osobne publiczne przestrzenie adresowe od obu dostawców, albo będziesz chciał robić translację adresów dla jednego z dostawców. W obu przypadkach musisz dodać reguły wybierające przez którego dostawcę routować ruch na podstawie adresów IP maszyn w sieci lokalnej (inicjujących ten ruch).

4.2.2. Rozkładanie obciążenia (ang. load balancing)

Drugie pytanie brzmi: jak rozłożyć obciążenie wychodzące na obu dostawców. Odpowiedzią jest: nie jest to specjalnie trudne, jeśli i tak masz już sytuację opisaną w punkcie powyżej.

Zamiast wybierać jednego z dostawców jako trasę domyślną, musisz wskazać obu. Domyślnie jądro będzie rozkładało ruch wychodzący pomiędzy dwie trasy domyślne. Konfiguruje się to w ten sposób:

           ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
           nexthop via $P2 dev $IF2 weight 1
         
Zapewni to opisaną funkcjonalność. Argumentem weight można dokładnie dostosować metrykę danego dostawcy, efektywnie zwiększając lub zmniejszając ilość ruchu przesyłanego przez niego na rzecz drugiego dostawcy.

Zwróć jednak uwagę, że równoważenie obciążenia nie będzie doskonałe, a co więcej bazuje na trasach - które przechowywane są w pamięci podręcznej. Innymi słowy, trasy do najczęściej odwiedzanych stron będą prowadziły zawsze przez tego samego dostawcę.

I jeszcze jedno - jeśli naprawdę chcesz coś takiego zastosować, prawdopodobnie powinieneś rzucić okiem na łatki Juliana Anastazowa, znajdujące się pod adresem jego strony, Powinny one ułatwić ci trochę konfigurację takiego podziału ruchu.


/ Linux Reviews / Networking / Kształtowanie Ruchu i Zaawansowany Routing HOWTO