Debian Squeeze Route táblák útvonalválasztás

Ha egyetlen internet vonalunk van, akkor teljesen egyszerű dolgunk van. Viszont ha 2 vagy több internet vonallal rendelkezünk máris ránk szakad egy csomó probléma. Lehet terhelés elosztást csinálni(load balancing), de ez igazán csak két fix ip-s internet vonal esetén jó. Mi abban a szerencsétlen esetben járunk, hogy a két internet vonalunkból csak az egyik fix ip-s. A kliensek nagy részének nincs szüksége a fix-ip-re. Azt szeretnénk elérni, hogy megmondhassuk a klienseknek, hogy melyik mehetnek

Amikor bekötöttük a két internet vonalat szerverbe, a nagy öröm gyorsan elfog fogyni, amikor rájövünk, hogy nincs is internetünk gyakorlatilag a szerveren. A probléma az útvonalválasztásnál keresendő. Ha kiadjuk a route -n parancsot akkor furcsa dolgot fogunk találni. A flags oszlopban ha figyeljük két olyan sorunk van amiben UG paraméter szerepel. Ez azt takarja csak, hogy két átjárónk van a szerverben, magyarul a két internet vonal átjárója. A szerencsétlen kliensek és a szerver se tudja, így eldönteni, hogy merre is menjenek a csomagok.

Azt a trükköt fogjuk elkövetni, hogy létrehozunk egy új táblát és ha az új internetvonalunkat akarjuk használni, akkor erre az új táblára küldjük az csomagokat. Ha nem küldjük oda, akkor pedig minden megy a régi netünkre alapértelmezetten. Persze a szerveren is a régi net marad alapértelmezetten. Így máris lehet két gateway-ünk. Egyik a fő route táblában, a másik pedig az általunk létrehozottban.

Első lépésben az /etc/iproute2/rt_tables fájlt egészítsük ki mondjuk ezzel a sorral: 3 ujnet A hármas lesz az azonosítója az új internetvonalunknak.

Azt kell tudni, hogy minden újraindítás vagy /etct/init.d/networking restart parancs után ez a tábla felülíródik. Mi azt fogjuk elkövetni, hogy létrehozunk egy fájlt amit berakunk az /etc/network/if-up.d mappába. Így ha egy hálókártyánk feléled, utána lefut a script és a mi új beállításaink lesznek érvényesek.

Gyűjtsünk össze információkat, az internet vonalainkról.
Adjuk ki a route -n és ifconfig parancsokat és jegyzeteljük fel az ip címeket:

réginet ujnet
address 192.168.64.4 address 192.168.0.100
network 192.168.64.0 network 192.168.0.0
gateway 192.168.64.254 gateway 192.168.0.1
broadcast 192.168.64.255 broadcast 192.168.0.255
netmask 255.255.255.0 netmask 255.255.255.0

Az ne zavarjon meg senkit se, hogy most két routernek írtam fel az információit, írhattam volna hasra ütésszerűen két netes ip címet is, akár 195.143.232.32 csak ez volt a teszt rendszerünkben a példa és ezt másoltam le. Tessék figyelni a netmask-ra, mert ezen könnyen el lehet csúszni sokszor a szolgáltató ad /27-et vagy /28-at is akár nem mindig ilyen szép /24 van!

Hozzuk létre a fájlt, az alábbi tartalommal. Először törüljük a route táblából az új net vonalunk, viszont a régit békén hagyjuk. Legyen eth4 az új internet vonalunk!

#!/bin/bash
route del -net 192.168.0.0 netmask 255.255.255.0 dev eth4
ip route del 192.168.0.0/24 dev eth4 table ujnet
ip rule del from 192.168.0.100 table ujnet
ip route del default via 192.168.0.1 dev eth4
ip route del default via 192.168.0.1 dev eth4 table ujnet
ip route del 10.0.0.0/16 dev eth1 table ujnet
ip route del 10.1.0.0/16 dev eth2 table ujnet
ip rule del lookup ujnet

Hozzuk létre az ujnet táblánkat, adjuk hozzá a másik két hálókártyánkat, állítsuk be a gateway-nek az új netünket és adjuk meg azonosítónak a 3-ast(a következő bekezdés is még az előző fájlba kerül bele).

# ujnet tabla letrehozasa:
ip route add 192.168.0.0/24 dev eth4 src 192.168.0.100 table ujnet
ip route add 192.168.0.0/24 dev eth4 src 192.168.0.100
ip route add 10.0.0.0/16 dev eth1 table ujnet
ip route add 10.1.0.0/16 dev eth2 table ujnet
ip rule add from 192.168.0.100 table ujnet
ip route add default via 192.168.0.1 table ujnet
ip rule add fwmark 3 table ujnet
ip route flush cache

Miután ezekkel megvagyunk szükség lesz módosítani a tűzfalunkat is. Vegyük fel az új netvonalunkat a tűzfalunk elején: IF_UJNET="eth4" Csak az internetet szeretnénk biztosítani rajta a klienseinknek, így nem kell túl sok helyen bővíteni.

Tiltsuk a dhcp-t kifele:
$IPTABLES -A INPUT -i $UJNET -p udp -s $NET_ALL --dport 67:68 -j DROP

Blokkoljuk az internet felől jövő kéréseket:
$IPTABLES -A INPUT -i $IF_ADSL -j DROP

Az alábbi sorokat mi nem a tűzfal fájlunkba, hanem a "route táblás" fájlunk végére tettük. Abból a megfontolásból, mert a route táblát módosítani csak, akkor van szükség, ha két netvonalunk van, ha nincs, akkor nem kell lefuttatni se. Így ha megszűnik az egyik netvonalunk, akkor csak ezt a fájlt kell eltüntetni. Így célszerű együtt kezelni őket, viszont ugye ez a fájl mindig lefut ha hálókártyákkal módosítás történt (restart vagy ifup, ifdown). Ez a szabály jelöli meg a csomagokat a 3-as azonosítóval, hogy az útvonalválasztáskor a 3-as azonosítóval rendelkező ujnet táblára érkezzenek az adatcsomagok.

#rendszergazda halozat
iptables -t mangle -D PREROUTING -s 10.0.130.0/16 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -s 10.0.130.0/16 -j MARK --set-mark 3

Innentől már készen is vagyunk és már csak a proxy-t kell beállítani, hogy minden szép és jó legyen. Viszont előfordulhat az az eset, hogy kiakarjuk kerülni a proxy-t, ezt a 80-as porton tehetjük meg, akkor ezeket írjuk be a tűzfalba:

$IPTABLES -t nat -A PREROUTING -p tcp -s 10.0.130.0/16 --dport 80 -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -p tcp -s 10.0.130.0/16 --dport 80 -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -p tcp -s 10.0.130.0/16 --dport 80 -j ACCEPT

Egyéb érdekes információk:

Az útvonalkeresés a route táblákon úgy néz ki, hogy az ip rule list mentén fut végig az útvonal keresés, majd ha a route táblákban talál egyezést akkor vége, különben fut tovább a többi táblán.

Ha megszeretnénk nézni a rule list tartalmát:

ip rule list

Fő route tábla tartalma:

route -n

vagy:

ip route list

ujnet tábla lekérdezése:

ip route list table ujnet

Adsl-nél ppp0 interfészen nincs default gateway. Helyette 0.0.0.0 értékek szerepelnek és így néz ki:

Destination Gateway Genmask Flags Metric Ref Use Iface
82.34.89.123 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
10.1.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
10.0.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 ppp0

Tesztelni egyébként, hogy melyik net vonalat használja aktuálisan a szerver egyszerűen a traceroute www.google.com kiadásával is ellenőrizhetjük.

Lehet a másik irányba befelé és traceroute-olni ezen az oldalon: [link]

Sose tudja az ember a netmaskokat, én legalábbis mindig elfelejtem őket, így jól jön a puska:

Netmask Netmask (binary) CIDR Notes
255.255.255.255 11111111.11111111.11111111.11111111 /32 Host (single addr)
255.255.255.254 11111111.11111111.11111111.11111110 /31 Unuseable
255.255.255.252 11111111.11111111.11111111.11111100 /30 2 useable
255.255.255.248 11111111.11111111.11111111.11111000 /29 6 useable
255.255.255.240 11111111.11111111.11111111.11110000 /28 14 useable
255.255.255.224 11111111.11111111.11111111.11100000 /27 30 useable
255.255.255.192 11111111.11111111.11111111.11000000 /26 62 useable
255.255.255.128 11111111.11111111.11111111.10000000 /25 126 useable
255.255.255.0 11111111.11111111.11111111.00000000 /24 "Class C" 254 useable
255.255.254.0 11111111.11111111.11111110.00000000 /23 2 Class C's
255.255.252.0 11111111.11111111.11111100.00000000 /22 4 Class C's
255.255.248.0 11111111.11111111.11111000.00000000 /21 8 Class C's
255.255.240.0 11111111.11111111.11110000.00000000 /20 16 Class C's
255.255.224.0 11111111.11111111.11100000.00000000 /19 32 Class C's
255.255.192.0 11111111.11111111.11000000.00000000 /18 64 Class C's
255.255.128.0 11111111.11111111.10000000.00000000 /17 128 Class C's
255.255.0.0 11111111.11111111.00000000.00000000 /16 "Class B"

255.254.0.0 11111111.11111110.00000000.00000000 /15 2 Class B's
255.252.0.0 11111111.11111100.00000000.00000000 /14 4 Class B's
255.248.0.0 11111111.11111000.00000000.00000000 /13 8 Class B's
255.240.0.0 11111111.11110000.00000000.00000000 /12 16 Class B's
255.224.0.0 11111111.11100000.00000000.00000000 /11 32 Class B's
255.192.0.0 11111111.11000000.00000000.00000000 /10 64 Class B's
255.128.0.0 11111111.10000000.00000000.00000000 /9 128 Class B's
255.0.0.0 11111111.00000000.00000000.00000000 /8 "Class A"
254.0.0.0 11111110.00000000.00000000.00000000 /7
252.0.0.0 11111100.00000000.00000000.00000000 /6
248.0.0.0 11111000.00000000.00000000.00000000 /5
240.0.0.0 11110000.00000000.00000000.00000000 /4 "Class E"(Multicast and reserved)
224.0.0.0 11100000.00000000.00000000.00000000 /3
192.0.0.0 11000000.00000000.00000000.00000000 /2
128.0.0.0 10000000.00000000.00000000.00000000 /1
0.0.0.0 00000000.00000000.00000000.00000000 /0 IP space

Olvasnivalók:
Routing for multiple uplinks/providers(lartc.org)

Linux Advanced Routing & Traffic Control HOWTO(lartc.org

Egyetlen céges hálózat két ADSL kijárattal

IP Route Management

load balancing (ppp és eth) és tap0 <--> eth0 <--> internet forwarding

IP címek, IP címosztályok(szabilinux.hu)

2013.02.24.