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).
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:
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.
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.
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
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
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
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-
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
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
Vegeu ip rule.
Linux Advanced Routing & Traffic Control
Consulteu Multigateway
Consulteu NAT i multigateway
Consulteu Ordre_ip#Enviar_cap_a_un_gateway_especific_nom.C3.A9s_una_m.C3.A0quina
Es pot fer amb iptables i fwmark:
Consulteu Iptables#Decidir_una_ruta_segons_l.27origen_del_paquet
Consulteu Multihomed#Migraci.C3.B3_servidor_d.27una_IP_p.C3.BAblica_a_un_altre._Canvis_en_DNS
Consulteu Multihomed#Overcoming_Asymmetric_Routing_on_Multi-Homed_Servers
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.
Cisco IOS, implementa PBR utilitzant route maps. TODO
Vegeu RouterOS Policy routing.