Linux HAProxy透明、iproute2、iptables connmark
我正在尝试实现高可用的透明HAProxy设置 出于测试目的,我有下一个设置(简化的sceme) 不会在lb{1,2}上提供配置。它工作得很好。 在后端,有按mac地址标记连接的iptables规则:Linux HAProxy透明、iproute2、iptables connmark,linux,routing,haproxy,iptables,transparent,Linux,Routing,Haproxy,Iptables,Transparent,我正在尝试实现高可用的透明HAProxy设置 出于测试目的,我有下一个设置(简化的sceme) 不会在lb{1,2}上提供配置。它工作得很好。 在后端,有按mac地址标记连接的iptables规则: -A PREROUTING -p tcp -m tcp --dport 8080 -m mac --mac-source <lb1's mac> -j MARK --set-xmark 0x1/0xffffffff -A PREROUTING -p tcp -m tcp --dport
-A PREROUTING -p tcp -m tcp --dport 8080 -m mac --mac-source <lb1's mac> -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -p tcp -m tcp --dport 8080 -m mac --mac-source <lb2's mac> -j MARK --set-xmark 0x2/0xffffffff
-A PREROUTING -p tcp -m tcp --dport 8080 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
如果主表中有默认路由,并且它使用相同的设备(在这种情况下为eth0),则一切正常。但是,如果主表中没有默认路由,或者默认路由使用的接口(比如eth1)与自定义表中的默认接口不同,则安装程序将无法工作
我发现在主表中没有默认接口的情况下,源IP地址变成了负载平衡的地址,而不是真正的客户端IP(外部IP地址)。
比如:
在这种情况下,我必须为主表中的默认路由和自定义表中的默认路由使用不同的设备。
我假设在输出路径上的路由决定过程中有一些逻辑,但是除了我将为此原因调查的源代码之外,找不到任何关于它的文档。
也许有人知道原因和如何避免
谢谢大家!
-A PREROUTING -p tcp -m tcp --dport 8080 -m mac --mac-source <lb1's mac> -j MARK --set-xmark 0x1/0xffffffff
-A PREROUTING -p tcp -m tcp --dport 8080 -m mac --mac-source <lb2's mac> -j MARK --set-xmark 0x2/0xffffffff
-A PREROUTING -p tcp -m tcp --dport 8080 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
0: from all lookup local
100: from all fwmark 0x1 lookup lb1
100: from all fwmark 0x2 lookup lb2
32766: from all lookup main
32767: from all lookup default
~]# ip r s table lb1
default via 10.208.10.10 dev eth0
~]# ip r s table lb2
default via 10.208.10.11 dev eth0
output IN= OUT=eth0 SRC=10.208.10.100 DST=10.208.10.11 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=8080 DPT=55209 WINDOW=14480 RES=0x00 ACK SYN URGP=0 MARK=0x2