负载平衡:响应数据包未路由 - iptables

负载平衡:响应数据包未路由 - iptables

我在使用 iptables 时遇到问题。我尝试在 2 个上行链路之间设置负载均衡器。我可以标记数据包和连接,使用 ip 规则选择路由表(从而更改网关)。但是,当我设置标记以便通过与路由器默认网关不同的网关路由数据包时,响应数据包无法正确路由。

ping 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 1 的默认 gw 路由器
  • 将不同的 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 上。

我怎样才能让它工作?

相关内容