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