Chapter 4. Regeln (Rules) - Routing-Policy-Datenbank

Hast du einen grossen Router, kannst du verschiedene Bedürfnisse von Personen haben, diese dann auch anbieten. Die Routing-Policy-Datenbank erlaubt dir das mit mehrere Sätze von Routingtabellen zu tun.

Wenn du diese Funktion nutzen möchtest, stelle sicher, dass dein Kernel mit den "IP: advanced router" und "IP: policy routing"-Funktionen compiliert wurde.

Soll der Kernel eine Routing-Entscheidung treffen, stellt er fest, welche Tabelle zu Rate gezogen werden muss. Standardmäßig gibt es drei Tabellen. Das alte 'route'-Werkzeug ändert die Haupt- und Lokaltabellen, ebenso wie das IP-Tool (standardmäßig).

Die Standardregeln:

[ahu@home ahu]$ ip rule list
0:	from all lookup local 
32766:	from all lookup main 
32767:	from all lookup default

Es listet die Priorität aller Regeln auf. Wir sehen alle Regeln gelten für alle Pakete ('from all'). Wir haben die Hautptabelle (main) gesehen, es ist die Ausgabe von ip route ls, aber die 'local'- und 'default'- Tabellen sind neu.

Wenn wir lustige Dinge tun wollen, erzeugen wir Regeln die auf verschiedenen Tabellen verweisen, die uns systemweite Routing-Regeln außer Kraft setzen lassen.

Für die genauen Semantik von dem was der Kernel bei mehreren Übereinstimmungsregeln macht, findest du in Alexey's ip-cref Dokumentation.

4.1. Einfaches Quellenrichtlinien-Routing (source policy routing)

Benutzen wir wieder ein reales Beispiel, ich habe 2 (momentan 3, zu gegebener Zeit komme ich darauf zurück) Kabelmodems, verbunden an einem Linux-NAT ('masquerading')-Router. Leute die hier leben bezahlen an mich die Nutzung des Internets. Sollte einer meiner Mitbewohner nur Hotmail besuchen und weniger bezahlen möchten, geht das für mich in Ordnung, er wird schlieslich nur das Low-End-Kabelmodem benutzen.

Das 'schnelle' Kabelmodem ist 212.64.94.251 und der PPP-Link zu 212.64.94.1. Das 'langsame' Kabelmodem hat variierende IP-Adressen, im Beispiel die 212.64.78.148 und hat einen Link zu 195.96.98.253.

Die lokale Tabelle:

[ahu@home ahu]$ ip route list table local
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
local 10.0.0.1 dev eth0  proto kernel  scope host  src 10.0.0.1 
broadcast 10.0.0.0 dev eth0  proto kernel  scope link  src 10.0.0.1 
local 212.64.94.251 dev ppp0  proto kernel  scope host  src 212.64.94.251 
broadcast 10.255.255.255 dev eth0  proto kernel  scope link  src 10.0.0.1 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 212.64.78.148 dev ppp2  proto kernel  scope host  src 212.64.78.148 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 

Viele offensichtliche Dinge, aber auch Dinge, die irgendwo festgelegt werden müssen. Nun, hier sind sie. Die Standardtabelle ist leer.

Lass uns in die Haupt('main')Tabelle schauen:

[ahu@home ahu]$ ip route list table main 
195.96.98.253 dev ppp2  proto kernel  scope link  src 212.64.78.148 
212.64.94.1 dev ppp0  proto kernel  scope link  src 212.64.94.251 
10.0.0.0/8 dev eth0  proto kernel  scope link  src 10.0.0.1 
127.0.0.0/8 dev lo  scope link 
default via 212.64.94.1 dev ppp0 

wir werden jetzt eine neue Regel für unseren hypothetischen Mitbewohner 'John' anlegen. Abwohl wir mir reinen Zahlen arbeiten, ist es einfacher wenn wir Tabellen in /etc/iproute2/rt_tables hinzufügen.

# echo 200 John >> /etc/iproute2/rt_tables
# ip rule add from 10.0.0.10 table John
# ip rule ls
0:	from all lookup local 
32765:	from 10.0.0.10 lookup John
32766:	from all lookup main 
32767:	from all lookup default

Alles was wir jetzt noch tun müssen ist John's Tabelle anzulegen und den Routingcache zu reinigen (flush).

# ip route add default via 195.96.98.253 dev ppp2 table John
# ip route flush cache

Und wir sind fertig. Eine Übung für den Leser ist es, dies in ip-up einzubauen.