HowTo: Mehrere Default Gateways unter Linux
Einleitung
Wenn eine VM mehrere LAN-Interfaces im selben Netzwerk hat, kann es unter Linux zu Routing-Problemen kommen. Der häufigste Grund ist, dass auf mehreren Interfaces gleichzeitig ein Gateway oder zusätzliche Routen gesetzt werden. Dann ist für das System nicht mehr eindeutig, über welches Interface der Rückweg laufen soll.
Damit es nicht zu Verbindungsproblemen kommt, sollte nur ein Interface als primäres Interface mit Gateway genutzt werden. Auf allen weiteren Interfaces muss verhindert werden, dass dort ebenfalls eine Standardroute gesetzt wird.
Achten Sie immer auf ein sauberes Netzwerk design, vermeiden die Sie mehrere Interfaces im gleichen Netzwerk.
Das Problem
Es wurde eine VM mit zwei Interfaces im selben Netzwerk ausgerollt. IP-Adresse 1: 192.168.94.190 und IP-Adresse 2: 192.168.94.253. Openstack macht per default DHCP auf jedem Interface.
In der Routing Tabelle von Linux gibt es jetzt mehrere default routes was dazu führt, wenn eine Anfrage von außen über die floating IP kommt, dass mal die IP 192.168.94.190 und mal 192.168.94.253 antwortet.
default via 192.168.94.1 dev enp7s0 proto dhcp src 192.168.94.190 metric 100
default via 192.168.94.1 dev enp2s0 proto dhcp src 192.168.94.253 metric 100
Die Konnektivitätsprobleme äußern wie wie folgt.
- Die VM ist nur sporadisch aus dem Internet erreichbar
- Ping ist unregelmäßig
Klassisches asymmetrisches Routing mit mehreren default Gateways.
Beispiel:
Request timeout for icmp_seq 110
Request timeout for icmp_seq 111
64 bytes from 37.228.169.79: icmp_seq=112 ttl=55 time=13.594 ms
Request timeout for icmp_seq 113
64 bytes from 37.228.169.79: icmp_seq=114 ttl=55 time=13.392 ms
Request timeout for icmp_seq 115
64 bytes from 37.228.169.79: icmp_seq=116 ttl=55 time=15.230 ms
Request timeout for icmp_seq 117
64 bytes from 37.228.169.79: icmp_seq=118 ttl=55 time=12.410 ms
Request timeout for icmp_seq 119
Request timeout for icmp_seq 120
Request timeout for icmp_seq 121
Request timeout for icmp_seq 122
Es wird nicht empfohlen diese Konstellation von mehreren IP Adressen aus dem gleichen Netzwerk mit mehreren default Gateways zu betreiben.
Wenn in einer VM mehrere Interfaces im selben Netzwerk verwendet werden müssen und mehrere Default Routes vorhanden sind, kann das Routing über eigene Routing-Tabellen und ip rule-Einträge pro Quell-IP getrennt werden. Dadurch wird sichergestellt, dass Antworten immer über das Interface zurückgesendet werden, zu dem die jeweilige IP-Adresse gehört. Wir raten hiervon allerdings ab.
sudo ip rule add from 192.168.94.190/32 table 100
sudo ip rule add from 192.168.94.253/32 table 200
sudo ip route add 192.168.94.0/24 dev enp7s0 src 192.168.94.190 scope link table 100
sudo ip route add default via 192.168.94.1 dev enp7s0 table 100
sudo ip route add 192.168.94.0/24 dev enp2s0 src 192.168.94.253 scope link table 200
sudo ip route add default via 192.168.94.1 dev enp2s0 table 200
Grundprinzip
Sobald mehrere Interfaces im gleichen Netzwerk aktiv sind, sollte nur eines davon die Standardroute erhalten. Alle weiteren Interfaces dürfen zwar eine IP-Adresse haben, aber kein eigenes Gateway setzen.
Andernfalls kann es passieren, dass Antworten über das falsche Interface gesendet werden. Das führt je nach Anwendung zu unzuverlässiger Erreichbarkeit oder zu Verbindungsabbrüchen.
Zwei Arten wie man diese Probleme lösen könnte wenn mehrere Interface an einer VM im gleichen Netzwerk gewünscht sind.
1) DHCP auf allen Interfaces, Gateway nur auf dem primären Interface
Wenn auf allen Interfaces weiterhin DHCP verwendet werden soll, muss auf den zusätzlichen Interfaces die Übernahme der Routen aus DHCP unterdrückt werden. Das Interface bekommt dann weiterhin seine IP-Adresse per DHCP, setzt aber keine eigene Default Route.
die Interface Namen können sich Unterscheiden, in diesem Beispiel wurde
eth0undeth1verwendet. Mögliche Namen wären u. a.ensXen0XenpXetc. weitere Infos zu Predictable Network Interface Names
Beispiel anhand von Ubuntu Server:
hier wird in der Netplan config /etc/netplan/50-cloud-init.yaml für das eth1 Interface die default route nicht angefordert aber eine IP Adresse per DHCP akzeptiert.
network:
version: 2
ethernets:
eth0:
dhcp4: true
eth1:
dhcp4: true
dhcp4-overrides:
use-routes: falseanschließend muss netplan apply angewendet werden um die angepasste Konfiguration umzusetzen
sudo netplan try
sudo netplan apply
Beispiel anhand von Debian:
bei älteren Debian Versionen wird
/etc/network/interfacesverwendet. Bei Debian 13 (cloud Image) kann auch per Netplan der Ubuntu Anleitung gefolgt werden. Zur Vollständigkeit die Anleitung mit/etc/network/interfaces
hier wird die /etc/network/interfaces editiert und die route für das interface wieder entfernt.
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp
post-up ip route del default dev eth1 || true
anschließend muss networking neugestartet werden um die angepasste Konfiguration anzuwenden.
sudo systemctl restart networking
2) eth0 als primäres Interface, weitere Interfaces nur mit statischer IP
Um die Probleme mit mehreren default Gateway zu umgehen, sollten die weiteren Interface mit einer statischen IP Adresse versehen werden.
Die IP Adresse muss der Port-IP aus Horizon entsprechen, sonst wird der Traffic durch die Port-Security blockiert.
Beispiel anhand von Ubuntu Server:
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.94.10/24
routes:
- to: default
via: 192.168.94.1
eth1:
dhcp4: false
addresses:
- 192.168.94.20/24
anschließend wieder ein sudo netplan apply
Beispiel anhand von Debian:
auto eth0
iface eth0 inet static
address 192.168.94.10
netmask 255.255.255.0
gateway 192.168.94.1
auto eth1
iface eth1 inet static
address 192.168.94.20
netmask 255.255.255.0
anschließend wieder ein sudo systemctl restart networking
Updated 1 day ago
