2

У меня проблема с iptables. Я пытаюсь настроить балансировщик нагрузки между двумя ссылками. Я могу пометить пакеты и соединения, использовать ip rule для выбора таблицы маршрутизации (поэтому меняем шлюз). Но когда я установил метку для маршрутизации пакетов через gw, отличный от gw маршрутизатора по умолчанию, ответный пакет не маршрутизируется должным образом.

Пример при пинге 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

Я получил это с помощью tcpdump на маршрутизаторе. Вторые пакеты поступают на маршрутизатор, но никогда не доставляют маршрутизатор правильно запрашивающему клиенту. Это происходит с каждым пакетом.

Конфигурация:

  • скопировал основную таблицу в wan_one и wan_two БЕЗ стандартного gw.
  • Основная таблица имеет маршрутизатор GW по умолчанию через GW 1
  • применил разные def gws к таблицам wan_x (GW 1 и 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
    

Предположим, что ссылка 1 на eth0, ссылка 2 на eth1, а LAN на eth2.

Как я могу заставить его работать?

0