Freifunk Augsburg

Blog zu Freifunk Augsburg und Mesh-Netzen im Allgemeinen

Policy Routing für die FFLuci-Firmware

Was ich bisher immer mal wieder vermisst hab bei FFLuci war eine einfache Möglichkeit, seinen eigenen Traffic und solchen aus dem Netz auf unterschiedlichen Wegen zu routen. Zwei Szenarien wo man das braucht:

  1. Man ist über Tunnel (z.B. tinc, openvpn oder n2n) mit dem Rest vom Mesh verbunden. Um sich mit anderen Knoten übers Internet verbinden zu können braucht der eigene Router natürlich Internet über den eigenen Anschluss. Das Problem ist nun aber, dass entweder Netzwerkverkehr aus dem Freifunknetz ebenfalls über dein eigenen Internetgateway geroutet wird, wenn er den Router durchläuft oder aber dass der Tunnel aufgebaut wird, darüber erhält man dann eine Defaultroute die übers Mesh geht und wenn deren Metrik niedriger ist als die des eigenen Internetgateways dann versucht der Knoten fortan, den Tunnel durch den Tunnel selbst aufrechtzuerhalten und bricht dann immer wieder ab.
  2. Man hat eigenes Internet aber Bedenken, das andere mitbenutzen zu lassen, will aber gleichzeitig etwas zum Freifunknetz durch eigene Bandbreite (übers WLAN oder über Tunnel) beitragen. Mit Policy Routing wird es hier möglich, dass der eigene Router und direkt am Lan angeschlossene Rechner die eigene Internetleitung benutzen während Traffic aus dem Freifunk an einen Internetgateway im freifunk weitergeleitet wird.

Man konnte das mit fortgeschrittenen Iptables- und Routing-Kenntnissen auch jetzt schon mit OpenWrt hinbasteln, aber das war dann meistens ziemlich statisch und ein ugly hack. Und für den Durchschnittsuser auch definiitiv zu schwierig.

Daher hab ich nun ein paar hotplug Skripte geschrieben, die diese beiden Fälle abdecken und die man einfach über (derzeit) drei Optionen via uci (etc/config/freifunk-policyrouting) konfigurieren kann.

 

config 'settings' 'pr'
        option 'enable' '0'
        option 'strict' '1'
        option 'zones' ''

 

enable schaltet Policy Routing ein (1) oder aus (0). Die Option strict legt fest, ob man erlauben oder verbieten will, dass Traffic aus dem Mesh als Fallback über die eigene Internetleitung geroutet wird, wenn kein anderer Gateway im Mesh verfügbar ist. zones legt fest, aus welchen Firewallzonen Traffic kommen muß, um via Policy Routing über einen Gateway im Mesh geroutet werden. Dabei wird einfach eine Liste der Zonen verwendet, z.B. "freifunk lan". Verändert man diese Parameter auf der Shell via uci oder direktes editieren des Configfiles, dann muß danach noch das Netzwerk mit "/etc/init.d/network restart" neu gestartet oder der Router rebootet werden.

Aber es geht noch einfacher, da es auch eine Erweiterung für LuCI für freifunk-policyrouting gibt, die man mit "opkg install luci-app-freifunk-policyrouting" installieren kann. Danach findet man im Freifunk-Menü in der Administrationsoberfläche einen Menüpunkt Policy Routing.

(Das gibts natürlich auch in anderen Sprachen)

Technische Details

Eine kurze und unvollständige Erklärung, wie das technisch realisiert wurde. Das Commit-Log ist hier zu finden: http://luci.subsignal.org/trac/changeset/6967/luci/trunk

 

Zunächst wird olsr mit den Optionen

        option 'RtTable' '111'
        option 'RtTableDefault' '112'

angewiesen, seine Routen in 2 eigene Tabellen zu schreiben. Dabei landet in RtTableDefault die Defaultroute, die über olsr empfangen wurde. Diese Tabelle nennen wir 112. Alle anderen von OLSR empfangenen Routen landen in Table 111.

Über /etc/iproute2/rt_tables können wir den Tabellen noch schönere Namen geben, indem folgendes hinzugefügt wird:

111 olsr
112 olsr-default

Über die beiden hotplug Skripte wird dem Kernel nun mitgeteilt, wie er mit Traffic aus verschiedenen Firewallzonen umgehen wollen.

/etc/hotplug.d/iface/30-policyrouting

Zuerst müssen die neuen Routingtables angelegt werden. Die dafür benötigten Regeln:

# $NETWORK/$NETMASK sind Netzwerkadresse und IP des eigenen Standardgateways
ip route add $NETWORK/$NETMASK dev $device table default
ip route add default via $gw dev $device table default
ip rule del lookup main
ip rule add fwmark 1 lookup olsr-default
ip rule add lookup main
ip rule add lookup olsr

Ausserdem wird in diesem Script dann auch noch olsrd_dyn_gw und/oder olsrd_dyngw_plain deaktiviert, da eine automatische Ankündigung von "Internet" bei desem Setup keinen Sinn mehr machen würde.

/etc/hotplug.d/firewall/24-policyrouting

Hier wird ermittelt, welche Interfaces den konfigurierten Zonen angehören und diesen ein Mark mit dem dem Wert 1 angehängt. Dazu wird erst eine neue Chain angelegt und auf diese in PREROUTING der table mangle verwiesen:

iptables -t mangle -N prerouting_policy
iptables -t mangle -I PREROUTING -j prerouting_policy


Als nächstes wird dann für alle Interfaces die nur über olsr geroutet werden sollen eine Regel eingefügt, die ihnen das Mark anhängt:

iptables -t mangle -I prerouting_policy -i $dev -j MARK --set-mark 1

Policy Routing aktiviert - Wo sind meine Routen hin?

Die Ausgabe von "ip route" zeigt nun nur noch wenige Routen an. Standardgateway und alle von olsr empfangenen Routen sind in andere Tabellen ausgelagert.

  • Die Defaultroute kann man sich nun mit "ip route show table default" oder kurz "ip r s t default" ansehen.
  • Die olsr routen findet man mit "ip r s t olsr"
  • Die über olsr empfangene Defaultroute findet man mit "ip r s t olsr-default"
  • Alle Routingtabellen kann man anzeigen mit "ip ru s"

Warning

Obwohl das freifunk-policyrouting ausgiebig getestet wurde ist doch davon auszugehen, dass noch irgendwo Fehler stecken. Ich übernehme keine Verantwortung für evtl. nicht mehr erreichbare Router. Aber ich freue mich über Feedback und Bugreports und werde dann auch versuchen zu helfen.

 

Kommentare (0)

Bisher keine Kommentare vorhanden.

Neuen Kommentar schreiben