Mehrere öffentliche IP Adressen auf einem gateway

Hat man mehrere öffentliche IP Adressen (Public IPs) und möchte man diese auf demselben Linux-System verwalten, geht dies normalerweise nicht, weil das System ja nicht wüsste an welches default gateway die Anfragen an die andere IP Adresse geschickt werden müssten.
Man muss dazu jedoch nur für jede IP eine eigene Routing-Tabelle anlegen, dann geht das Problemlos!

Inhalt

Konfiguration

Zuerst wird für jede öffentliche IP Adresse auf dem System eine Tabelle in /etc/iproute2/rt_tables angelegt:

echo 100 ip1 >> /etc/iproute2/rt_tables
echo 101 ip2 >> /etc/iproute2/rt_tables

Die Nummer (100/101) und der Text (ip1/ip2) sind dabei frei wählbar.
Die Nummern geben jedoch die Priorität der Tabellen an, d.h. wenn nichts zutrifft wird die Tabelle mit der kleineren Nummer zuerst verwendet.

Danach wird für jede der Tabellen die route definiert:

ip route add $NETMASK1 dev $IF1 src $IP1 table ip1
ip route add $NETMASK2 dev $IF2 src $IP2 table ip2

$NETMASK1/$NETMASK2 sind die Netzwerk-Adressen der IPs (wenn beide vom selben Provider kommen sind diese möglicherweise identisch).
$IF1/$IF2 sind die Netzwerk-Interfaces (Normalerweise z.B. eth0/eth1).
$IP1/$IP2 sind die IP Adressen.
ip1/ip2 sind die anfänglich definierten Tabellen.

Und das selbe noch für die default Gateways:

ip route add default via $GATEWAY1 dev $IF1 table ip1
ip route add default via $GATEWAY2 dev $IF2 table ip2

$GATEWAY1/$GATEWAY2 sind hier die Gateways der jeweiligen IP-Adressen (wenn beide vom selben Provider kommen sind diese möglicherweise identisch).

Als letztes wird noch eine IP-Regel festgelegt die besagt, bei welcher IP welche Tabelle zu benutzen ist:

ip rule add from $IP1 table ip1
ip rule add to $IP1 table ip1
ip rule add from $IP2 table ip2
ip rule add to $IP2 table ip2

Hinweis: Die „to“ Zeilen bräuchte es nicht unbedingt, da der Netzverkehr i.d.R nur über das Interface rein kommt.

Speichern der Einstellungen

Die obigen Einstellungen sind damit noch nicht gespeichert und würden beim nächsten Neustart verloren gehen.
Zum speichern trägt man diese bei RedHat/CentOS beispielsweise wie folgt ein:

/etc/sysconfig/network-scripts/route-$IF1

$NETMASK1 dev $IF1 src $IP1    table ip1
default via $GATEWAY1 dev $IF1 table ip1

/etc/sysconfig/network-scripts/route-$IF2

$NETMASK2 dev $IF2 src $IP2    table ip2
default via $GATEWAY2 dev $IF2 table ip2

/etc/sysconfig/network-scripts/rule-$IF1

from $IP1 table ip1
to   $IP1 table ip1

/etc/sysconfig/network-scripts/rule-$IF2

from $IP2 table ip2
to   $IP2 table ip2

Port-Forwarding

Will man jetzt auf einer zusätzlichen IP Adresse noch ein port forwarding einrichten, geht das evtl. nicht.
Dies, weil bei manchen Linux Distribution standardmässig eine strikte Form des Reverse Path Filtering aktiviert ist. Diese Einstellung bewirkt, dass Pakete verworfen werden, wenn sie nicht durchs „default“ Interface (d.h. die primäre IP Adresse) gehen würden.

Um das Problem zu lösen setzt man einfach den Kernelparameter rp_filter für das entsprechende Interface auf den Wert 2:

echo 2 > /proc/sys/net/ipv4/conf/$IF2/rp_filter

Speichern kann man diese Einstellung, wenn man sie in /etc/sysctl.conf einträgt:

net.ipv4.conf.$IF2.rp_filter = 2

Danach kann man normal ein Port-Forwarding einrichten:

-A PREROUTING  -i $IF2  -p tcp -m multiport --dports 80 -j DNAT --to-destination $GATEWAY_IP
-A POSTROUTING -o $IF2  -p tcp -m multiport --dports 80 -j SNAT --to-source      $EXT_SERVER_IP
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

$IF2 hier wieder mit dem Netzwerk-Interface ersetzen (z.B. eth1).

Quellen

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert