IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

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:

  • Quedar-se el paquet quan ell és el destinatari
  • Enviar al paquet cap a un altre node veí (FORWARDING)
  • O potser eliminar el paquet per què és incorrecta.

WAN2.png

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

WAN3.png

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:

EnrutamentSkoleLinux.png

En xarxes més grans i amb topologies complexes es fa necessari utilitzar mecanismes més complexes basats en encaminament dinàmic.

Encaminadors

En una xarxa podem identificar dos tipus de nodes (entenem com a node un dispositiu que està connectat a la xarxa):

  • Hosts: Són aquells dispositius que només estan connectats a una xarxa. També es poden definir com els nodes que només tenen un enllaç cap al resta de la xarxa. En aquest tipus de dispositius la xarxa finalitza. També coneguts simplement com nodes o nodes fulla, estacions de treball.
  • Encaminadors: Són els dispositius que estan connectats a dos o més xarxes. També es poden definir com els nodes que tenen dos o més enllaços cap al resta de la xarxa. En aquest tipus de dispositius la xarxa no finalitza sinó que s'exten. També coneguts com routers.

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:

EncaminadorArquitecturaIPForwarding.jpg

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:

  1. El datagrama passa a la funció ip_input. Aquesta funció comprova que vagi dirigit al mateix router, si és així passa als nivell superiors, en cas contrari passa a la funció ip_output (IP forwarding). Aquesta és la diferència entre un host i un router, quan un host rep un datagrama que no és per ell el descarta (els hosts tenen desactivat el IP forwarding).
  2. ip_output és l'encarregat de l'encaminament, utilitza la taula d'encaminament, que conté les xarxes destinació on sap arribar el router. Per cada xarxa destinació la taula diu per quina interfície s'ha d'enviar el datagrama.
  3. Un cop consultada la xarxa, ip_output passa el paquet al nivell 2 (al driver de la NIC) per on s'enviarà el paquet. El paquet es guarda a un buffer a l'espera que la NIC l'agafi.

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.

Tipus de rutes

Normalment les rutes es classifiquen en dos tipus:

  • Rutes estàtiques
  • Rutes dinàmiques

Estàtiques

Són aquelles rutes que s'afegeixen de forma manual (per indicació de l'administrador) al sistema.

Dinàmiques

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.

Taules de rutes

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.

Taules de rutes a Linux

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:

  • FIB: No és realment una taula de rutes però la posem aquí per que es important tenir-la sempre en compte. Per no penalitzar el rendiment de l'encaminament consultant per a cada paquet quina ruta ha de seguir, s'utilitza una memòria cache. Les taules de ruta del sistema no son consultades si ja hi ha una entrada a la memòria cau.
  • Taula de rutes local: Aquesta és una taula normalment gestionada de forma automàtica pel nucli del sistema. Aquesta taula li indica al sistema com accedir a les IPs pròpies (p.ex l'interfície de loopback) així com a les xarxes a les que està directament connectat a més de configurar el comportament per defecte amb les adreces reservades: adreça de xarxa i adreça de broadcast. Normalment les entrades d'aquesta taula es creen al activar les interfícies de xarxa locals. Els usuaris poder eliminar rutes d'aquesta taula (tot i ser estrany) però no poden afegir cap ruta a aquesta taula (al menys directament però si que es veritat que es podria afegir una nova entrada a la taula al configurar una nova adreça IP). És la taula de menys prioritat i té el número més alt: 255. aka local routing table.
  • Taula de rutes principal: Aquesta és la taula de rutes més coneguda i és la que es pot consultar i modificar per defecte amb l'ordre route. Per exemple al afegir una adreça Ip amb l'ordre ifconfig automàticament s'afegeix una ruta local per a la xarxa d'aquella adreça IP a aquesta taula. Com el seu nom aquesta taula de rutes conté les rutes principals i en sistemes amb encaminament senzill com estacions de treball normalment només es configura aquesta taula de rutes. Internament té el número 254. aka main routing table.

IMPORTANT: La comanda route no mostra totes les rutes que té configurades el sistema

  • A més es poden arribar a definir 252 taules de rutes addicionals. Vegeu l'ordre ip route i l'article sobre Routing policy.

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ó:

  • Adreça de destinació: potser una adreça IP concreta o una adreça de xarxa. Aquesta és l'entrada principal (primary key) de la taula de rutes
  • Tos; Type of Service: es pot encaminar segons els camp Type of service de la capçalera IP. El fitxer /etc/iproute2/rt_dsfield conté una llista dels possibles valors d'aquest camp.
  • Output interface: Indica la interfície de xarxa per la qual sortiran els paquets
  • Scope: el ip scope indica el àmbit en que es aplicable l'adreça IP. Normalment el scope no s'indica de forma explicita al afegir una ruta ja que la pròpia adreça ip o xarxa de destinació de la ruta ja ens indica un scope àmbit per defecte. Per exemples les adreces 127.0.0.0/8 són del rand d'adreces Ip locals i per tant no poden ser encaminades cap a cap altre dispositiu. Els tipus d'scope són:
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

FIB

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
...

Procés de sel·lecció de ruta

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:

  1. Primer es consulta la cau, es tracta d'una taula hash en memòria RAM que conté les rutes utilitzades recentment i permet encaminar de forma més ràpida.
  2. Si no hi ha entrada a la cau comença un procés de sel·lecció de ruta
  3. El nucli itera per prioritat de la base de dades d'encaminament (RPDB o Routing Policy DataBase). Es a dir es busca la ruta a les diferents taules de rutes segons l'ordre de prioritat que tinguin. Per cada coincidència a la RPDB el nucli intenta trobar una ruta coincident a la ip de destinació a la taula de rutes especificada. Es pot consultar i gestionar la RPDB amb l'ordre ip rule.
  4. En cas de trobar múltiples rutes possibles sempre s'aplica el criteri Longest Prefix Match (LPM), és a dir s'apliquen les rutes més específiques per davant de les més generalistes. L'última ruta en aplicar-se és la ruta per defecte (si existeix) que en la majoria de configuracions consisteix a enviar el paquet al gateway de la xarxa. L'ús d'aquest algorisme permet l'agregació ja que permet que en comptes d'haver d'afegir una ruta per a cada màquina o per a multitud de xarxes petites, puguem agregar en una sola ruta múltiples màquines o xarxes.
  5. 5) Si no es troba cap coincidència el paquet serà descartat.

Linux com a encaminador

IP forwarding

El procés utilitzat per determinar quina ruta ha de seguir un paquet IP

Activar IP forwarding

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

Fer permanent la configuració de ip_forwarding

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

Configuració permanent de l'encaminament

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

IP TABLES

SNAT/MaSquerade amb iptables

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:

  • 192.168.1.0/24: És la xarxa LAN privada que accedir a una xarxa pública compartint un encaminador (masquerada). És la xarxa "emmascarada"
  • -o eth0: és la interfície de xarxa connectada cap a la xarxa pública

Per a que funcionen correctament hem de tenir activat l'encaminament

# cat /proc/sys/net/ipv4/ip_forward
1

DNAT amb iptables

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

Executant les normes iptables des de l'arrancada del sistema

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

Comprovacions

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

Policy Routing

Multigateway

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.

Enviar cap a un gateway especific només a un router

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.

Fer els canvis permanents

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

Comprovacions

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
...

Vegeu també

encaminament