Sysresccd-networking de Fortgeschrittenes Netzwerken und Policy Routing |
History |
Contents |
Über Policy-Routing
Beim "klassischen" Routing wird die Ziel-Adresse eines IP-Paketes dazu benutzt, um herauszufinden, wie das Paket geroutet werden soll. Policy- Routing stellt eine fortgeschrittene Möglichkeit des Routing dar, welche es ermöglicht, auch andere Parameter als die Ziel-IP des Paketes für das Routing festzulegen. Beispielsweise möchten Sie vielleicht die Quell-Adresse oder den Port als Kriterium für die Route benutzen. Policy-Routing ist nur mit den Netzwerkkonfigurations-Tools der neuen Generation möglich, weshalb Sie die iproute2 Programme benötigen. Der Befehl route beherrscht kein Policy-Routing. Die gute Nachricht ist, daß die Unterstützung für Policy-Routing vor Jahren in den Kernel aufgenommen wurde, sodaß Sie Ihren Kernel nicht patchen müssen. Die Unterstützung ist optional, die meisten Linux-Distributionen unterstützen es aber standardmäßig.
Obwohl die alten Routing-Tools weiterhin unterstützt werden, ist es nicht möglich, die auf den Zieladressen basierenden Standard-Routen und die fortgeschrittenen Routen basierend auf erweiterten Parametern zu mischen. Deshalb muss man verschiedene Routing-Tabellen benutzen. Sie müssen Regeln aufstellen, die dem Kernel sagen, welche Routing-Tabelle für welches Netzwerk-Paket gelten soll. Beispielsweise können Sie sagen, daß TCP/IP Pakete mit speziellem Zielport eine spezielle Routing-Tabelle nutzen, und alle anderen Pakete die Haupt-Routing-Tabelle.
Die Routing-Tabelle
Policy-Routing benötigt mehr als eine Routing-Tabelle. Linux-2.6 unterstützt bis zu 255 verschiedene Routing-Tabellen. Standardmässig und mit den alten Werkzeugen nutzt man nur zwei: die local Routing-Tabelle und die main Routing-Tabelle. Mit Policy-Routing erstellen Sie weitere Routing-Tabellen. Die Tabellen werden in /etc/iproute2/rt_tables aufgelistet.
Die normalen Routing-Tabellen
- Die
localRouting-Tabelle wird automatisch vom Kernel verwaltet. Der Benutzer muss sich nicht darum kümmern. Sie wird für die Speicherung aller lokalen Adressen verwendet und erlaubt es dem Kernel zu wissen, ob ein Netzwerk-Paket auf der lokalen Maschine oder an einen anderen Computer ausgeliefert wird (es würde weitergeleitet, falls das erlaubt ist). Sie ist die erste echte Routing-Tabelle, die der Kernel benutzt, wenn er ein lookup macht. Sie wird direkt nach dem Routing-Cache benutzt, welches eine spezielle Routing-Tabelle ist.
- Die
mainRouting-Tabelle wird standardmässig für alle anderen Adressen benutzt. Das ist die Routing-Tabelle, welche vom Befehlroutegenutzt wird, und auch dann, wenn mitip routekein Tabellennname spezifiziert wurde.
- Die
customRouting-Tabellen sind die anderen Tabellen. Diese werden benutzt, wenn auf ein Netzwerkpaket eine der fortgeschrittenen Weiterleitungs-Regeln (festgelegt mitip rule) zutrifft. Diese sind normale Routing-Tabellen, die eine Default Route haben können.
Die Routing-Cache-Tabelle
Die routing cache Tabelle ist eine spezielle Routing-Tabelle, welche zur Geschwindigkeitssteigerung vom Kernel verwaltet wird. Es gibt nur eine Routing Cache Tabelle, auch wenn Sie mehrere Routing-Tabellen konfiguriert haben. In diesem Cache sichert der Kernel die Ergebnisse seiner letzten Weiterleitungs-Lookups. Es werden nur Lookup-Ergebnisse der IP-Adresse gespeichert, keine Routing-Informationen über Subnetze. Der Routing Cache kann mit ip route als andere Tabelle beeinflusst werden. Er kann mit ip route show cache angezeigt und mit ip route flush cache gelöscht werden. Der Cache ist die erste Routing-Tabelle welche vom Kernel angesprochen wird. Und zwar jedes mal, wenn ein Lookup ausgeführt wird. Sogar noch vor der lokalen Routing-Tabelle.
Beispiele für Routing-Tabellen
Nachfolgend ein Beispiel für eine Routing-Tabelle:
- Die
localRouting-Tabelle angezeigt voniproute2
% ip route show table local broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 local 192.168.157.3 dev eth0 proto kernel scope host src 192.168.157.3 broadcast 192.168.157.0 dev eth0 proto kernel scope link src 192.168.157.3 broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 broadcast 192.168.157.255 dev eth0 proto kernel scope link src 192.168.157.3 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
- Die
mainRouting-Tabelle angezeigt voniproute2
% ip route show table main 172.16.1.0/24 via 192.168.157.253 dev eth0 192.168.157.0/24 dev eth0 proto kernel scope link src 192.168.157.3 127.0.0.0/8 dev lo scope link default via 192.168.157.2 dev eth0
- Die
mainRouting-Tabelle angezeigt mit dem Befehlroute.
% route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.1.0 192.168.157.253 255.255.255.0 UG 0 0 0 eth0 192.168.157.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 192.168.157.2 0.0.0.0 UG 0 0 0 eth0
Regeln und Policies
Die Regeln dienen dazu, dem Kernel mitzuteilen, welche Aktion für welche Arten von Netzwerk-Paketen auszuführen sind. Die Aktion ist oftmals die Nutzung einer angepassten Routing-Tabelle, kann jedoch auch etwas Spezielles wie throw, unreachable, prohibit oder blackhole sein. Die Regeln sind der Ort, an dem der fortgeschrittene Paketvergleich stattfindet. NAchfolgend die Parameter, die benutzt werden können, um zu entscheiden, welche Routing-Tabelle genutzt werden soll:
- die IP source address und die IP destination address
- die ingress device d.h., wo das Paket herkommt
- die TOS (Type Of Service), welcher Teil des IP-Paket Headers ist
- die fwmark number (firewall mark). Das ist ein Attribut welches in netfilter geändert werden kann. Dies muss mit iptables erledigt werden.
Beispiele für Regeln
- Alle Pakete von 192.168.114.0/24 sollen die Routing-Tabelle rt_table1 nutzen
ip rule add from 192.168.114.0/24 table rt_table1
- Alle Pakete von 192.168.5.1 nach 172.16.1.100 sollen nicht weitergeleitet und es soll
unreachablevia ICMP zurückgemeldet werden:
ip rule add from 192.168.5.1 to 172.16.1.100 unreachable
- Alle Pakete von 192.168.5.1 ssollen nicht weitergeleitet werden:
ip rule add from 192.168.5.1 prohibit
- Alle Pakete, die mit fwmark=1 von netfilter gekennzeichnet sind (zu erledigen mit iptables), sollen an rt_table_adsl geleitet werden
ip rule add fwmark 1 table rt_table_adsl
- Alle Pakete, die mit fwmark=2 von netfilter gekennzeichnet sind (you can do that with iptables), sollen an rt_table_cable geleitet werden
ip rule add fwmark 2 table rt_table_cable
- Eine bestehende Regel kann auch mittels einer Syntax ähnlich dem Unterbefehl
addentfernt werden. Nachfolgend die Vorgehensweise für das Entfernen der letzten hinzugefügten Regel:
ip rule del fwmark 2 table rt_table_cable
Wie Regeln angewendet werden
Der Kernel unterstützt bis zu 32767 Regeln. Standardmässig werden nur die folgenden Regeln benutzt:
% ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default
Die Regeln werden in aufsteigender Reihenfolge ausgeführt, von Priorität 0 zu Priorität 32767. Das bedeutet, die erste Regel (Regel 0) ist die zuerst auszuführende, und es leitet alle Pakete an die lokale Routing-Tabelle, damit Pakete, die lokal ausgeliefert werden sollen, schnell bearbeitet werden können. Die main und default Routen sind die letzten, die für das Lookup benutzt werden. Dadurch wird die Haupt-Routing-Tabelle nur benutzt, wenn für ein Netzwerk-Paket in keiner der angepassten Tabellen eine Übereinstimmung gefunden wird. Anders ausgedrückt, alle Pakete, die keiner der mit ip rule festgelegten Regeln entsprechen, nutzen die Haupt-Routing-Tabelle. Die Standard-Routing-Tabelle ist leer. Sie können sie benutzen, wenn Sie Regeln für Pakete festlegen wollen, die keiner der vorherigen Routen entsprechen.
Seien Sie vorsichtig: selbst wenn Sie nur klassische Routing-Tabellen in Ihrem System haben, sind die Standard-Regeln wichtig. Entfernen der Standard-Routen durchbricht das klassische Routing, weil das Paket die Haupt-Routing-Tabelle nicht erreichen kann.
Wenn Sie Regeln aufstellen, können Sie einfach mit priority xxx Prioritäten setzen. Wenn Sie keine Priorität vergeben, wird die nächste verfügbare Zahl zugewiesen. Das bedeutet, die ersten neuen Regeln werden 32765, 32764, ...
Beispiele für Regeln
Nachfolgend eine Liste der Regeln, die wir bekommen, wenn wir alle oben genannten Regeln ausführen:
% ip rule show 0: from all lookup local 32761: from all fwmark 0x2 lookup rt_table_cable 32762: from all fwmark 0x1 lookup rt_table_adsl 32763: from 192.168.5.1 prohibit 32764: from 192.168.5.1 to 172.16.1.100 unreachable 32765: from 192.168.114.0/24 lookup rt_table1 32766: from all lookup main 32767: from all lookup default
Wie man Routing-Tabellen organisiert
Denken Sie daran, daß ein Paket mehrere Routing-Tabellen prüfen kann, jede Routing-Tabelle kann mehrere Routen enthalten. Wenn also keine Übereinstimmung in der ersten Routing-Tabelle gefunden wurde, werden andere Tabellen geprüft, um die korrekte Route füpr ein Paket zu finden. Daher müssen Sie die Routen der Haupt-Tabelle nicht in den angepassten Routing-Tabellen wiederholen.
Ein guter Weg um die verschiedenen Routing-Tabellen zu verwalten ist die folgende Methode:
- Sie fügen alle normalen Routen basierend auf den Zielen in die Haupt-Routing-Tabelle ein
- Sie fügen lediglich eine Standard-Route in jede der anderen Routing-Tabellen ein
Auf diese Weise erhalten Sie etwas recht einfaches und es gibt nur eine Route für jede Regel und die Liste der Regeln entspricht einer Master-Routing-Tabelle.
