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