Ero sivun ”Kahden oletusreitin käyttö” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
(Ak: Uusi sivu: ==Ratkaistava ongelma== Halutaan saada yhdelle koneelle useampi IP-osoite siten, että nämä osoitteet ovat erillisistä aliverkoista ja niiden liikenne kulkee eri yhdyskäytävien ...)
 
 
(7 välissä olevaa versiota 6 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
==Ratkaistava ongelma==
Oletetaan, että halutaan saada yhdelle Linux-koneelle useampi [[IP]]-osoite siten, että nämä osoitteet ovat erillisistä aliverkoista ja niiden liikenne kulkee eri yhdyskäytävien kautta ja molempien aliverkkojen kautta on myös pääsy ulkomaailmaan.


Halutaan saada yhdelle koneelle useampi IP-osoite siten, että nämä osoitteet ovat erillisistä aliverkoista ja niiden liikenne kulkee eri yhdyskäytävien kautta ja molempien aliverkkojen kautta on myö pääsy ulkomaailmaan.
Itse IP-osoitteen antamisessa ei ole ongelmaa, kun koneellehan saa helposti useamman IP-osoitteen käyttämällä useampaa fyysistä verkkoliityntää tai käyttämällä fyysisen verkkoliitynnän lisänä virtuaalisia verkkolaitteita <tt>eth0:1</tt>, <tt>eth0:2</tt> jne.
 
Itse IP-osoitteen antamisessa ei ole ongelmaa kun koneellehan saa helposti useamman IP-osoitteen käyttämällä useampaa fyysistä verkkoliityntää tai käyttämällä fyysisen verkkoliitynnän lisänä virtuaalisia verkkolaitteita eth0:1, eth0:2 jne..
 
Verkkokorteille voi antaa IP-osoitteita komennolla ifconfig. Esim:


Verkkokorteille voi antaa IP-osoitteita komennolla <tt>[[ifconfig]]</tt>. Esimeriksi laitetaan fyysisille verkkokorteille <tt>eth1</tt> ja <tt>eth2</tt> IP-osoitteet ja aliverkon peitteet:
   ifconfig eth0 192.168.1.2 netmask 255.255.255.0 up
   ifconfig eth0 192.168.1.2 netmask 255.255.255.0 up
   ifconfig eth1 172.16.1.2 netmask 255.255.255.0 up
   ifconfig eth1 172.16.1.2 netmask 255.255.255.0 up


Uudet Linux-asennukset laittavat oletuksena reititystietoihinsa reitin noille kummallekin aliverkolle, mutta jos se pitäisi tehdä itse, niin se tapahtuisi komennolla route.
Uudet Linux-asennukset laittavat oletuksena reititystietoihinsa reitin kummallekin aliverkolle, mutta jos se pitäisi tehdä itse, niin perinteisesti se tapahtuisi komennolla <tt>[[route]]</tt>:
 
   route add -net 192.168.1.0 eth0
   route add -net 192.168.1.0 eth0
   route add -net 172.16.1.0 eth1
   route add -net 172.16.1.0 eth1


Tässä vaiheessa koneella voi kommunokoida kummassakin aliverkossa olevien muiden koneiden kanssa, mutta mikäli laitteella halutaan päästä myös muualle, niin koneelle pitää kertoa myös oletusreitti. Oletetaan, että verkkoylläpito (tai operaattori) on antanut oman aliverkkonsa oletusyhdyskäytävän osoitteeksi xxx.xxx.xxx.1 -osoitteen. Perinteiset verkkoasetukset joskus aiemmin tehnyt tekisi luultavasti seuraavat komennot.
Tässä vaiheessa koneella voi kommunikoida kummassakin aliverkossa olevien muiden koneiden kanssa, mutta mikäli laitteella halutaan päästä myös muualle, niin koneelle pitää kertoa myös oletusreitti. Oletetaan, että verkkoylläpito (tai operaattori) on antanut aliverkkonsa oletusyhdyskäytävän osoitteeksi xxx.xxx.xxx.1 -osoitteen. Perinteiset verkkoasetukset joskus aiemmin tehnyt tekisi luultavasti seuraavat komennot:
 
   route add default gw 192.168.1.1
   route add default gw 192.168.1.1
   route add default gw 172.16.1.1
   route add default gw 172.16.1.1


Miksi tämä ei toimi ?
Jotta ymmärrettäisiin, miksi yllä oleva konfiguraatio ei toimi pitää ymmärtää, kuinka Linuxin reititys toimii.
Jotta ymmärrettäisiin, miksi yllä oleva konfiguraatio ei toimi pitää ymmärtää, kuinka Linuxin reititys toimii.


Ensinnä pitää ymmärtää, kuinka verkkopeite (netmask) toimii. Verkkopeitteen ymmärtää helpommin, mikäli kirjoittaa sen binaarilukuna eli 255.255.255.0 => 11111111.11111111.11111111.00000000. Tuosta näemme helposti, että maskissa on 24 ykköstä, joten verkkomaskin tarkkuus on 24, ja joissain yhteyksissä tuollainen verkkomaski ilmoitetaankin IP-osoitteen yhteydessä muodossa A.B.C.D/24.
Ensinnä pitää ymmärtää, kuinka verkkopeite (eng. ''netmask'') toimii. Verkkopeitteen ymmärtää helpommin, mikäli kirjoittaa sen binaarilukuna eli 255.255.255.0 => 11111111.11111111.11111111.00000000. Tuosta näemme helposti, että maskissa on 24 ykköstä, joten verkkomaskin tarkkuus on 24, ja joissain yhteyksissä tuollainen verkkomaski ilmoitetaankin IP-osoitteen yhteydessä muodossa A.B.C.D/24.


Mikäli kohdeosoitteena olisi esimerkiksi IP-osoite 10.11.12.13, niin se binaariluvuksi kirjoitettuna on 00001010.00001011.00001100.00001101, ja mikäli tuota tarkastellaa verkkomaskin /24 kanssa, niin silloin 24 tutkitaan ainoastaan 24 ensimmäistä bittiä, joten tuossa IP-osoitteessa oleva 13 voi olla ihan mitä tahansa ja se silti on samassa aliverkossa.
Mikäli kohdeosoitteena olisi esimerkiksi IP-osoite 10.11.12.13, niin se binaariluvuksi kirjoitettuna on 00001010.00001011.00001100.00001101. Mikäli sitä tarkastellaan verkkomaskin /24 kanssa, niin tutkitaan ainoastaan 24 ensimmäistä bittiä, joten IP-osoitteessa oleva 13 voi olla ihan mitä tahansa ja se silti on samassa aliverkossa.
 
Sitten tarkastellaan kuinka IP-paketin reitti määräytyy. Ensinnä käyttöjärjestelmä järjestää reititystaulussa olevat tiedot siten, että tarkimmat reittimääreet ovat ensimmäisenä. Eli tässä tapauksessa ensimmäisenä ovat nuo aliverkkojen reitit ja niiden jälkeen reitit oletusyhdyskäytävän kautta.


Sitten tarkastellaan kuinka IP-paketin reitti määräytyy. Ensinnä käyttöjärjestelmä järjestää reititystaulussa olevat tiedot siten, että tarkimmat reittimääreet ovat ensimmäisenä. Eli tässä tapauksessa ensimmäisenä ovat nuo aliverkkojen reitit ja niiden jälkeen reitit oletusyhdyskäytävän kautta. Reititykset näkee komennolla <tt>route</tt>:
   Kernel IP routing table
   Kernel IP routing table
   Destination    Gateway        Genmask        Flags  MSS Window  irtt Iface
   Destination    Gateway        Genmask        Flags  MSS Window  irtt Iface
Rivi 36: Rivi 29:
   0.0.0.0        172.16.1.1      0.0.0.0        UG        0 0          0 eth1
   0.0.0.0        172.16.1.1      0.0.0.0        UG        0 0          0 eth1


Yrittäessään reitittää pakettia kohdeosoitteeseen 10.11.12.13 käyttöjärjestelmä käy tuota listaa läpi järjestyksessä. Kun löytyy ensimmäisen tieto, johon tuo IP-osoite sopii, käytetään siinä olevaa reititystietoa. Eli reitityspäätös tapahtuu seuraavasti.
Yrittäessään reitittää pakettia kohdeosoitteeseen 10.11.12.13 käyttöjärjestelmä käy tuota listaa läpi järjestyksessä. Kun löytyy ensimmäisen tieto, johon tuo IP-osoite sopii, käytetään siinä olevaa reititystietoa. Eli reitityspäätös tapahtuu seuraavasti:
 
Ensimmäisellä rivillä maski on 255.255.255.0, joten reititettävän paketin osoite maskattuna on 10.11.12.X ja reititystiedon kohteen osoite on 192.168.1.X => Eivät ole samat.
 
Toisella rivillä on sama maski, eikä osoite 10.11.12.X täsmää myöskään tällä rivillä olevan kohteen 172.16.1.X kanssa.
 
Kolmannella rivillä on maskina 0.0.0.0, eli ei yhtään merkitsevää bittiä, siispä reititettävän paketin osoite on maskattuna X ja reitystiedossa olevan kohteen osoite on maskattuna myöskin X => Osoitteet ovat samat, ja siis käytetään tällä rivillä määriteltyä reititystietoa eli yhdyskäytävänä käytetään laitetta 192.168.1.1, joka löytyy laitteen eth0 takaa.


Mutta entäs jos paketin lähettäjäosoitteena olikin tuo 172.16.1.2 ja kohteena edelleenkin tuo 10.11.12.13? Sillekin reitityspäätös tehdään samalla tavalla, joten paketti päätyy eth0-laitteen takana olevalle reitittimelle 192.168.1.1, mikä on väärin, ja monissa tapauksissa tuo reititin ei edes suostu välittämään IP-osoitteen 172.16.1.2 lähettämää liikennettä. Tuo lähettäjäosoite voi vaihdella siksi, että verkkoon kommunikoiva ohjelma saattaa nimenomaan haluta käyttää sitä, tai paketti voi olla vaikkapa paluuliikennettä siihen kun joku muu kone on halunnut keskustella nimenomaan osoitteen 172.16.1.2 kanssa.
#Ensimmäisellä rivillä maski on 255.255.255.0, joten reititettävän paketin osoite maskattuna on 10.11.12.X ja reititystiedon kohteen osoite on 192.168.1.X => Eivät ole samat.
#Toisella rivillä on sama maski, eikä osoite 10.11.12.X täsmää myöskään tällä rivillä olevan kohteen 172.16.1.X kanssa.
#Kolmannella rivillä on maskina 0.0.0.0, eli ei yhtään merkitsevää bittiä, siispä reititettävän paketin osoite on maskattuna X ja reititystiedossa olevan kohteen osoite on maskattuna myöskin X => osoitteet ovat samat, ja siis käytetään tällä rivillä määriteltyä reititystietoa eli yhdyskäytävänä käytetään laitetta 192.168.1.1, joka löytyy laitteen <tt>eth0</tt> takaa.


Mutta entäs, jos paketin lähettäjäosoitteena olikin tuo 172.16.1.2 ja kohteena edelleenkin tuo 10.11.12.13? Sillekin reitityspäätös tehdään samalla tavalla, joten paketti päätyy eth0-laitteen takana olevalle reitittimelle 192.168.1.1, mikä on väärin, ja monissa tapauksissa tuo reititin ei edes suostu välittämään IP-osoitteen 172.16.1.2 lähettämää liikennettä. Tuo lähettäjäosoite voi vaihdella siksi, että verkkoon kommunikoiva ohjelma saattaa nimenomaan haluta käyttää sitä, tai paketti voi olla vaikkapa paluuliikennettä siihen kun joku muu kone on halunnut keskustella nimenomaan osoitteen 172.16.1.2 kanssa.


==Ratkaisu==
==Ratkaisu==
Ratkaisu ongelmaan on se, että Linuxille voi tehdä useamman reititystaulun, ja sitten liikenteen lähettäjäosoitteen perusteella valitaan, mitä taulua käytetään.


Ratkaisu ongelmaan on se, että Linuxille voi tehdä useamman reitystaulun, ja sitten liikenteen lähettäjäosoitteen perusteella valitaan, mitä taulua käytetään.
Tuo aiemmin käytetty <tt>route</tt>-käsky ei enää kelpaa, koska se käyttää aina oletustaulua eikä sille voi kertoa, että reititystieto halutaankin johonkin toiseen. Pitää käyttää uudempaa työkalua <tt>[[ip]]</tt>, johon on rakennettu myös <tt>ifconfig</tt>in ja oikeastaan lähes kaikkien muidenkin verkon konfigurointiin tarvittavien komentojen toiminnallisuus.
 
Tuo aiemmin käytetty route-käsky ei enää kelpaa, koska se käyttää aina oletustaulua eikä sille voi kertoa, että reititystieto halutaankin johonkin toiseen. Pitää käyttää uudempaa työkalua ip, johon on rakennettu myös ifconfig:n ja oikeastaan lähes kaikkien muidenkin verkon konfigurointiin tarvittavien komentojen toiminnallisuus.
 
Ensimmäisenä voisi katsoa, että mitä reitityssääntöjä koneessa on komennolla ip rule show


Ensimmäisenä voisi katsoa, että mitä reitityssääntöjä koneessa on komennolla <tt>ip rule show</tt>:
   0:      from all lookup local
   0:      from all lookup local
   32766:  from all lookup main
   32766:  from all lookup main
   32767:  from all lookup default
   32767:  from all lookup default


Eli koneessa on siis kolme reitityssääntöä, ja aiemmin kerrottua reitityspäätösprosessia pitääkin laajentaa. Reitityspäätöstä tehdessään käyttöjärjestelmä käy ensimmäisenä läpi nuo säännöt prioriteettijärjestyksessä (Rivin ensimmäinen numero).
Eli koneessa on siis kolme reitityssääntöä, ja aiemmin kerrottua reitityspäätösprosessia pitääkin laajentaa. Reitityspäätöstä tehdessään käyttöjärjestelmä käy ensimmäisenä läpi nuo säännöt prioriteettijärjestyksessä (rivin ensimmäinen numero).


Ensimmäisessä säännössä sanotaan, että sitä käytetään, mikäli lähettäjäosoitteena on mikä tahansa (from all), ja käytetään reititystaulua, joka on nimetty nimelle local. Mikäli siellä mikään reititystieto ei täsmännyt kokeillaan seuraavaa sääntöä.
Ensimmäisessä säännössä sanotaan, että sitä käytetään, mikäli lähettäjäosoitteena on mikä tahansa (''from all''), ja käytetään reititystaulua, joka on nimetty nimelle ''local''. Mikäli siellä mikään reititystieto ei täsmännyt kokeillaan seuraavaa sääntöä.


Myös toinen sääntö pätee kaikille paketeille (from all), ja tällä kertaa katsotaan reititystaulusta, jonka nimi on main. Tämä main on se taulu, jota vanhan tyylinen route-komento muokkaa.
Myös toinen sääntö pätee kaikille paketeille (''from all''), ja tällä kertaa katsotaan reititystaulusta, jonka nimi on ''main''. Tämä ''main'' on se taulu, jota vanhan tyylinen <tt>route</tt>-komento muokkaa.


Kolmanteen sääntöön ei yleensä ikinä päästä, ja useimmissa tapauksissa tuossa default-reititystaulussa, ei edes ole yhtään mitään.
Kolmanteen sääntöön ei yleensä ikinä päästä, ja useimmissa tapauksissa tuossa default-reititystaulussa, ei edes ole yhtään mitään.


Voimme siis ratkaista ongelmamme tekemällä molemmille oletusreiteille oman reititystaulun. Uusia reititystauluja luodessa niille voi käyttää nimiä ainoastaan, mikäli nimet ja id-numerot on mainittuna tiedostossa /etc/iproute2/rt_tables muodossa "numero nimi" ja jokainen omalla rivillään. Tässä tapauksessa ei välttämättä nimi selvennä, jos käytämme id-numeroita 192 ja 172, niin muistanemme pelkästä numerostanu minkä reitityksestä on kyse
Voimme siis ratkaista ongelmamme tekemällä molemmille oletusreiteille oman reititystaulun. Uusia reititystauluja luodessa niille voi käyttää nimiä ainoastaan, mikäli nimet ja id-numerot on mainittuna tiedostossa <tt>/etc/iproute2/rt_tables</tt> muodossa "<tt>numero nimi</tt>", jokainen omalla rivillään. Tässä tapauksessa ei välttämättä nimi selvennä, joten käytämme id-numeroita 192 ja 172 jolloin muistanemme pelkästä numerostan minkä reitityksestä on kyse:
 
   ip route add 192.168.1.0/24 dev eth0 table 192
   ip route add 192.168.1.0/24 dev eth0 table 192
   ip route add default via 192.168.1.1 dev eth0 table 192
   ip route add default via 192.168.1.1 dev eth0 table 192
Rivi 74: Rivi 61:
   ip route add default via 172.16.1.1 dev eth1 table 172
   ip route add default via 172.16.1.1 dev eth1 table 172


(Reititystaulun sisällön voi katsoa komennolla ip route show table <table id>)
Reititystaulun sisällön voi katsoa komennolla  
 
ip route show table <taulun numero>
Ja kun molemmat reititystaulut on lisätty, niin sitten lisätään kummallekin reitityssääntö, jossa kerrotaan koska noita tauluja pitää käyttää. Säännöt ovat yksinkertaiset, jos lähettäjänä on osoite aliverkosta 192.168.1.0/24 (from 192.168.1.0/24), niin käytetään taulua, jonka id on 192 (table 192). Ja vastaavalla tavalla toiselle aliverkolle.


Ja kun molemmat reititystaulut on lisätty, lisätään kummallekin reitityssääntö, jossa kerrotaan milloin tauluja pitää käyttää. Säännöt ovat yksinkertaiset, jos lähettäjänä on osoite aliverkosta 192.168.1.0/24 (from 192.168.1.0/24), niin käytetään taulua, jonka id on 192 (<tt>table 192</tt>). Ja vastaavalla tavalla toiselle aliverkolle:
   ip rule add from 192.168.1.0/24 table 192
   ip rule add from 192.168.1.0/24 table 192
   ip rule add from 172.16.1.0/24 table 172
   ip rule add from 172.16.1.0/24 table 172


Mikäli "ip rule add" -komentoon ei kerrota prioriteettia, niin sääntö menee tuolla aiemmin olevien eteen ja nyt jos katsotaan reitityssäännöt uudestaan, niin se näyttänee tältä.
Mikäli "ip rule add" -komentoon ei kerrota prioriteettia, niin sääntö menee tuolla aiemmin olevien eteen ja nyt jos katsotaan reitityssäännöt uudestaan, niin se näyttänee tältä:
 
   0:      from all lookup local
   0:      from all lookup local
   32764:  from 172.16.1.0/24 lookup 172
   32764:  from 172.16.1.0/24 lookup 172
Rivi 89: Rivi 75:
   32767:  from all lookup default
   32767:  from all lookup default


Ip-komento ei laita asetuksia suoraan käyttöön, vaan asetukset pitää vielä erikseen ottaa käyttöön ennenkuin ne ihan oikeasti vaikuttavat verkkoliikenteeseen. Tämä tapahtuu komennolla ip route flush cache.
<tt>ip</tt>-komento ei välttämättä laita asetuksia suoraan käyttöön, vaan saatetaan joutua tyhjentämään vanhat asetukset reititysjärjestelmän välimuistista ennen kuin uudet muutokset ihan oikeasti vaikuttavat verkkoliikenteeseen. Tämä tapahtuu komennolla <tt>ip route flush cache</tt>.
 
Nyt homman pitäisi toimia. Vaikka <tt>main</tt>-taulua käyttävään sääntöön ei pitäisi tässä esimerkissä käytetyillä asetuksilla joutua, kannattaa silti sinnekin jotain järkevää laittaa.


Nyt homman ainakin periaatteessa pitäisi toimia. Vaikka tuonne main-taulua käyttävään sääntöön ei pitäisi normaalitilanteessa joutua, mutta silti sinnekin kannattaa jotain järkevää laittaa.
Kannattaa huomioida, että vaikka reititystiedot (route) häviävätkin automaattisesti kun verkkoliityntä sammutetaan, jäävät reitityssäännöt (rule) kuitenkin edelleen olemaan, joten ne pitää poistaa erikseen.


Kannattaa huomioida, että vaikka reititystiedot häviävätkin automaattisesti, kun verkkoliityntä sammutetaan, niin reitityssäännöt kuitenkin jäävät edelleen olemaan, joten ne pitää poistaa erikseen.
[[Luokka:Verkko]]
[[Luokka:Ohjeet]]

Nykyinen versio 5. tammikuuta 2018 kello 02.38

Oletetaan, että halutaan saada yhdelle Linux-koneelle useampi IP-osoite siten, että nämä osoitteet ovat erillisistä aliverkoista ja niiden liikenne kulkee eri yhdyskäytävien kautta ja molempien aliverkkojen kautta on myös pääsy ulkomaailmaan.

Itse IP-osoitteen antamisessa ei ole ongelmaa, kun koneellehan saa helposti useamman IP-osoitteen käyttämällä useampaa fyysistä verkkoliityntää tai käyttämällä fyysisen verkkoliitynnän lisänä virtuaalisia verkkolaitteita eth0:1, eth0:2 jne.

Verkkokorteille voi antaa IP-osoitteita komennolla ifconfig. Esimeriksi laitetaan fyysisille verkkokorteille eth1 ja eth2 IP-osoitteet ja aliverkon peitteet:

 ifconfig eth0 192.168.1.2 netmask 255.255.255.0 up
 ifconfig eth1 172.16.1.2 netmask 255.255.255.0 up

Uudet Linux-asennukset laittavat oletuksena reititystietoihinsa reitin kummallekin aliverkolle, mutta jos se pitäisi tehdä itse, niin perinteisesti se tapahtuisi komennolla route:

 route add -net 192.168.1.0 eth0
 route add -net 172.16.1.0 eth1

Tässä vaiheessa koneella voi kommunikoida kummassakin aliverkossa olevien muiden koneiden kanssa, mutta mikäli laitteella halutaan päästä myös muualle, niin koneelle pitää kertoa myös oletusreitti. Oletetaan, että verkkoylläpito (tai operaattori) on antanut aliverkkonsa oletusyhdyskäytävän osoitteeksi xxx.xxx.xxx.1 -osoitteen. Perinteiset verkkoasetukset joskus aiemmin tehnyt tekisi luultavasti seuraavat komennot:

 route add default gw 192.168.1.1
 route add default gw 172.16.1.1

Jotta ymmärrettäisiin, miksi yllä oleva konfiguraatio ei toimi pitää ymmärtää, kuinka Linuxin reititys toimii.

Ensinnä pitää ymmärtää, kuinka verkkopeite (eng. netmask) toimii. Verkkopeitteen ymmärtää helpommin, mikäli kirjoittaa sen binaarilukuna eli 255.255.255.0 => 11111111.11111111.11111111.00000000. Tuosta näemme helposti, että maskissa on 24 ykköstä, joten verkkomaskin tarkkuus on 24, ja joissain yhteyksissä tuollainen verkkomaski ilmoitetaankin IP-osoitteen yhteydessä muodossa A.B.C.D/24.

Mikäli kohdeosoitteena olisi esimerkiksi IP-osoite 10.11.12.13, niin se binaariluvuksi kirjoitettuna on 00001010.00001011.00001100.00001101. Mikäli sitä tarkastellaan verkkomaskin /24 kanssa, niin tutkitaan ainoastaan 24 ensimmäistä bittiä, joten IP-osoitteessa oleva 13 voi olla ihan mitä tahansa ja se silti on samassa aliverkossa.

Sitten tarkastellaan kuinka IP-paketin reitti määräytyy. Ensinnä käyttöjärjestelmä järjestää reititystaulussa olevat tiedot siten, että tarkimmat reittimääreet ovat ensimmäisenä. Eli tässä tapauksessa ensimmäisenä ovat nuo aliverkkojen reitit ja niiden jälkeen reitit oletusyhdyskäytävän kautta. Reititykset näkee komennolla route:

 Kernel IP routing table
 Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
 192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
 172.16.1.0      0.0.0.0         255.255.255.0   U         0 0          0 eth1
 0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
 0.0.0.0         172.16.1.1      0.0.0.0         UG        0 0          0 eth1

Yrittäessään reitittää pakettia kohdeosoitteeseen 10.11.12.13 käyttöjärjestelmä käy tuota listaa läpi järjestyksessä. Kun löytyy ensimmäisen tieto, johon tuo IP-osoite sopii, käytetään siinä olevaa reititystietoa. Eli reitityspäätös tapahtuu seuraavasti:

  1. Ensimmäisellä rivillä maski on 255.255.255.0, joten reititettävän paketin osoite maskattuna on 10.11.12.X ja reititystiedon kohteen osoite on 192.168.1.X => Eivät ole samat.
  2. Toisella rivillä on sama maski, eikä osoite 10.11.12.X täsmää myöskään tällä rivillä olevan kohteen 172.16.1.X kanssa.
  3. Kolmannella rivillä on maskina 0.0.0.0, eli ei yhtään merkitsevää bittiä, siispä reititettävän paketin osoite on maskattuna X ja reititystiedossa olevan kohteen osoite on maskattuna myöskin X => osoitteet ovat samat, ja siis käytetään tällä rivillä määriteltyä reititystietoa eli yhdyskäytävänä käytetään laitetta 192.168.1.1, joka löytyy laitteen eth0 takaa.

Mutta entäs, jos paketin lähettäjäosoitteena olikin tuo 172.16.1.2 ja kohteena edelleenkin tuo 10.11.12.13? Sillekin reitityspäätös tehdään samalla tavalla, joten paketti päätyy eth0-laitteen takana olevalle reitittimelle 192.168.1.1, mikä on väärin, ja monissa tapauksissa tuo reititin ei edes suostu välittämään IP-osoitteen 172.16.1.2 lähettämää liikennettä. Tuo lähettäjäosoite voi vaihdella siksi, että verkkoon kommunikoiva ohjelma saattaa nimenomaan haluta käyttää sitä, tai paketti voi olla vaikkapa paluuliikennettä siihen kun joku muu kone on halunnut keskustella nimenomaan osoitteen 172.16.1.2 kanssa.

Ratkaisu[muokkaa]

Ratkaisu ongelmaan on se, että Linuxille voi tehdä useamman reititystaulun, ja sitten liikenteen lähettäjäosoitteen perusteella valitaan, mitä taulua käytetään.

Tuo aiemmin käytetty route-käsky ei enää kelpaa, koska se käyttää aina oletustaulua eikä sille voi kertoa, että reititystieto halutaankin johonkin toiseen. Pitää käyttää uudempaa työkalua ip, johon on rakennettu myös ifconfigin ja oikeastaan lähes kaikkien muidenkin verkon konfigurointiin tarvittavien komentojen toiminnallisuus.

Ensimmäisenä voisi katsoa, että mitä reitityssääntöjä koneessa on komennolla ip rule show:

 0:      from all lookup local
 32766:  from all lookup main
 32767:  from all lookup default

Eli koneessa on siis kolme reitityssääntöä, ja aiemmin kerrottua reitityspäätösprosessia pitääkin laajentaa. Reitityspäätöstä tehdessään käyttöjärjestelmä käy ensimmäisenä läpi nuo säännöt prioriteettijärjestyksessä (rivin ensimmäinen numero).

Ensimmäisessä säännössä sanotaan, että sitä käytetään, mikäli lähettäjäosoitteena on mikä tahansa (from all), ja käytetään reititystaulua, joka on nimetty nimelle local. Mikäli siellä mikään reititystieto ei täsmännyt kokeillaan seuraavaa sääntöä.

Myös toinen sääntö pätee kaikille paketeille (from all), ja tällä kertaa katsotaan reititystaulusta, jonka nimi on main. Tämä main on se taulu, jota vanhan tyylinen route-komento muokkaa.

Kolmanteen sääntöön ei yleensä ikinä päästä, ja useimmissa tapauksissa tuossa default-reititystaulussa, ei edes ole yhtään mitään.

Voimme siis ratkaista ongelmamme tekemällä molemmille oletusreiteille oman reititystaulun. Uusia reititystauluja luodessa niille voi käyttää nimiä ainoastaan, mikäli nimet ja id-numerot on mainittuna tiedostossa /etc/iproute2/rt_tables muodossa "numero nimi", jokainen omalla rivillään. Tässä tapauksessa ei välttämättä nimi selvennä, joten käytämme id-numeroita 192 ja 172 jolloin muistanemme pelkästä numerostan minkä reitityksestä on kyse:

 ip route add 192.168.1.0/24 dev eth0 table 192
 ip route add default via 192.168.1.1 dev eth0 table 192
 ip route add 172.16.1.0/24 dev eth1 table 172
 ip route add default via 172.16.1.1 dev eth1 table 172

Reititystaulun sisällön voi katsoa komennolla

ip route show table <taulun numero>

Ja kun molemmat reititystaulut on lisätty, lisätään kummallekin reitityssääntö, jossa kerrotaan milloin tauluja pitää käyttää. Säännöt ovat yksinkertaiset, jos lähettäjänä on osoite aliverkosta 192.168.1.0/24 (from 192.168.1.0/24), niin käytetään taulua, jonka id on 192 (table 192). Ja vastaavalla tavalla toiselle aliverkolle:

 ip rule add from 192.168.1.0/24 table 192
 ip rule add from 172.16.1.0/24 table 172

Mikäli "ip rule add" -komentoon ei kerrota prioriteettia, niin sääntö menee tuolla aiemmin olevien eteen ja nyt jos katsotaan reitityssäännöt uudestaan, niin se näyttänee tältä:

 0:      from all lookup local
 32764:  from 172.16.1.0/24 lookup 172
 32765:  from 192.168.1.0/24 lookup 192
 32766:  from all lookup main
 32767:  from all lookup default

ip-komento ei välttämättä laita asetuksia suoraan käyttöön, vaan saatetaan joutua tyhjentämään vanhat asetukset reititysjärjestelmän välimuistista ennen kuin uudet muutokset ihan oikeasti vaikuttavat verkkoliikenteeseen. Tämä tapahtuu komennolla ip route flush cache.

Nyt homman pitäisi toimia. Vaikka main-taulua käyttävään sääntöön ei pitäisi tässä esimerkissä käytetyillä asetuksilla joutua, kannattaa silti sinnekin jotain järkevää laittaa.

Kannattaa huomioida, että vaikka reititystiedot (route) häviävätkin automaattisesti kun verkkoliityntä sammutetaan, jäävät reitityssäännöt (rule) kuitenkin edelleen olemaan, joten ne pitää poistaa erikseen.