dfl2323 发表于 2006-9-7 20:40:06

LINUX网通电信双线路代理主机的失败经历

这几天局里增加了一条网通的线路,为了更好的利用资源,我查看了网上的一些文章,开始做多重ISP链路复用LINUX主机,但是结果并不好,具体步骤如下。
软件系统,我用的是国产软件红旗LINUX DC SERVER 4.1,iptables系统是自带的。硬件系统是P41.8G的IBMPC,内存是现代512M,硬盘是7200转的40G。
1.我有两条固定IP线路,一条是eth0(电信),网关为202.102.14.1,一条eth1(网通),网关为60.12.5.1,最后一个eth2上绑定的是内网地址192.168.0.0/24。将etho(电信线路)作为默认网关,访问网通的数据走eth1,配置如下:
;/root/wan1.cong文件内容(配置文件)
interface=eth0
ipaddr=202.102.14.2
gateway=202.102.14.1
network=202.102.14.0/30
routefile=/etc/quick/IP_CNC.list
;/root/wan2.cong文件内容(配置文件)
interface=eth1                ;接口名称
ipaddr=60.12.5.2        ;IP地址
gateway=60.12.5.1;网关地址
network=60.12.5.0/30        ;网络地址
routefile=/etc/quick/IP_CTC.list        ;路由表
2.建立通向不同ISP的路由表
ip route add 202.102.14.0/30 dev eth1 src 202.102.14.2 table 50
ip route add default via 202.102.14.1 table 50

ip route add 60.12.5.0/30 dev eth2 src 60.12.5..2 table 51
ip route add default via 60.12.5..1 table 51
3.针对我们要访问的目标地址,选择不同的路由表,进行路由
因为有大量的网络地址需要设置不同的规则,采用命令模式不便于修改,所以做了一个简单的脚本文件,
;文件/root/cdkcm,脚本的内容
. /root/hs
RETVAL=0
start() {
if [ -f "/root/wan1.cong" ]
then
. /root/wan1.cong
tab=50
wan_cdk
fi
if [ -f "/root/wan2.cong" ]
then
. /root/wan2.cong
tab=51
wan_cdk
fi
ip route flush cache
      return $RETVAL
}

stop() {
if [ -f "/root/wan1.cong" ]
then
. /root/wan1.cong
tab=50
del_wan_cdk
fi

if [ -f "/root/wan2.cong" ]
then
. /root/wan2.cong
tab=51
del_wan_cdk
fi

ip route flush cache
        return $RETVAL
}

# See how we were called.
case "$1" in
start)
        start
        RETVAL=$?
        ;;
stop)
        stop
        RETVAL=$?
        ;;
restart)
        stop
        start
        RETVAL=$?
        ;;
*)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac

exit $RETVAL

;/root/hs文件内容(函数存放文件)
wan_cdk() {
ip route add ${network} dev ${interface} src ${ipaddr} table $tab
ip route add default via ${gateway} dev ${interface} table $tab
ip rule add from ${ipaddr} table $tab
        for cc in `/bin/cat ${routefile}`; do
ip rule add from all to $cc table $tab
        done
}

del_wan_cdk() {
ip rule del from ${ipaddr} table $tab
        for cc in `/bin/cat ${routefile}`; do
ip rule del from all to $cc table $tab
        done
ip route del ${network} dev ${interface} src ${ipaddr} table $tab
ip route del default via ${gateway} dev ${interface} table $tab
}

到此为止,LINUX主机已经可以上网了,而且如想象中的那样,可以选择线路上网,而且很流畅;接下来我应该把我的内网的192.168.0.0/24IP地址伪装起来。
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT --to 202.102.14.2         ;内网地址伪装成电信地址
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT --to 60.12.5.2                    ;内网地址伪装成网通地址
到这里问题出现了,那就是可以用内网任何机子直接PING 通电信和网通的公网地址的网关,但确实无法上网的。后来用 ROUTE 命令查看,发现没有默认网关,如果我们加上网关的话,应该加电信的呢还是加网通的,经过实验,加上任何网关都是无法选择出口的,前面的活是白做了。在这一步是需要一个重要的步骤,那就是我没有做负载均衡。这是我后来查资料得来的。 对于负载均衡,可以使用这条语句来实现:
ip route replace default nexthop via 202.102.14.1 dev eth1 weight 1 nexthop via 60.12.5.1       dev eth2 weight 1
这样 我们就改变了缺省的路由为多路路由!!!!
到此为止,内网也可以双线路出口了。

   经过一段时间的测试,我发现了LINUX主机很不稳定,那就是路由选择严重滞后,对于有一些加了访问控制列表的网站,比如说网通内部的网站,或是电信内部的网站,有时是被禁止浏览的,而且需要刷新无数次(具体次数每台机子并不一致,最长时间的5分钟内没有上去)才能上去。后来惊过阅读资料,发现是LINUX的路由缓存机制有问题,在某一时间段 连接到某一点上的线路是不变的,而必须等到失效才能重新选择,而且资料显示, julian 的补丁解决了这个问题,对于内核是2.4.21.的红旗LINUX需要打上下面的两个补丁。
http://www.ssi.bg/~ja/patch-2.4.20-ja1.diff
B.equailze 这之PATCH 解决了在系统内核中equailze参数不生效的问题
http://www.teatime.com.tw/~tommy/linux/equalize.patch
将这两个PATCH 下载到本地 比如 直接放在 /root目录下那么这样做,将PATCH补进内核:
cd /usr/src/linux-2.4.21-*****/
patch -p1 </root/patch-2.4.20-ja1.diff
cd /usr/src/linux-2.4.21-******/
patch -p1 </root/equalize.patch
按照资料上的步骤执行完以后就应该解决了路由缓存机制问题了,但是在打补丁的过程中,显示是用FAILED的。不知道是补丁没有打上,还是这个补丁就根本没有用,总之,到现在为止,LINUX选择出口不理想的毛病还是一直存在的,所以我只有改变思路,换另一种办法了解决问题了。



其中的脚本是摘自《Linux下网通、电信、教育多出口策略路由配置详解》这篇文章。


希望广大LINUX爱好者和我一起探讨内网通过LINUX主机选择出口严重滞后的问题。最近这几天一直在网上等大家的消息。

dfl2323 发表于 2006-9-7 21:02:09

我的QQ号是19438968 希望能和大家探讨这个问题。
页: [1]
查看完整版本: LINUX网通电信双线路代理主机的失败经历