Advanced Routing

Aus Freifunk Leipzig
Wechseln zu: Navigation, Suche

Es gibt mehrere Möglichkeiten, Routing in Linux sehr präzise zu steuern. Eine Möglichkeit ist, das "route target" von iptables. Da dies aber erst in den Kernel gepatched werden muss, es aber auch mit anderen Standard-Tools geht, hier einige Erklärungen:

Linux besitzt 255 getrennte Routing-Tabellen, davon sind drei fest vergeben. Eigentlich besitzen sie Nummern, aber es können in /etc/iproute2/rt_tables auch Aliase vergeben werden.

Default:

255     local
254     main
253     default
0       unspec

"local" sind alle Routen, die direkt über das Netzwerkinterface ansprechbar sind. "main" ist die Tabelle, welche der normale route-Befehl ausgibt.

Der Linux Kernel, besitzt im Routing ebenso ein Regelwerk, wie die Firewall, mit welchem entschieden wird, welche Routingtabelle benutzt wird.

ip rule show

zeigt diese Regeln, falls vorhanden, an. Die Regeln werden nach Prioritäten abgearbeitet. Sobald ein Routing-Eintrag passt, geht das Paket raus.


Hier ein Beispiel, wie die 239.1 den Netzwerkverkehr regelt:


#!/bin/sh

# we have to fix the default route, elsewise
# we trap packages  from nodes with internet connection
# but no freifunk default route

# Wir markieren zuerst durch eine iptables-Regel, dass jedes Paket,
# welches vom VPN kommt, mit einem mark versehen wird.
# Dieses bleibt, solange es im System ist, erhalten und lässt es später
# eindeutig identifizieren
iptables -t mangle -I INPUT -i tap0 -j MARK --set-mark 4

# Da die default-Regeln sehr hohe Nummern besitzten (> 3000),
# wird die folgende Regel viel früher ausgeführt.
# Wir sagen hier, dass alle Pakete, die den mark 4 besitzen, direkt 
# in die main-routing-Tabelle sollen.
ip rule add fwmark 4 table main prio 2

# Im UML-Fall wollen wir, dass alle Pakete, die vom eth0 interface
# gehen, bzw. von der IP, welche Kontakt zum Internet hat, nicht durch die
# normale Routingtablle fließen, sondern direkt nach außen wandern.
# Dies ist nötig, weil der OpenVPN Server ja mit seinen Clients auch Kontakt haben muss.
# OLSR setzt aber eine default route in der main-Tabelle.
# Durch die Priorität 1 wird sie vor der vorigen Regel abgearbeitet und trifft auch 
# nur Pakete, die von 192.168.199.2 kommen.
ip rule add from 192.168.199.2 table 1 prio 1

# Jetzt nur noch eine route in der Tabelle 1 anlegen, welche nach draußen kann
ip route add default via 192.168.199.1 table 1

iproute2 kann noch viel mehr und es gibt noch viele andere Möglichkeiten, Regeln zu erstellen.