LARTC: Policy-Based-Routing mit Debian und iptables

Policy-Based-Routing beschreibt die Möglichkeit, Routing nicht nur von der Destination-IP abhängig zu machen sondern von selbst definierten Regeln (Policies).

So können zum Beispiel Pakete aufgrund ihrer Source-IP oder ihres Destination-Ports geroutet werden. Dies wird benötigt wenn man zwei oder mehrere Gateways nutzen möchte (z.B. zwei DSL-Leitungen). Man könnte dann Webtraffic vom restlichen Traffic (Mail, VPN, Fernwartung...) trennen.

Webtraffic (Port 80 und 443) über zweites Gateway routen

Im folgenden Beispiel gibt es drei Interfaces, jeweils mit IP und Gateway. An einem Interface hängen alle LAN-Clients. Ein weiteres wird für nicht priorisierte Anwendungen genutzt (z.B. Mail). Hier ist es nicht wichtig eine hohe Bandbreite zur Verfügung zu haben. Außerdem gibt es ein LTE-Interface an welchem ein weiterer Router oder ein LTE-Modul angeschlossen wird. Webtraffic für Port 80 oder Port 443 soll nur über dieses Gateway geroutet werden. Somit werden Downloads schneller abgeschlossen.

Netzaufbau

eth0 LAN-Netz, alle Clients
ppp0 WAN-IP, PPPoE Einwahl-Punkt, 6MBit/s
eth2 LTE-Gateway mit LTE-Modul, 50MBit/s

Firewall-Regeln mit iptables

Mit iptables markieren wir nun in der MANGLE-Tabelle alle relevanten Pakete mit einer 2.

iptables -A PREROUTING -t mangle -i eth0 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
iptables -A OUTPUT -t mangle -p tcp -m multiport --dports 80,443 -j MARK --set-mark 2
iptables -A POSTROUTING -t nat -o eth2  -j SNAT --to-source 192.168.10.254

Für Pakete die lokal erzeugt werden, greift die PREROUTING-Regel nicht, da diese die Maschine nicht passieren. Hierfür muss OUTPUT (wie oben zu sehen) verwendet werden. Als letztes muss noch ein Source-NAT ergänzt werden, weil sonst die Pakete im Falle des alternativen Routings mit der falschen Source-IP verschickt werden würden.

Anlegen der zweiten Routingtabelle

Jetzt kann eine zweite Routingtabelle erstellt werden. Gegebenenfalls mit apt-get install iproute2 das entsprechende Paket nach installieren. Dieses sollte aber bei allen gängigen Distributionen enthalten sein.

echo "201 lte_http" >> /etc/iproute2/rt_tables

Interface-Konfiguration

Das Routing über das alternative Interface (hier eth2) geschieht mithilfe der neu erstellten Routingtabelle. Wir haben die Web-Pakete (Port 80 und 443) mit iptables markiert, haben eine weitere Routingtabelle erstellt und müssen jetzt noch Regeln (Policies) für das Routing festlegen.

Alle mit einer 2 markierten Pakete sollen über die alternative Routingtabelle geroutet werden. Das geht mit ip rule add und ip route add. Solange diese Anweisungen in der Interface-Konfiguration stehen, sind Sie boot-safe, also auch nach einem Neustart des Servers wieder aktiv. Die Config findest du unter vim /etc/network/interfaces.

# LTE
auto eth2
iface eth2 inet static
    address 192.168.10.254
    netmask 255.255.255.252

    post-up ip rule add fwmark 2 table lte_http
    post-up ip route add default via 192.168.10.253 dev eth2 table lte_http

Und schon hast du einen Dual-Uplink Router eingerichtet. Es lässt sich natürlich auch ein Load-Balancer einrichten und viele andere nützliche Dinge.

Wer mehr erfahren möchte, schaut bei den Leuten von Linux Advanced Routing & Traffic Control vorbei.