spacer
Homepage | Manual | Forums

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 local Routing-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 main Routing-Tabelle wird standardmässig für alle anderen Adressen benutzt. Das ist die Routing-Tabelle, welche vom Befehl route genutzt wird, und auch dann, wenn mit ip route kein Tabellennname spezifiziert wurde.
  • Die custom Routing-Tabellen sind die anderen Tabellen. Diese werden benutzt, wenn auf ein Netzwerkpaket eine der fortgeschrittenen Weiterleitungs-Regeln (festgelegt mit ip 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 local Routing-Tabelle angezeigt von iproute2
% 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 main Routing-Tabelle angezeigt von iproute2
% 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 main Routing-Tabelle angezeigt mit dem Befehl route.
% 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 unreachable via 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 add entfernt 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.

spacer