HOWTO: Multihoming
a.k.a von Welt unter mehreren IPs erreichbar sein
Problemstellung
- mehrere IPs an einem Rechner sind normalerweise kein Problem, einfache zusätzliche Adresse konfigurieren, fertig
- jedoch verwenden moderne Betriebssysteme meist nur eine einzige Routingtabelle zum routen
- Antworten zu Anfragen von IPs außerhalb der konfigurierten Subnetze gehen standardmäßig über die eingestellte Defaultroute
- davon kann es mehrere geben, aber nur die mit der kleinsten Metrik matcht
- soll ein Rechner unter 2 IPs von Welt erreichbar sein, muss der Rechner auch von der IP aus antworten, an die die Anfrage ging und nicht einfach von der IP des Interfaces, über die die Defaultroute geht
- die Clients bekommen dann Antwort von einer anderen IP, als die angefragte und können diese Antworten nicht mehr zuordnen und sie werden verworfen
Policy-Based Routing
Die Lösung für das oben beschriebene Problem heißt Policy-Based Routing.
- mehrere Routingtabellen
- Auswahl der Tabelle anhand einer Rule
- in diesem Fall abhängig von der Zieladresse der eingehenden Anfrage
- damit ist sichergestellt, dass die Antworten über die passende Defaultroute rausgehen
neue Routingtabellen
- Tabellennamen eintragen
/etc/iproute2/rt_tables
# # reserved values # 255 local 254 main 253 default 1 tbl_eth0 2 tbl_eth1
- Tabelle tbl_eth0 füllen
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.1 table tbl_eth0 ip route add default via 192.168.1.254 dev eth0 src 192.168.1.1 table tbl_eth0
- Tabelle tbl_eth1 füllen
ip route add 192.168.2.0/24 dev eth1 src 192.168.2.1 table tbl_eth1 ip route add default via 192.168.2.254 dev eth1 src 192.168.2.1 table tbl_eth1
Policies konfigurieren mittels ip rule
ip rule add from 192.168.1.1 table tbl_eth0 ip rule add from 192.168.2.1 table tbl_eth1
ARP-Antwort-Einstellungen
Wenn die IPs auf verschiedenen Interfaces anliegen oder sonst irgendwie die IP-MAC-Bindung wichtig ist (2 IPs im selben Subnetz), sollte man einstellen, dass der Rechner nur die vorgesehene MAC des Interfaces mit der IP verwendet, damit nicht jede IP an jedem Interface verfügbar ist.
/etc/sysctl.d/local-multihome.conf
net.ipv4.conf.eth0.arp_announce=2 net.ipv4.conf.eth0.arp_ignore=1 net.ipv4.conf.eth1.arp_announce=2 net.ipv4.conf.eth1.arp_ignore=1
Konfiguration unter verschiedenen Distributionen/Betriebssystemen
Gentoo
/etc/conf.d/net
config_eth0="192.168.1.1/24" routes_eth0="192.168.1.0/24 table tbl_eth0 src 192.168.1.1 default via 192.168.1.254 table tbl_eth0 src 192.168.1.1 default via 192.168.1.254" rules_eth0="from 192.168.1.1 table tbl_eth0" config_eth1="192.168.2.1/24" routes_eth1="192.168.2.0/24 table tbl_eth1 src 192.168.2.1 default via 192.168.2.254 table tbl_eth1 src 192.168.2.1" rules_eth1="from 192.168.2.1 table tbl_eth1"
Debian
/etc/network/interfaces
iface eth0 inet static address 192.168.1.1 netmask 255.255.255.0 gateway 192.168.1.254 up ip route add 192.168.1.0/24 dev "$IFACE" src 192.168.1.1 table "tbl_$IFACE" up ip route add default via 192.168.1.254 dev "$IFACE" table "tbl_$IFACE" up ip rule add from 192.168.1.254 table "tbl_$IFACE" iface eth1 inet static address 192.168.2.1 netmask 255.255.255.0 up ip route add 192.168.2.0/24 dev "$IFACE" src 192.168.2.1 table "tbl_$IFACE" up ip route add default via 192.168.2.254 dev "$IFACE" table "tbl_$IFACE" up ip rule add from 192.168.2.254 table "tbl_$IFACE"
Hinweis: Unter Debian wheezy (Kernel 3.2.0) wird dafür auch folgende Einstellung benötigt: Verifizieren!
sysctl
net.ipv4.ip_forward=1
Sicherheitshalber sollte dies mit folgender Firewall-Regel kombiniert werden:
iptables
iptables -A FORWARD -j REJECT