Website-Icon Sugar Camp

Anleitung: 2 Default Gateways auf einem Linux einrichten mit iproute

Anleitung

Anleitung

Wozu benötigt man 2 Default Gateways in einem System?

Eigentlich gar nicht aber manchmal tritt eben dieser Fall ein, dass man 2 Gateways braucht. Sei es weil 2 Netzwerkkarten verbaut sind oder man bestimmten Traffic nur durch ein bestimmtes Device oder mit einer bestimmten IP routen möchte. Sollte man hier kein konsistentes Routing haben, kann es zu asynchronem Routing kommen und einige Pakete könnten im Router somit verloren gehen.

Ein anderer Fall ist wenn man ein VPN im Einsatz hat und nicht generell den gesamten Traffic durch das VPN leitet. Hat man hier nun eine Applikation und gibt als „outgoing“ IP die VPN IP an so wird dieser Traffic natürlich auch durch das Default Gateway geroutet. Die folgenden Gateways können mit dieser IP natürlich nichts anfangen und es landet im Nirvana. 

Lösung?

Man kann mittels iproute2, welches in fast allen Linux Distributionen bereits enthalten und meistens schon installiert ist, eine zweite Routingtabelle erstellen und bestimmten Traffic regelbasiert direkt auf ein anderes Gateway routen. Somit lernt Linux, dass es 2 verschiedene Gateways hat und wohin welcher Traffic geroutet werden soll.

Klingt komplizierter als es ist 😉 

[su_box title=“Wichtig!“ style=“glass“ box_color=“#e15908″]Ich weise schon mal vorab darauf hin, dass alle IP Adressen und Gateways hier nur als Beispiel genannt sind. Die Daten müssen an eure IP’s und Gateways angepasst werden.[/su_box]

Ausgangskonfiguration

In obigen Fall fragte mich also ein Freund wieso seine Applikation nicht ins Internet geht obwohl der Server eine permanente Internet Verbindung hat. Nach ein wenig suchen fand ich dann heraus, dass als Ausgangs IP tatsächlich die VPN Adresse konfiguriert war.

Wir haben also eine public IP: 192.168.0.116 auf eth0 mit dem Gateway 192.168.0.1

Eine VPN IP: 10.8.5.58 auf tun0 (Hat natürlich kein Gateway da es eth0 benutzt)

Das tun0 könnte ebenso gut eine zweite physische Netzwerkkarte sein.

In der /etc/network/interfaces würde das so aussehen:

[su_note note_color=“#c1c1b6″]

 

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface

auto lo
iface lo inet loopback

# The primary network interface

allow-hotplug eth0
iface eth0 inet static
    address 192.168.0.116
    netmask 255.255.255.0
    gateway 192.168.0.1

# The secondary network interface
allow-hotplug eth1
iface eth1 inet static
    address 10.8.5.58
    netmask 255.255.255.0

 

[/su_note]

 

Hinzufügen einer zweiten Routingtabelle für das zweite Gateway

Für die neue Routingtabelle müssen wir zuerst in der vorhandenen Tabelle eine Referenz auf die zweite Tabelle erstellen.

Es muss dazu die Datei /etc/iproute2/rt_tables bearbeitet werden

[su_note note_color=“#c1c1b6″]

255	local
254	main
253	default
0	unspec
#
# local
#
#1	inr.ruhep
1 rt2

[/su_note]

Hat man am Ende einfach „1 rt2“ hinzugefügt kann man die Datei speichern.

Die zweite Routing Tabelle befüllen

Nun fehlen eigentlich nur noch 4 Regeln um die zweite Routingtabelle zu benutzen.

[su_note note_color=“#c1c1b6″]

ip route add 10.8.5.0/24 dev tun0 src 10.8.5.58 table rt2
ip route add default via 10.8.5.1 dev tun0 table rt2

[/su_note]

So würden die beiden ersten Befehle für die zweite Routingtabelle aussehen. Die erste Regel besagt, dass das Netzwerk 10.8.5.0/24 immer durch das tun0 gehen soll und die tun0 IP 10.8.5.58 ist.

Die Zweite Regel sagt, dass das gesamte 10.8.5.0/24 Netzwerk über das Gateway 10.8.5.1 durch das Interface tun0 gehen soll.

[su_box title=“Wichtig!“ style=“glass“ box_color=“#e15908″]Achtung, ich gehe hier davon aus, dass immer eine statische VPN IP existiert und diese sich nie ändert. Sollte dies nicht der Fall sein muss bei jedem Reboot die Tabelle neu befüllt werden mit der aktuellen IP.[/su_box]

Routing Regeln für die Gateways festlegen

Kommen wir jetzt zu den Routingregeln damit das System auch weiß wann es diese zweite Routingtabelle zu benutzen hat.

[su_note note_color=“#c1c1b6″]

ip rule add from 10.8.5.58/32 table rt2
ip rule add to 10.8.5.58/32 table rt2

[/su_note]

Hiermit legen wir fest, dass der eingehende sowie der ausgehende Traffic der IP 10.8.5.58 immer die Routingtabelle „rt2“ benutzen soll.

Das war es auch schon. Wenn man das ganze nun noch dauerhaft machen möchte, gibt es diese Lösung für den Fall das 2 Netzwerkkarten vorhanden sind.

Die /etc/network/interfaces erneut bearbeiten und die Zeilen mit „post-up…“ beim jeweilgen Interface hinzufügen

[su_note note_color=“#c1c1b6″]

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface

auto lo
iface lo inet loopback

# The primary network interface

allow-hotplug eth0
iface eth0 inet static
    address 192.168.0.116
    netmask 255.255.255.0
    gateway 192.168.0.1

# The secondary network interface
allow-hotplug eth1
iface eth1 inet static
    address 10.8.5.58
    netmask 255.255.255.0
    post-up ip route add 10.8.5.0/24 dev eth1 src 10.8.5.58 table rt2
    post-up ip route add default via 10.8.5.1 dev eth1 table rt2
    post-up ip rule add from 10.8.5.58/32 table rt2
    post-up ip rule add to 10.8.5.58/32 table rt2

[/su_note]

Diese Lösung funktioniert natürlich nicht wenn man es mit dem VPN benützen möchten.

Für ein VPN Routing gibt es zwei Möglichkeiten. Entweder wir fügen in die /etc/rc.local folgendes hinzu:

[su_note note_color=“#c1c1b6″]

ip route add 10.8.5.0/24 dev tun0 src 10.8.5.58 table rt2
ip route add default via 10.8.5.1 dev tun0 table rt2
ip rule add from 10.8.5.58/32 table rt2
ip rule add to 10.8.5.58/32 table rt2
#Wichtig, das muss vor dem "exit0" stehen.
[/su_note]


oder man macht das nach einem Reboot erneut manuell.

Die Konfiguration kann man mit diesen beiden Befehlen prüfen

[su_note note_color=“#c1c1b6″]

ip route list table rt2
ip rule show
[/su_note]

Dauert insgesamt ca 10 Minuten und danach sollte es genau so funktionieren wie gewünscht ;-) 
Das funktioniert übrigens auch Prima in Proxmox LXC Containern ohne sich selbst abzuschießen ;-) 
Share it!
Die mobile Version verlassen