Folgendes Problem:
Man hat einen Server mit zwei Interfaces im selben LAN. eth1 nutzt 10.0.0.1/24, eth2 die 10.0.0.2/24. Hinzu kommt eth0 welches als Gateway für Clients an eth1 dient (eth2 soll dediziert für NFS/CIFS genutzt werden, eth1 für die restliche Kommunikation mit dem LAN). Nun wird man eventuell feststellen das man von einem anderen Client aus Traffic zur 10.0.0.2 schickt, dieser aber auf eth1 hereinkommt. Um dies zu fixen gibt es zwei Möglichkeiten eine einzige ultimative Möglichkeit:
Anpassungen in der /etc/network/interfaces
falls man eine feste IP-Adresse am Gateway hat:
auto lo iface lo inet loopback allow-hotplug eth0 iface eth0 inet static address 192.168.178.34 netmask 255.255.255.0 gateway 192.168.178.1 iface eth0 inet6 auto allow-hotplug eth1 iface eth1 inet static address 10.0.0.1 netmask 255.255.255.0 up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE up ip route add 10.0.0.0/24 dev eth1 src 10.0.0.1 table rt1 up ip route add default via 192.168.178.34 dev eth1 table rt1 up ip rule add from 10.0.0.1 lookup rt1 allow-hotplug eth2 iface eth2 inet static address 10.0.0.2 netmask 255.255.255.0 up ip route add 10.0.0.0/24 dev eth2 src 10.0.0.2 table rt2 up ip rule add from 10.0.0.2 lookup rt2
Und falls man dhcp am Gateway nutzt:
auto lo iface lo inet loopback allow-hotplug eth0 iface eth0 inet dhcp iface eth0 inet6 auto allow-hotplug eth1 iface eth1 inet static address 10.0.0.1 netmask 255.255.255.0 up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE up ip route add 10.0.0.0/24 dev eth1 src 10.0.0.1 table rt1 up ip route add default dev eth1 table rt1 up ip rule add from 10.0.0.1 lookup rt1 allow-hotplug eth2 iface eth2 inet static address 10.0.0.2 netmask 255.255.255.0 up ip route add 10.0.0.0/24 dev eth2 src 10.0.0.2 table rt2 up ip rule add from 10.0.0.2 lookup rt2
Unterschiede: DHCP statt statische Konfiguration für eth0, außerdem wird bei eth1 in der Standardroute keine IP-Adresse angegeben.
Die benötigten Routingtabellen erstellen in der /etc/iproute2/rt_tables
Datei:
255 local 254 main 253 default 0 unspec 1 rt1 2 rt2
Und zum Schluss die passende sysctl Config /etc/sysctl.d/90-bastelfreak.conf
:
net.ipv4.ip_forward=1 net.ipv.conf.eth1.arp_proxy=0 net.ipv.conf.eth2.arp_proxy=0 net.ipv4.conf.eth1.arp_ignore=1 net.ipv4.conf.eth2.arp_ignore=1 net.ipv4.conf.eth1.arp_filter=1 net.ipv4.conf.eth2.arp_filter=1
Warum funktioniert das ganze(Erklärung von qybl)?
Als erstes ein Link zum Packet Flow.
16:48:34 - qybl: (ignorier mal, dass es iptables/netfilter is fuer die erklaerung :D)
16:49:03 - qybl: pakete kommen auf deinem eth1 vom angeschlossenen laptop rein, gehen dann durch den ganzen linux-routing-stack
16:49:09 - qybl: am ende steht die default-route dev eth1
16:49:30 - qybl: damit landen die pakete wieder ganz links beim 'ingress'-kaestchen
16:49:36 - qybl: und es geht dann durch die main-routing-table
16:49:51 - qybl: und dann kommt eben aus der die passende default-route und man kommt ins internet
Pingback: Redundantes Gateway inkl bonding unter Linux bauen | the world needs more puppet!