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 nutzt man ab RedHat 8+ das nmcli Kommando:
nmcli connection modify $IF1 ipv4.routes "$NETMASK1 src=$IP1 table=100" ipv4.routing-rules "priority 1 from $IP1 table 100"
nmcli connection modify $IF2 ipv4.routes "$NETMASK2 src=$IP2 table=101" ipv4.routing-rules "priority 2 from $IP2 table 101"
Oder bei RedHat/CentOS 7 trägt man die Daten 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?
- redhat.com: Configuring Policy-based Routing to Define Alternative Routes
- redhat.com: How to use the nmcli command to configure a static route
- forums.rockylinux.org: Nmcli: adding routes with a source IP address