利用linux的策略路由加连接跟踪可以做到双出口上网的负载均衡,这种负载均衡是基于连接的,比基于源地址或目的地址的效果更好,传统基于源地址的负载 均衡是指定一部分内网用户走A出口、另一部分内网用户走B出口,传统的基于目的地址的负载均衡是将流量按目的地址进行分流,也就是说访问S1服务器的总走A出口,访问S2服务器的总走B出口。
基于连接的负载均衡则可以按照连接(会话)将流量分到不同的出口。其基本原理是linux的conntrack模块可以建立连接跟踪,这些连接跟踪具有状态信息,我们对于新建的连接,可以利用statistic模块的功能对连接进行区分,然后给不同的连接按照线路数打上不同的标志,再利用connmark 模块对连接的数据包做相应的标志,这个标志就是用于策略路由的,这样就可以把不同的连接分到不同的出口,采用循环分配的方式。
实际测试的服务器采用debian5.03(内核2.6.26.2),他需要包含netfilter的以下模块:nat、conntrack、 connmark、CONNMARK、mark、MARK、statistic。另外需要使用策略路由,所以需要用到iproute2工具包,内核必须开启策略路由和连接跟踪(编译时要选择)
配置如下:
eth0:外网1,接口IP:10.0.1.2/24 网关:10.0.1.1
eth1:外网2,接口IP:10.0.2.2/24 网关:10.0.2.1
eth2:内网,接口IP:192.168.3.0/24
 
加载nat:
modprobe -v ip-nat
 
设置iptables:先对新建连接轮流打上1、2的标志(基于连接的标志),然后根据连接标志给数据包打上对应的标志
iptables -t mangle -A PREROUTING -s 192.168.3.0/24 -m conntrack --ctstate NEW -m statistic --
mode nth --every 2 --packet 1 -j CONNMARK --set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.3.0/24 -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -m connmark --mark 1 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m connmark --mark 2 -j MARK --set-mark 2
 
设置nat:
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o eth1 -j MASQUERADE
 
设置两个策略路由表table10和table20:
ip route add default via 10.0.1.1 table 10(注意:这里不能使用dev eth0)
ip route add 192.168.3.0/24 dev eth2 table 10
ip route add default via 10.0.2.1 table 20(注意:这里不能使用dev eth1)
ip route add 192.168.3.0/24 dev eth2 table 20
 
设置策略路由规则:标志为1的走出口1、标志位2的走出口2
ip rule add pref 10 fwmark 1 table 10
ip rule add pref 10 fwmark 2 table 20
 
另外在ubuntu9.10server中测试有问题,通过以上配置后发现无法上网,tcpdump显示返回数据包无法进行nat转换!