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.