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
- stackexchange.com: Two interfaces, two addresses, two gateways?
- tldp.org: Routing for multiple uplinks/providers
- Linux Advanced Routing Mini HOWTO
- Zwei Default Gateways in einem System
- Why does RHEL invalidate / discard packets when the route for outbound traffic differs from the route of incoming traffic?