View this PageEdit this Page (locked)Uploads to this PageHistory of this PageHomeRecent ChangesSearchHelp Guide

Routování s více tabulkami

Motivace


Typickým případem použití více tabulek pro routování je tzv. source-based routing, neboli routování závislé na zdrojové adrese paketu. Představme si následující situaci:

                +-----+     +-----+    +-----+
   Internet ====| AP1 |-----| AP2 |----| AP3 |==== Internet
                +-----+     +-----+    +-----+
                             | | |
                     klient 1  |  klient 2
                               |
                            klient 3


kde klient 1 má domluvený internet na AP1 a ostatní klienti mají internet na AP3 (autentizaci apod. zde neřešíme). Klient 1 by tedy chtěl, aby všechny ne-czfree pakety odcházely z AP2 na AP1, zatímco ostatní by raději AP3. Klasické nastavení default route na AP2 tedy nutně některého klienta zklame. Musíme proto na AP2 nastavit routování tak, aby záviselo na IP adrese klienta.

Prostředky


Potřebujeme balík iproute2, který je součástí většiny distribucí. Pokud náhodou není, seženeme na ftp://ftp.inr.ac.ru/ip-routing/ a nainstalujeme. Že je vše v pořádku poznáme tak, že příkaz ip route vypíše aktuální routovací tabulku.

Dále musíme mít podporu pokročilého routování v jádře. V menuconfig se to projeví takto:

  Networking options  --->
       ...
       [*] TCP/IP networking
           ...
       [*]   IP: advanced router
       [*]     IP: policy routing
       [*]       IP: use netfilter MARK value as routing key
       [*]       IP: fast network address translation



Princip


Routování se děje pomocí několika tabulek, které se vybírají na základě předem zadaných pravidel. Pravidla lze změnit pomocí příkazu ip rule:

#ip rule
0:	from all lookup local 
32766:	from all lookup main 
32767:	from all lookup default 

Na začátku jsou definována tři pravidla. První číslo znamená prioritu pravidla, čím nižší, tím dříve se pravidlo uplatní. První pravidlo říká, že pro všechny zdrojové adresy se hledá routování v tabulce s názvem local. Pokud tato tabulka neobsahuje žádnou položku, která by šla použít, uplatňují se další pravidla. V tomto případě se prohledává dále tabulka main a nakonec tabulka default.

Tabulka main odpovídá standardní tabulce, se kterou jsme byli zvyklí pracovat dosud. V podmínkách CZFree.Net se o ni obvykle stará zebra. Další tabulky jsou nové a na začátku jsou prázdné. Každá tabulka je identifikována svým číslem, ke kterému lze pro přehlednost přiřadit jméno. Přiřazení jmen k číslům je v souboru /etc/iproute2/rt_tables.

Řešení našeho problému bude následující:
1. Z tabulky main odstraníme default route (pokud tam je)
2. Vytvoříme dvě nové tabulky tab_ap1 a tab_ap3. První z nich bude obsahovat pouze default route k AP1 a druhá bude obsahovat pouze default route k AP3.
3. Vytvoříme nová pravidla tak, aby se nejprve uplatnila tabulka main. Ta je obsluhována zebrou a zajišťuje routování v rámci CZFree. Pokud se zde nenajde odpovídající cesta, použije se podle IP adresy klienta buď tabulka tab_ap1 nebo tab_ap3, která obsahuje pouze default route. Default route se uplatní vždy, takže dalších pravidel netřeba.


Postup


Předpokládejme, že AP mají IP adresy, které použijeme jako gateway $IP_AP1 a $IP_AP3 a klienti mají adresy $IP_KLIENT1, $IP_KLIENT2 a $IP_KLIENT3. Následuje postup k jednotlivým bodům.

1. Pokud používáme zebru, odstraníme ze zebra.conf default route (0.0.0.0/0), pokud tam je. V případě statického routování rovněž odstraníme default route (závisí na distribuci)

2. Vytvoříme jména tabulek tím, že do /etc/iproute2/rt_tables přidáme řádky:

200 tab_ap1
201 tab_ap3

3. Následující skript dokoná zbytek (za # je komentář)

#! /bin/bash
## Vytvoříme default routes v nových tabulkách
ip route add default via $IP_AP1 table tab_ap1
ip route add default via $IP_AP3 table tab_ap3

## Vytvoříme pravidla
# CZFree.Net routování
ip rule add table main prio 200
# Routování pro klienta 1
ip rule add from $IP_KLIENT1 table tab_ap1 prio 201
# Zbývající klienti
ip rule add table tab_ap3 prio 300

## Můžeme smazat přebytečná pravidla, která tam byla předtím
ip rule del prio 32766
ip rule del prio 32767

## Tohle je povinné
ip route flush cache

#### KONEC


Pokud jsme udělali všechno dobře, pravidla by měla vypadat takto

#ip rule
0:	from all lookup local 
200:	from all lookup main 
201:	from 10.128.xx.xx lookup tab_ap1
300:	from all lookup tab_ap2

#ip route ls table tab_ao1
default via 10.128.xx.xx dev wlanX

#ip route ls table tab_ap3
default via 10.128.yy.yy dev wlanY 

Závěr

Popsaný postup lze samozřejmě upravit pro různé další situace. Routování nemusí být závislé jen na zdrojové adrese paketu, pravidla mohou obsahovat další různé podmínky, např. číslo portu apod. Pokud je klientů víc, je dobré si vytvořit pro každou skupinu jednu malou podsíť a napsat routovací pravidlo pro celou podsíť:

ip rule add from 10.128.aa.bb/MM table tab_ap3 prio 202

N?které zdroje zapisují pravidla bez udání priority. Tento způsob je historický a nedoporučuje se. Také se nedoporučuje definovat více pravidel se stejnou prioritou, i když to Linux umožňuje.

Radek
radkovo (na) centrum (tecka) cz