Multi homed Ubuntu

März 31, 2016

Ich stehe gerade vor der Aufgabe einem Ubuntu 14.04 bei zu bringen, dass wenn zwei Netzerkkarten in unterschiedlichen Netzwerken verwendet werden immer Sauber in das Richtige Netzwerk geantwortet wird.

Ausgangssituation:

Zwei Netzwerke: 10.6.0.0/21 (Staff) und 10.6.8.0/21 (Public). Der Router (Lancom) erlaubt den Zugriff Staff => Public aber nicht Public => Staff. Dies funktioniert sauber bei allen Rechnern die in nur einem Netzwerk zu finden sind. Der Webserver (Ubuntu 14.04) befindet sich in beiden Netzwerken (10.6.0.6 an eth0 und 10.6.8.6 an eth1). Apache ist so konfiguriert, dass manche vHosts nur für Staff also über die 10.6.0.6 erreichbar sind, andere auf die 10.6.8.6 lauschen aber eben auch aus Staff erreichbar sein sollen. So sieht /etc/network/interfaces des Webservers aus:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
   address 10.6.0.6
   netmask 255.255.248.0
   network 10.6.0.0
   gateway 10.6.0.1
   dns-nameservers 10.6.0.5 10.6.0.1

auto eth1
iface eth1 inet static
   address 10.6.8.6
   netmask 255.255.248.0
   broadcast 255.255.255.255
   network 10.6.8.0

Das Problem:

Schon ein bash ping -c2 10.6.8.6 liefert keine Antwort weil diese über das Default Gateway (10.6.0.1) geschickt wird und dann im leeren versandet. Eine Anfrage via http an einen vHost im Public Netzwerk endet in einem timeout.

Die Lösung:

Ubuntu muss ein zweites Gateway beigebracht werden welches alle anfragen aus 10.6.8.0/21 a n 10.6.8.1 beantwortet. Um zusätzliche routingtabellen anlegen zu können nutzen wir iproute2, welches, nicht nur unter Ubuntu, standardmäßig installiert sein sollte.

Zuerst muss eine neue Tabelle registriert werden. Dazu wird /etc/iproute2/rt_tables editiert und eine Zeile 1 routeseth1 angefügt.

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

Jetzt müssen wir noch das routing selbst erstellen. Damit dieses auch nach einem neustart wieder greift legen wir es direkt in /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth1
iface eth0 inet static
    address 10.6.0.6
    netmask 255.255.248.0
    network 10.6.0.0
    gateway 10.6.0.1
    dns-nameservers 10.6.0.5 10.6.0.1

auto eth1
iface eth1 inet static
    address 10.6.8.6
    netmask 255.255.248.0
    broadcast 255.255.255.255
    network 10.6.8.0
    post-up ip route add 10.6.8.0/21 dev eth1 src 10.6.8.6 table routeseth1
    post-up ip route add default via 10.6.8.1 dev eth1 table routeseth1
    post-up ip rule add from 10.6.8.6/32 table routeseth1
    post-up ip rule add to 10.6.8.6/32 table routeseth1

Nach einem reboot oder

sudo ifdown eth0 && sudo ifup eth0
sudo ifdown eth1 && sudo ifup eth1

funktioniert der sowohl der ping aus dem Staff Netzwerk an die 10.6.8.6 als auch der Aufruf von Webserver-vHosts nach Public.