Több internetvonal megosztása egy szerverrel iptables/netfilter és iproute2 segítségével Készítette: Mészáros Károly (MEKMAAT:SZE)
[email protected] 2007-05-22 Az ábrán látható módon a LAN-ban lévő gépek számra egy szerver átjáró szerepet tölt be, de a szerver két internetvonalat oszt meg a LAN munkaállomásai számára.
ISP1
A
ROUTER
ISP2
Internet
A A Motiváció Egy kisebb intézmény általában nem tud megfizetni egy komoly nagy sávszélességű és megbízható internet vonalat, viszont kettő vagy több aszimmetrikus (kábelnet, ADSL stb.) vonal már megfizethető 1-5 Mbit/s sávszélességgel. Ha a két internet vonal esetén eltérő szolgáltatókat és technológiákat is vállasztunk, akkor még hibatűrővé is tehetnénk a rendszerünket. Napjainkben is használnak több internetvonalat egy hálózat munkaállomásai számára, de általában internetvonalanként legaláb egy szervert alkalmaznak, ami a mai szerver teljesítmények esetében pazarlás. Ezek a szerverek valamilyen proxy szervert futtatnak, és a LAN munkaállomásain eltérő proxy-t állítanak be. Ez több szempontból sem kielégítő megoldás: ●
Csak olyan forgalmak esetében működik, amit a proxy szerver támogat.
●
Nincs dinamikus terheléselosztás, az egyik csoport az egyik vanalat a másik csoport pedig a másik vonalat használja.
●
Több szervert kell alkalmazni. Manapság már ez annyira nem probléma, mert nagyon elterjedtek a szerver-virtualizációs technikák (Xen, Vmware stb.).
Iproute2 és netfilter párossal történő megoldás által biztosított lehetőségek ●
két vagy több internetvonal közötti dinamikus forgalomelosztás (összeköttetés-orientált)
●
hibatűrés (ez még további műveleteket igényel)
●
szétválasztás cél vagy forráscím alapján
Két vagy több internetvonal közötti forgalomelosztás Ez a legfontosabb adottsága ennek a rendszernek. Ha a LAN-ban egy felhasználó használja az internetet, akkor egyszerre használhatja mind a két vonalat. Ez történne ideális esetben, a gyakorlatban azonban ez két vagy több általános internetvonal esetében nem oldható meg. Hogy miért nem, az majd később lesz látható. Viszont egy felhasználó több TCP összeköttetésen keresztül is kommunikálhat egyszerre, főleg akkor, ha web szerverekkel tart fent kapcsolatot, ebben az esetben viszont egyfajta látszólagos forgalomelosztás alakul ki. Ennek a jótékony hatása még inkább megjelenik, ha több felhasználó használja az internetet.
Hibatűrés Mindenki tapasztalhatja, hogy a mai internetszolgáltatók által biztosított szolgáltatások nem túl stabilak. Hetente kéthetente megszakad a kapcsolat, és ilyenkor a felhasználók keményen hangot adnak elégedetlenségüknek, ami a rendszergazdáknak nem esik túl jól. (A hibatűrésre még nincs a gyakorlatban is működő megoldásom, de ötlet van.)
Szétválasztás cél vagy forráscím alapján Ha gyorsak az internetvonalaink, akkor nem biztos, hogy a dinamikus forgalomelosztás a jó megoldás számunkra. Ezzel a rendszerrel akár forrás IP cím vagy MAC cím alapján megmondhatjuk napszakokra bontva, hogy melyik internet vonalat használja az adott felhasználó. De ami még fontosabb lehet, hogy cél IP alapján is meg tudjuk mondani, hogy melyik internetvonalon menjen ki a forgalom. Ez oktatási intézmények számára lehet fontos, ha egy
internetvonalat fenntartanak oktatási célokra és egy internetvonalat általános forgalmak számára.
Az eszközök Hihetetlen, de fizetős megoldást megvalósító szoftvert jelenleg nem ismerek csak ingyenes megvalósítást. Ez a két szoftver tulajdonképpen linux kernel komponens: ●
netfilter,
●
iproute2.
Mind a két funkció a mai linux kernelekben alapértelmezésként megtalálható.
Iproute2 Minden mai operációs rendszer, ami TCP/IP protokollrendszert alkalmazza a hálózati kommunikáció során tartalmaz egy útválasztási mechanizmust, aminek a során az operációs rendszer a saját általában automatikusan felépített útválasztó tábláját vizsgálja át és dönti el, hogy melyik hálózati interfészen keresztül kell az IP csomagot kiküldeni. Ez az útválasztó tábla alapértelmezésként a közvetlenül kapcsolódó hálózatokat tartalmazza, és beállítások alapján az alapértelmezett átjárót, de csak egy aktív alapértelmezett átjárót. Viszont, ha több internetvonalat szeretnénk kapcsolni egy szerverhez, akkor több alapértelmezett átjáró kellene. Az iproute2 arra ad lehetőséget, hogy több útválasztó tábla legyen egy linux rendszeren egy időben és mindegyikben egy aktív alapértelmezett átjáró. Az útválasztó táblákat a linux kernel prioritásos sorba rendezi, de megszabhatunk szabályokat (rule) is, ami alapján a kernel kiválsztja célirányosan a neki megfelelő táblát.
Netfilter A netfilter linux kernelekben alapértelmezéskén jelen lévő csomagszűrő komponens. Nagyon gyorsnak és hatékonynak mondhatjuk, mert kernelszinten működik. A netfilter több szabályrendszert tartalmaz, amelyeknek megvan a maguk funkciója. Ezek a szabályrendszerek közül számunkara a PREROUTING és a POSTROUTING a fontos. Minden szabályrendszerben vannak táblák és minden táblához tartoznak célok (targetek).
PREROUTING és a POSTROUTING szabályrendszer
A kernel még az útválasztási mechanizmus előtt végigviszi a beérkező csomagot a PREROUTING szabályrendszeren, pontosabban annak minden tábláján. Amikor a csomag kifelé megy a kernel
szempontjából, akkor minden útválasztási folyamat után a POSTROUTING szabályrendszeren, annak minden tábláján halad keresztül.
Táblák a szabályrendszerekben
Mind a két szabályrendszerben van egy mangle és egy nat tábla, kiértékelésüket tekintve ebben a sorrendben. A mangle táblában az IP csomagok paramétereit változtathatjuk, míg a nat táblában NAT-olást végezhetünk (Source NAT: forrás IP változtatás és Destination NAT: cél IP változtatás). A feladatunk végrehajtásához a PREROUTING szabályrendszerben a mangle táblát, a POSTROUTING szabályrendszerben pedig a nat táblát kell használnunk.
Célok (targetek) a netfilterben
Minden táblának megvannak a maguk targetjei. A számunkra fontosak: ●
mangle táblában:
MARK, CONNMARK
●
nat táblában:
SNAT
MARK és a CONNMARK
A MARK target segítségével az IP csomagokat egy pozitív egész számmal tudjuk megjelölni későbbi
feldolgozás
megkönnyítése
érdekében.
Viszont
nélkülözhetetlen
a
céljaink
megvalósításához. Az iproute2 és a netfilter közötti együttműködést ezzel az eszközzel tudjuk megvalósítani. A CONNMARK hasonló a MARK-hoz, de nem ugyan az, egy újabb pozitív egész számmal ábrázolható paraméter, de ha egy kapcsolathoz tartozó csomagot megjelölök a CONNMARK segítségével, akkor onnantól kezdve a kapcsolathoz tartozó összes csomag meg lesz jelölve ezzel a CONNMARK értékkel. Erről a netfilter gondoskodik. Meg kell azonban jegyezni, hogy ez az eszköz nem alkalmas az iproute2 és a netfilter együttműködésének megvalósítására.
Modulok
A netfilter úgy találták ki, hogy modulokkal bővíthető legyen a funkcionalitása. Manapság már rengeteg modul áll rendelkezésünkre. Ezek közül a számunkra fontosak: statistic, state, mark, connmark. Statistic modul
Lehetőséget
biztosít
round-rubin
vagy
random
csomagilleszkedés
megvalósítására.
A
terheléselosztáshoz rendkívül hasznos lehet. State modul A csomagok státusza alapján alakíthatunk ki ennek a modulnak a segítségével szabályokat. Ismert státuszok: NEW, ESTABLISHED, RELATED, INVALID. Mark modul A csomagokhoz rendelt MARK értékek alapján alakítható ki szabály ezzel a modullal. Connmark modul A csomagokhoz rendelt CONNMARK értékek alapján alakítható ki szabály ezzel a modullal.
Gyakorlati megvalósítás a terheléselosztás esetén PREROUTING szabályrendszerben: 1. Jelöljünk meg minden páratlan számú új kapcsolat kialakítását kezdeményező csomagot 1es CONNMARK értékkel a statistic modul segítségével. 2. Jelöljünk meg minden páros számú új kapcsolat kialakítását kezdeményező csomagot 2-es CONMARK értékkel a statistic modul segítségével. 3. Jelöljünk meg minden 1-es és 2-es CONNMARK értékkel megjelölt csomagot rendre 1-es és 2-es MARK értékkel. Erre azért van szükség, mert az iproute2 programcsomag ezt az értéket tudja értelmezni.
POSTROUTING szabályrendszerben: 1. Az egyik internet felőli interfészen kimenő összes csomagot natoljuk az interfészhez rendelt IP-címre. 2. A másik internet felőli interfészen kimenő összes csomagot natoljuk az interfészhez rendelt IP-címre.
Útválasztó táblák definiálása pripritással /etc/iproute2/rt_tables fájl tartalma 200 201
Route táblákat beállító szkript #! /bin/bash # chkconfig: 2345 11 11 # description: route ip route add default via dev table ip rule add fwmark 1 table ip route add default via dev table ip rule add fwmark 2 table
ROUTOLÁS bekapcsolása echo "1" > /proc/sys/net/ipv4/ip_forward