Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165143
  • 博文数量: 21
  • 博客积分: 517
  • 博客等级: 下士
  • 技术积分: 358
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-23 23:42
文章分类

全部博文(21)

文章存档

2015年(2)

2012年(19)

我的朋友

分类: LINUX

2012-05-17 21:43:39

    利用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转换!
阅读(13184) | 评论(3) | 转发(5) |
给主人留下些什么吧!~~

qiuske2015-08-03 22:59:45

鞋带儿在江湖:我用你的设置在openwrt系统下设置完后也无法上网,能不能指点下是哪一部分有问题?感觉这套理论体系没什么问题啊。。

你尝试一下设置arp_announce和arp_ignore,通过以下命令设置:
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce

回复 | 举报

鞋带儿在江湖2015-07-18 11:59:16

我用你的设置在openwrt系统下设置完后也无法上网,能不能指点下是哪一部分有问题?感觉这套理论体系没什么问题啊。。

AirBorne_Dong2015-01-27 15:05:30

mark