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?

Francesco Zanini
quelle