Ein Kunde aus dem ISP-Bereich setzt Ubuntu 12.04 (Precise Pangolin) Server als Firewall-Router ein. Bislang reichte das vorhandene öffentliche IP-Subnetz aus, allerdings wurden die verfügbaren IP-Adressen knapp, so das ein weiteres Subnetz hinzugefügt werden musste.

Der nachfolgende Beitrag betrachtet lediglich die Anbindung des weiteren Subnetzes und das Routing, wie die Firewall gestaltet wird ist nicht Bestandteil.

In diesem Szenario verhält es sich so, das alle öffentlichen IP-Adressen auf dem Ubuntu-basierten Firewall-Router konfiguriert werden. Die Firewall regelt dann, welche Dienste zum Internet hin zur Verfügung stehen.

Die öffentlichen IP-Adressen sind als virtuelle Netzwerkkarten auf dem Firewall-Router konfiguriert. Selbstverständlich und sofern vorhanden können die IP-Adressen auf realen Netzwerkkarten zugewiesen werden. Die Handhabung ist in diesem Fall identisch.

Plan A – Route zum weiteren Gateway anlegen

Der Versuch ein weiteres Gateway anzulegen wird unter Ubuntu mit einer Fehlermeldung beim Starten des Interfaces (“ifup ethX”) oder beim (Neu-)Starten des Netzwerks (“/etc/init.d/networking restart”) quittiert:

RTNETLINK answers: File exists
Failed to bring up eth0:1

Hintergrund ist, das bereits eine Standardroute vorhanden ist und folglich keine Zweite hinzugefügt werden kann. Das Interface wird zudem nicht unbedingt vollständig gestartet.

Daraus ergibt sich, das man kein weiteres Gateway anlegen kann. Stattdessen legt das erste Interface, das mit einer IP-Adresse aus dem anderem Subnetz konfiguriert ist, eine Route zum Gateway dieses Subnetzes fest:

(Auszug aus "/etc/network/interfaces", IP-Adressen geändert)

auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 100.100.100.2
        netmask 255.255.255.224
        network 100.100.100.0
        broadcast 100.100.100.31
        gateway 100.100.100.1

auto eth0:1
iface eth0:1 inet static
        address 200.200.200.2
        netmask 255.255.255.192
        network 200.200.200.128
        broadcast 200.200.200.63
	post-up /sbin/route add -net 200.200.200.0 netmask 255.255.255.192 gw 200.200.200.1

Nach dem Starten des Interfaces (oder einem Neustart des Netzwerks) kann man die Routen mit “route -n” prüfen:

Ziel            Router          Genmask         Flags Metric Ref    Use Iface
0.0.0.0         100.100.100.1   0.0.0.0         UG    0      0        0 eth0
300.300.300.0   0.0.0.0         255.255.0.0     U     0      0        0 eth1
200.200.200.0   200.200.200.1   255.255.255.192 UG    0      0        0 eth0
200.200.200.0   0.0.0.0         255.255.255.192 U     0      0        0 eth0
100.100.100.0   0.0.0.0         255.255.255.224 U     0      0        0 eth0

Auf “eth1” ist ein anderes Subnetz konfiguriert, was an dieser Stelle nicht weiter interessant ist. Per Vorgabe wird eine Standardroute zum ersten Gateway vom System angelegt (Zeile 5 der route-Ausgabe), diese wird allerdings aufgrund der explizit gesetzten Route zum anderen Gateway nicht verwendet.

Plan B – Mehrere Routing-Tabellen

Alternativ kann man statt klassischem Routing weitere Routing-Tabellen anlegen. Auf diese Weise lässt sich eine grössere Trennung vornehmen. Zu diesem Zweck muss das Paket “iproute2” installiert sein. Bei Ubuntu “versteckt” sich “iproute2” im Paket “iproute” das per Standard installiert sein sollte.

Man legt zuerst eine weitere Routing-Tabelle an:

Die Datei “/etc/iproute2/rt_tables” editieren und am Ende der Datei eine fortlaufende Nummer und einen Namen für die weitere Routing-Tabelle hinzufügen:

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

In diesem Beispiel (Übernommen aus dem Thomas Krenn-Wiki, siehe Quellen) wurde “1 rt2” hinzugefügt. Im nächsten Schritt muss dementsprechend die Datei “/etc/network/interfaces” angepasst werden:

(Auszug aus "/etc/network/interfaces", IP-Adressen geändert)

auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 100.100.100.2
        netmask 255.255.255.224
        network 100.100.100.0
        broadcast 100.100.100.31
        gateway 100.100.100.1

auto eth0:1
iface eth0:1 inet static
        address 200.200.200.2
        netmask 255.255.255.192
        network 200.200.200.128
        broadcast 200.200.200.63
	post-up ip route add 200.200.200.0/26 dev eth0:1 src 200.200.200.2 table rt2
	post-up ip route add default via 200.200.200.1 dev eth0:1 table rt2
	post-up ip rule add from 200.200.200.2/32 table rt2
	post-up ip rule add to 200.200.200.2/32 table rt2

Troubleshooting

Hatte man dennoch mal ein weiteres Gateway konfiguriert, so bleiben, auch wenn es nicht ersichtlich ist, Reste zurück. Am einfachsten bringt man das System durch einen “reboot” wieder in einen sauberen Zustand.

Persönliche Bemerkung

Laut Recherche soll es ebenfalls mit zwei oder mehreren Gateways und unterschiedlichen Metriken funktionieren. Im Test hatten wir damit allerdings keinen Erfolg.

Quellen

Thomas Krenn – Wiki – Zwei Default Gateways in einem System