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)

En xarxes de computadors, policy-based routing (PBR) és una tècnica utilitzada per prendre decisions de rutes segons certes polítiques establertes per l'administrador de la xarxa.

Quan un router rep un paquet normalment es decideix la ruta que seguirà aquest paquet segons la adreça IP de destinació. A partir d'aquesta adreça es decidira una ruta consultant la taula de rutes de l'encaminador/router. en alguns casos però, pot ser interessant encaminar el paquet segons altres criteris, per exemple segons la ip d'origen, la mida del paquet o qualsevol altre informació de les capçaleres del paquet.

A Linux hi ha suport per a múltiples taules de rutes des del kernel 2.2 utilitzant l'ordre ip (paquet iproute de Debian/Ubuntu).

Routing Policy Database (RPDB)

RPDB són les inicials de Routing Policy Database. Aquesta base de dades controla l'ordre en que el nucli del sistema (kernel) busca a través de les taules de rutes. La base de dades es compon de un conjunt de normes (rules). Cada norma té una prioritat i les normes són examinades de forma seqüencial de la norma 0 a la norma 32767 (2 elevat a 16 entre 2).

Quan un paquet arriba al sistema per tal de ser encaminat (assumint que la memòria cau d'encaminament - routing cache - està buida) el nucli comença a recórrer la RPDB començant per la norma de més prioritat (la zero). El nucli itera tota les normes fins que troba una norma que coincideixi (match). Quan això succeïx aleshores el nucli segueix les ordres indicades per la norma coincident. El més habitual és que es faci una cerca de la ruta (route lookup) que pertoqui en una de les taules de rutes del sistema i si es troba la ruta a la taula de rutes indicada aleshores el nucli utilitza aquesta ruta. Sinó es troba la ruta, aleshores es torna a la RPDB per continuar buscant normes que s'apliquin al paquet.

IMPORTANT: Tingueu en compte que la RPDB no es consultada per cada paquet rebut per a no penalitzar el rendiment del sistema. Existeix un cache anomenat routing cache o FIB que conté les últimes decisions preses. podeu forçar l'esborrament de la cache amb l'ordre ip

Cal però tenir en compte que hi ha múltiples tipus de normes a utilitzar a la routing policy database. Els tipus de rutes són molt similars als tipus de rutes disponibles a les entrades de una taula de rutes (però cal no confondre-les). Al següent apartat es veuen els tipus de normes i es posen exemples.

Les normes es gestionen amb l'ordre ip, concretament amb l'opció rule --> ip rule

Recursos:

Tipus de rutes

Al mostrar les rutes amb l'ordre ip route show:

$ ip route show

La primera columna de la sortida de l'ordre indica el tipus de ruta. Per exemple:

$ ip route show
default via 192.168.111.100 dev eth0  proto static 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.111.0/24 dev eth0  proto kernel  scope link  src 192.168.111.57  metric 1 

La primera línia és una ruta de tipus default. Les altres entrades no indiquen el tipus i en aquest cas s'aplica el tipus per defecte (tipus default). Als següents apartats s'expliquen el tipus de rutes.

Alguns dels tipus de rutes més "atípics" com local o broadcast els trobareu a la taula de rutes local:

$ ip route show table local
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.111.0 dev eth0  proto kernel  scope link  src 192.168.111.57 
local 192.168.111.57 dev eth0  proto kernel  scope host  src 192.168.111.57 
broadcast 192.168.111.255 dev eth0  proto kernel  scope link  src 192.168.111.57 

Els altres tipus els trobareu rarament en configuracions per defecte a no ser que els haguéssiu especificat de forma explícita o utilitzeu aplicacions com quagga o encaminament dinàmic

Per més informació consulteu el manual:

$ man ip
...
ip route - routing table management
      Manipulate route entries in the kernel routing tables keep information about paths to other networked nodes.

      Route types:

              unicast - the route entry describes real paths to the destinations covered by the route prefix.

              unreachable - these destinations are unreachable.  Packets are discarded and the ICMP message host unreachable  is  gener‐
              ated.  The local senders get an EHOSTUNREACH error.

              blackhole - these destinations are unreachable.  Packets are discarded silently.  The local senders get an EINVAL error.

              prohibit  - these destinations are unreachable.  Packets are discarded and the ICMP message communication administratively
              prohibited is generated.  The local senders get an EACCES error.

              local - the destinations are assigned to this host.  The packets are looped back and delivered locally.

              broadcast - the destinations are broadcast addresses.  The packets are sent as link broadcasts.

              throw - a special control route used together with policy rules. If such a route is selected, lookup in this table is ter‐
              minated  pretending  that  no route was found.  Without policy routing it is equivalent to the absence of the route in the
              routing table.  The packets are dropped and the ICMP message net unreachable is generated.  The local senders get an  ENE‐
              TUNREACH error.

              nat  -  a  special NAT route.  Destinations covered by the prefix are considered to be dummy (or external) addresses which
              require translation to real (or internal) ones before forwarding.  The addresses to translate to  are  selected  with  the
              attribute Warning: Route NAT is no longer supported in Linux 2.6.

              via.

              anycast  -  not  implemented  the destinations are anycast addresses assigned to this host.  They are mainly equivalent to
              local with one difference: such addresses are invalid when used as the source address of any packet.

              multicast - a special type used for multicast routing.  It is not present in normal routing tables.

unicast

Una norma unicast és la més comuna de les normes. Vegem alguns exemples de com definir una norma d'aquest tipus amb ip rule add:

$ sudo ip rule add unicast from 192.168.100.17 table 5

L'anterior norma es tradueix com: si arriba un paquet procedent de la IP 192.168.100.17 envia'l a la taula de rutes 5.

$ sudo ip rule add unicast iif eth7 table 5

L'anterior norma es tradueix com: si arriba un paquet per la interfície eth7 envia'l a la taula de rutes 5.

$ ip rule add unicast fwmark 4 table 4

L'anterior norma es tradueix com: si arriba un paquet amb la marca fwmark 4 envia'l a la taula de rutes 4.

broadcast

Aquest tipus de rutes és utilitzada només en dispositius de capa 2 (normalment targetes de xarxa Ethernet) que suporten broadcast. Aquest tipus de tura normalment és només utilitzada a la taula de rutes local i típicament es controlada automàticament pel nucli del sistema (els usuaris no utilitzant aquest tipus de rutes). Les podeu veure a la taula de rutes local:

$ ip route show table local | grep broadcast
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 192.168.111.0 dev eth0  proto kernel  scope link  src 192.168.111.57 
broadcast 192.168.111.255 dev eth0  proto kernel  scope link  src 192.168.111.57 

A l'exemple com podeu veure s'utilitzen per definir les adreces IP reservades d'una xarxa (adreça de xarxa i adreça de broadcast). A l'exemple vegem la configuració d'aquestes adreçes per a la interfície loopback i la configuració per a la interfície eth0.

Altres exemples:

$ ip route add table local broadcast 10.10.20.255 dev eth0 proto kernel scope link src 10.10.20.67
$ ip route add table local broadcast 192.168.43.31 dev eth4 proto kernel scope link src 192.168.43.14

local

Aquest tipus de rutes normalment només són afegides i gestionades pel nucli del sistema. Aquest tipus de rutes només es solen trobar a la taula de rutes local:

$ ip route show table local | grep local
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
local 192.168.111.57 dev eth0  proto kernel  scope host  src 192.168.111.57 

Exemples:

ip route add table local local 10.10.20.64 dev eth0 proto kernel scope host src 10.10.20.67
ip route add table local local 192.168.43.12 dev eth4 proto kernel scope host src 192.168.43.14

nat

IMPORTANT: Cal diferencia entre el NAT fet amb iptables (amb estat) i el NAT descrit en aquest apartat: Stateless NAT

Les normes nat són necessàries per al correcte funcionament del NAT sense estat (stateless NAT). La norma nat normalment està relacionada amb la corresponent entrada NAT. L'entrada nat del RPDB provoca que el nucli torni a escriure la adreça d'origen de un paquet de sortida.

Vegem alguns exemples:

$ sudo ip rule add nat 193.7.255.184 from 172.16.82.184

L'anterior norma es tradueix com: canviar la IP d'origen del paquet sortint a 193.7.255.184 si bé de la IP 172.16.82.184

$ sudo ip rule add nat 10.40.0.0 from 172.40.0.0/16

L'anterior norma es tradueix com: canviar la IP d'origen del paquet sortint a 193.7.255.184 si bé de la xarxa 172.40.0.0/16

unreachable

Qualsevol norma que sigui de tipus unreachable provocarà que el nucli envii un paquet ICMP unreachable (vegeu ICMP) a la IP d'origen del paquet.

Exemples:

$ sudo ip rule add unreachable iif eth2 tos 0xc0

L'anterior norma es tradueix com: qualsevol paquet que provingui de la xarxa eth2 i tingui un ToS 0xc0 l'origen del paquet rebrà un missatge ICMP unreacheable.

$ sudo ip rule add unreachable iif wan0 fwmark 5

L'anterior norma es tradueix com: qualsevol paquet que provingui de la xarxa wan0 i estigui marcat amb la marca fwmark l'origen del paquet rebrà un missatge ICMP unreacheable.

$ sudo ip rule add unreachable from 192.168.7.0/25

L'anterior norma es tradueix com: qualsevol paquet que provingui de la xarxa 192.168.7.0/25 l'origen del paquet rebrà un missatge ICMP unreacheable-

prohibit

Similar a l'anterior però el paquet enviat serà ICMP prohibited. Alguns exemples:

$ sudo ip rule add prohibit from 209.10.26.51
$ sudo ip rule add prohibit to 64.65.64.0/18
$ sudo ip rule add prohibit fwmark 7
               

blackhole

En aquest cas el paquet es descartat (dropped). No s'envia cap tipus de paquet ICMP a l'origen. Alguns exemples:


$ sudo ip rule add blackhole from 209.10.26.51
$ sudo ip rule add blackhole from 172.19.40.0/24
$ sudo ip rule add blackhole to 10.182.17.64/28

Detalls de la selecció de rutes

Ordres

ip rule

Vegeu ip rule.

Linux Advanced Routing & Traffic Control (LARTC)

Linux Advanced Routing & Traffic Control

Source routing

Exemples

Multigateway

Consulteu Multigateway

NAT i multigateway

Consulteu NAT i multigateway

Enviar cap a un gateway especific només una màquina

Consulteu Ordre_ip#Enviar_cap_a_un_gateway_especific_nom.C3.A9s_una_m.C3.A0quina

Decidir una ruta segons l'origen del paquet

Es pot fer amb iptables i fwmark:

Consulteu Iptables#Decidir_una_ruta_segons_l.27origen_del_paquet

Migració servidor d'una IP pública a un altre. Canvis en DNS

Consulteu Multihomed#Migraci.C3.B3_servidor_d.27una_IP_p.C3.BAblica_a_un_altre._Canvis_en_DNS

Asymmectric Routing

Consulteu Multihomed#Overcoming_Asymmetric_Routing_on_Multi-Homed_Servers

Guardar els canvis de forma permanent

Combinant els hooks de la configuració de la xarxa (de forma similar al que es fa amb les rutes estàtiques) i /etc/rc.d/rc.local (a Debian/Ubuntu el fitxer és /etc/rc.local)

$ cat /etc/network/if-up.d/rutes
 #!/bin/sh
 if [ "$IFACE" = eth1 ]; then    
 	123.456.789.0/24 dev eth0 src 123.456.789.25 table new
        default via 123.456.789.1 dev eth0 table new
 fi 
 exit 0

Recordeu de fer el fitxer executable:

$ sudo chmod +x /etc/network/if-up.d/rutes

NOTA: Aquest script s'executarà cada cop que es reconfiguri la xarxa, ja sigui a l'arrancada o al fer un /etc/init.d/networking restart o simplement al utilitzar ifup. Per evitar que s'executi varies vegades (tantes com targetes de xarxa tinguem) fixeu-vos com utilitzem un if que provoca que només s'executi amb la interfície eth1!

NOTA: En altres sistemes no Debian es podria fer a /etc/sysconfig/network-scripts/

Ara la definició de la norma:

$ cat /etc/rc.d/rc.local
# Temporary routing rules while two public NICs are active
ip rule add from xxx.xxx.xxx.25/32 table new
ip rule add to xxx.xxx.xxx.25/32 table new
ip route flush cache

IMPORTANT: No definiu la norma a /etc/network/if-up.d/rutes ja que es pot executar múltiples vegades i així tindríeu múltiples normes fet que pot enredar molt la configuració! Si ho feu a rc.local us assegureu que es fa només un sol cop al arrancar la màquina.

Sistemes operatius

Cisco IOS

Cisco IOS, implementa PBR utilitzant route maps. TODO

Open BSD

Virtual Routing Table

RouterOS

Vegeu RouterOS Policy routing.

Vegeu també

Enllaços externs