Ich habe ein Problem mit Iptables. Ich versuche einen Load Balancer zwischen 2 Uplinks einzurichten. Ich kann Pakete und Verbindungen markieren und mithilfe der IP-Regel die Routing-Tabelle auswählen (also das Gateway ändern). Wenn ich jedoch die Markierung setze, um die Pakete über ein anderes gw als das Standard-gw des Routers weiterzuleiten, wird das Antwortpaket nicht ordnungsgemäß weitergeleitet.
Beispiel beim Pingen 8.8.8.8:
17:41:48.061404 IP x.x.x.x > google-public-dns-a.google.com: ICMP echo request, id 2622, seq 1, length 64
17:41:48.079664 IP google-public-dns-a.google.com > x.x.x.x: ICMP echo reply, id 2622, seq 1, length 64
Ich habe dies mit tcpdump auf dem Router. Das zweite Paket geht beim Router ein, aber der Router wird nie korrekt an den Client gesendet, der es anfordert. Dies passiert mit jedem Paket.
Aufbau:
- kopierte die Haupttabelle nach wan_one und wan_two OHNE default gw.
- Haupttabelle hat einen Standard-GW-Router über GW 1
- wendete unterschiedliche Defgws auf wan_x-Tabellen an (GW 1 und GW 2).
# Match the packets ip rule add fwmark 1 lookup wan_one prio 1024 ip rule add fwmark 2 lookup wan_two prio 1025
# Packets from router 1 or 2 gets routed through correct table ip rule add from [ROUTER IP FOR GW 1] table wan_one prio 1026 ip rule add from [ROUTER IP FOR GW 2] table wan_two prio 1027
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark iptables -t mangle -A PREROUTING --match mark --mark 1 -j ACCEPT iptables -t mangle -A PREROUTING --match mark --mark 2 -j ACCEPT iptables -t mangle -A PREROUTING -i eth0 -m state --state NEW -m mark --mark 0 -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -i eth1 -m state --state NEW -m mark --mark 0 -j MARK --set-mark 2 iptables -t mangle -A PREROUTING -m state --state NEW -m mark --mark 0 -i eth2 -j MARK --set-mark 2 iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
Nehmen wir an, Link 1 ist auf eth0, Link 2 ist auf eth1 und LAN ist auf eth2.
Wie kann ich es zum Laufen bringen?