L'encaminament és el mecanisme pel qual en una xarxa els paquets es fan arribar d'un origen a una destinació seguint un camí o ruta concreta. Cada node de la xarxa, quan rep un paquet a de prendre una decisió de que fer amb aquest paquet:
Els routers o encaminadors són els dispositius/nodes de xarxa que s'encarreguen de l'encaminament a nivell de xarxa.
L'encaminament és una funció típica en les xarxes WAN ja que a diferència de les xarxes LAN, el medi o canal de comunicació no és compartit sinó que s'utilitzen enllaços punt a punt (PPP) on cada node de la xarxa esdevé en un router o encaminador
L'encaminament pot ser estàtic o dinàmic, en tots dos casos s'utilitzin taules de rutes, és a dir una base de dades composta per una taula on a cada fila és defineix una ruta possible. En el cas d'encaminament estàtic aquestes taules només són canviades pels administradors dels encaminadors i en el cas dinàmic les taules es poden modificar segons canvis en l'entorn (per exemple un encaminador pot modificar la seva taula de rutes de forma automàtica segons les indicacions d'un altre encaminador de la xarxa).
L'encaminament en xarxes petites normalment es fa salt a salt Hop by Hop utilitzant configuració estàtica, és a dir, cada encaminador només decideix quin és el següent pas en la ruta d'un paquet, deixant la resta de passos per als encaminador subsegüents. Podem veure un exemple d'encaminament salt a salt:
En xarxes més grans i amb topologies complexes es fa necessari utilitzar mecanismes més complexes basats en encaminament dinàmic.
En una xarxa podem identificar dos tipus de nodes (entenem com a node un dispositiu que està connectat a la xarxa):
D'encaminadors hi ha de múltiples tipus depenent del tipus de xarxa. Per exemple la xarxa telefònica commutada o RTC també utilitza encaminadors. En aquest article ens centrarem en les xarxes IP.
L'arquitectura bàsica d'un encaminador és:
El protocol IP es va dissenyar per tal d'interconnectar xarxes heterogènies és a dir que es poden connectar diferents tipus de xarxes de nivell 2 tot i que el més habitual actualment és Ethernet. Un router té dues o més interfícies connectades a xarxes diferents. Físicament, les interfícies de xarxa (NIC) estan formades per targes de comunicació que permeten transportar o rebre informació a través duna xarxa física específica.
Quan un router rep un paquet d'una interfície segueix el procés següent:
Aquest procediment s'anomena store&forward. Les taules d'encaminament han d'estar configurades i si el router rep un paquet amb un direcció desconeguda el descarta. Si un router rep molt datagrames per una mateixa NIC, quan el buffer s'empleni comença a descartar paquets.
Normalment les rutes es classifiquen en dos tipus:
Són aquelles rutes que s'afegeixen de forma manual (per indicació de l'administrador) al sistema.
Són aquelles rutes que són afegides automàticament mitjançant la intervenció d'una aplicació informàtica. En aquest cas no requereixen la intervenció d'un administrador del sistema.
La majoria de sistemes operatius i en conseqüència els encaminadors on s'instal·len aquests sistemes operatius suporten treballar amb múltiples taules de rutes. A més cal tenir en compte que poden haver diversos nivells de concreció de la taula rutes (taules en cache, taules principals, taules secundaries, taules segons el protocol d'encaminament, etc.)
En aquest apartat veurem en detall l'encaminament en sistemes operatius Linux i les taules de rutes que hi intervenen. L'encaminament en aquests tipus de sistemes està integrat en el nucli (kernel) del sistema.
El primer que cal tenir en compte és que el suport per a l'encaminament en sistemes operatius Linux ve incorporat al nucli del sistema (no cal instal·lar cap aplicació). A més cal tenir en compte que des dels nuclis Linux 2.2 es suporten múltiples taules de rutes:
IMPORTANT: La comanda route no mostra totes les rutes que té configurades el sistema
Aquest sistema de múltiples taules de rutes proveïx d'una infraestructura molt flexible i potent per a implementar Policy routing i configuracions avançades d'encaminament.
Si tenim tantes taules possibles, aleshores quin és el sistema per escollir la ruta adequada? Linux utilitza la routing policy database (RPDB) com a font de dades per a escollir la ruta correcta. Per tal de configurar aquesta base de dades podeu utilitzar l'ordre ip, més concretament les subordres ip route i ip rule.
Cada taula de rutes pot contenir un nombre arbitrari de entrades cadascuna de les quals ha de tenir la següent informació:
Scope | Descripció |
---|---|
global | L'adreça IP és vàlida arreu (normalment a tot Internet) |
site | L'adreça IP o ruta només es vàlida en una xarxa concreta (IPv6) |
link | L'adreça IP o ruta només es vàlida per aquest dispositiu. |
host | L'adreça IP o ruta només es vàlida en la màquina local |
La memòria cau d'encaminament o aka routing cache o Forwarding Information Base (FIB). La seva funció és emmagatzemar les entrades de rutes utilitzades recentment. Es tracta d'una taula Hash i es consulta abans que les taules de rutes. Si es troba una coincidència a la cache la ruta s'aplica automàticament i es deixa de provar la resta d'opcions de la resta de rutes i taules de rutes.
La podem consultar amb la comanda ip
$ip route show cache ... 204.2.197.211 via 192.168.204.1 dev eth0 src 192.168.204.115 cache ipid 0x0d42 rtt 99ms rttvar 83ms cwnd 10 local 192.168.204.115 from 195.55.174.243 dev lo src 192.168.204.115 cache <local> iif eth0 ...
Típicament la selecció d'una ruta en sistemes "tradicionals" o poc complexes és realitza en base a un criteri hop-by-hop (salt a salt) i segons la adreça de destinació del paquet Es divideix en quatre pasos:
El procés utilitzat per determinar quina ruta ha de seguir un paquet IP
S'ha de modificar el fitxer
$ cat /proc/sys/net/ipv4/ip_forward 0
S'ha posar el valor de 0 a 1
$ sudo su # echo 1 > /proc/sys/net/ipv4/ip_forward
S'ha de crear un fitxer a
$sudo nano /etc/network/if-pre-up.d/router
I s'ha d'afegir el següent al fitxer
#!/bin/sh echo 1 > /proc/sys/net/ipv4/ip_forward
I fer que el fitxer sigui executable
$ chmod +x /etc/network/if-pre-up.d/router
Crear un script a la carpeta /etc/network
ls /etc/network if-down.d if-post-down.d if-pre-up.d if-up.d interfaces run
A la carpeta
/etc/network/if-up.d
Crearem un fitxer de nom
sudo nano router
Que contindrà el següent
#!/bin/sh echo 1 > /proc/sys/net/ipv4/ip_forward
I farem que sigui executable
$ chmod +x router
Si la IP del encaminador pot canviar, aleshores es millor utilitzar masquerade:
$ sudo iptables -t nat -A POSTROUTING -s 192.168.204.0/24 -o eth0 -j MASQUERADE
On:
Per a que funcionen correctament hem de tenir activat l'encaminament
# cat /proc/sys/net/ipv4/ip_forward 1
Tots els ports, totes les màquines d'origen:
$ iptables -t nat -A PREROUTING -d 127.26.1.1 -j DNAT --to-destination 192.168.204.200
Un cop configurades les regles ip tables crearem una carpeta a
$sudo mkdir /etc/firewall
i executarem
$ sudo -i # iptables-save > /etc/firewall/firewall.conf
Per tal de crear l'script /etc/network/if-up.d/iptables amb les següents comandes:
$ echo "#!/bin/sh" > /etc/network/if-up.d/iptables $ echo "/sbin/iptables-restore < /etc/firewall/firewall.conf" >> /etc/network/if-up.d/iptables $ chmod +x /etc/network/if-up.d/iptables
El fitxer /etc/network/if-pre-up.d/iptables queda de la següent manera:
#!/bin/sh /sbin/iptables-restore < /etc/firewall/firewall.conf
Amb la comanda
$route
Canviarem la nostra porta d'enllaç per defecte
$ sudo route del default gw 192.168.204.1
I afegirem la nova ruta per defecte
$ sudo route add default gw 192.168.204.200
Comprovarem que s'han aplicat els canvis
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.204.200 0.0.0.0 UG 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0 192.168.204.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Amb la comanda:
$traceroute
Comprovarem que podem sortir pel nostre encaminador
$traceroute www.google.es traceroute to www.google.es (173.194.78.94), 30 hops max, 60 byte packets 1 192.168.204.200 (192.168.204.200) 0.526 ms 0.547 ms 0.576 ms 2 172.26.1.1 (172.26.1.1) 1.308 ms 1.331 ms 1.361 ms 3 185-13-76-129-ipv4.ebretic.com (185.13.76.129) 3.830 ms 3.859 ms 3.886 ms 4 vl218.mag01.bcn01.atlas.cogentco.com (149.6.130.217) 195.116 ms 195.138 ms 195.169 ms 5 te4-2.ccr01.bcn01.atlas.cogentco.com (154.54.59.129) 49.042 ms 49.069 ms te3-4.ccr01.bcn01.atlas.cogentco.com (154.54.59.133) 49.202 ms 6 te0-2-0-6.ccr22.mrs01.atlas.cogentco.com (154.54.56.21) 12.876 ms 12.054 ms 12.404 ms 7 te0-1-0-3.ccr22.muc01.atlas.cogentco.com (154.54.74.102) 29.506 ms te0-2-0-7.ccr22.muc01.atlas.cogentco.com (154.54.74.86) 29.627 ms 29.903 ms 8 te0-3-0-2.mpd22.fra03.atlas.cogentco.com (130.117.50.237) 34.978 ms te0-2-0-2.mpd22.fra03.atlas.cogentco.com (130.117.50.241) 35.006 ms 35.033 ms 9 fe-2-3991.cir-1.fra1.solvians.com (149.6.140.138) 34.804 ms 34.850 ms 35.045 ms 10 209.85.240.64 (209.85.240.64) 35.070 ms 55.784 ms 65.364 ms 11 72.14.236.20 (72.14.236.20) 35.682 ms 72.14.236.68 (72.14.236.68) 35.743 ms 72.14.239.62 (72.14.239.62) 36.534 ms 12 209.85.241.226 (209.85.241.226) 39.399 ms 39.308 ms 209.85.241.228 (209.85.241.228) 40.074 ms 13 209.85.240.221 (209.85.240.221) 44.726 ms 44.762 ms 44.790 ms 14 216.239.49.45 (216.239.49.45) 41.292 ms 209.85.252.83 (209.85.252.83) 41.864 ms 41.675 ms 15 * * * 16 wg-in-f94.1e100.net (173.194.78.94) 41.410 ms 41.458 ms 41.516 ms
Ens podem trobar que dins d'una mateixa xarxa que tenim dos routers als quals podem tenir accés a la connexió a Internet. Amb una configuració normal només podem tenir accés a un dels dos routers.
Estació de treball: 192.168.204.201. Gateway: 192.168.204.200 Router/Gateway: Dos targetes de xarxa:
intranet: IP: 172.26.1.1
eth1: Sortida cap a Internet per defecte del router i de totes les màquines que utilitzant aquest router com a gateway. Connexió PPPoE.
eth2: IP: 192.168.6.200. Connectat a un gateway amb IP: 192.168.6.1 que té connexió a una segona sortida cap a Internet. No està configurada per defecte. Connecta a una xarxa que té accés a Internet.
Afegirem una nova taula
$sudo nano /etc/iproute2/rt_tables # # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 200 rutes2
Per tal que el sistema comenci a aplicar aquesta taula:
$ sudo ip route flush table rutes2
Consultem la taula per defecte
$sudo ip route show default via 172.26.1.1 dev eth0 metric 100 172.26.1.0/29 dev eth0 proto kernel scope link src 172.26.1.4 192.168.6.0/24 dev eth2 proto kernel scope link src 192.168.6.200 192.168.204.0/24 dev eth1 proto kernel scope link src 192.168.204.200
Afegirem el gateway que volem a aquesta a la taula que hem creat
$ sudo ip route add default via 192.168.6.1 dev eth2 metric 100 table ruta2
I també afegirem la xarxa que connecta a la xarxa que surt a internet
$sudo ip route add table ruta2 10.0.0.0/8 via 192.168.6.200 dev eth2
Comprovem que s'han afegit les dues rutes a la taula ruta2
$sudo ip route show table ruta2 default via 192.168.6.1 dev eth2 metric 100 10.0.0.0/8 via 192.168.6.200 dev eth2
Ara només cal utilitzar aquesta ruta afegir una política de rutes (ip rule). Per defecte només s'apliquen les polítiques per defecte:
$ sudo ip rule show 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
Afegirem una nova norma
$ sudo ip rule add from 192.168.204.201 lookup ruta2 0: from all lookup local 32765: from 192.168.204.201 lookup ruta2 32766: from all lookup main 32767: from all lookup default
Ara només ens queda fer el SNAT
$ sudo iptables -t nat -A POSTROUTING -s 192.168.204.0/24 -o eth2 -j MASQUERADE
Ara la maquina amb la IP 192.168.204.201 sortirà per la ruta que li hem configurat.
Afegirem les normes realitzades dins del fitxer /etc/rc.local així cada vegada que iniciarem la maquina se'ns aplicaran les normes.
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. ip route add default via 192.168.6.1 dev eth2 metric 100 table ruta2 ip route add table ruta2 10.0.0.0/8 via 192.168.6.200 dev eth2 ip rule add from 192.168.204.201 lookup ruta2 exit 0
Per comprovar que s'aplica correctament la ruta que volem tenir per defecte utilitzarem una maquina que li donarem la ip 192.168.204.201 que farem que surti per la ruta que tenim dins de la taula ruta2. Realitzarem la prova amb un traceroute.
$ traceroute www.google.es traceroute to www.google.es (74.125.132.94), 30 hops max, 60 byte packets 1 192.168.204.200 (192.168.204.200) 0.774 ms 0.736 ms 0.724 ms 2 192.168.6.1 (192.168.6.1) 1.642 ms 1.644 ms 1.625 ms 3 185-13-76-129-ipv4.ebretic.com (185.13.76.129) 4.595 ms 4.440 ms 4.413 ms 4 vl218.mag01.bcn01.atlas.cogentco.com (149.6.130.217) 4.395 ms 4.503 ms 4.905 ms ....
La porta d'enllaç que tenim configurada per defecte a la maquina 201 és la 200 però surt a Internet amb la porta d'enllaç configurada la taula ruta2 la 192.168.6.1
Comprovarem que quan utilitzem una altra maquina que no sigui la 201 utilitzem una altra porta d'enllaç
$ traceroute www.google.es traceroute to www.google.es (74.125.132.94), 30 hops max, 60 byte packets 1 192.168.204.200 (192.168.204.200) 0.446 ms 0.521 ms 0.553 ms 2 172.26.1.1 (172.26.1.1) 1.124 ms 1.114 ms 1.573 ms 3 185-13-76-129-ipv4.ebretic.com (185.13.76.129) 4.149 ms 4.071 ms 3.893 ms ...