免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 14349 | 回复: 40
打印 上一主题 下一主题

[网络管理] 【原创】双adsl链路冗余互备及流量分担的实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-08 18:23 |只看该作者 |倒序浏览
经过一周的摸索,实现了双adsl链路冗余互备及流量分担,整理如下:
目的:实现双adsl的冗余热备和流量分担
功能:
    双adsl同时连线;
    当两条adsl同时连线时,流量经策略路由分流到两条链路上;
    当其中一条adsl掉线时,所有流量自动分配另一条可用连接;
    可以扩展到多条ppp连接.


1.添加网卡
  插入网卡,启动机器,修改/etc/modules.conf并加入
  alias eth2 driver.o

2.配置adsl拨号
  通过adsl-setup程序创建ppp0和ppp1的拨号配置文件,并保存配置。
  修改/etc/sysconfig/network-scripts/ifcfg-ppp*文件,将其中的PIDFILE参数设为:
  PIDFILE=/var/run/ppp-adsl*.pid
   其中*对应0、1等
  如果不修改此参数将无法启动第二个ppp接口。

3.启动ppp接口
  因为adsl-start 命令缺省只能启动第一的ppp接口。所以要启动两个接口,必须指定配置文件。
  adsl-start /etc/sysconfig/network-scripts/ifcfg-ppp0
   adsl-start /etc/sysconfig/network-scripts/ifcfg-ppp1

4.添加路由表
  缺省情况下,系统只有3个路由表,local、main、default,路由规则为所有进入的数据报都参照main、defaul来决策路由,这可以通过ip rule ls来查看。其输出如下:
  1. [root@linuxrouter root]# ip rule ls
  2. 0:      from all lookup local
  3. 32766:  from all lookup main
  4. 32767:  from all lookup 253
  5. [root@linuxrouter root]#
复制代码

   要实现策略路由,添加额外的路由表是必须的。
  下面两条命令分别添加名为ppp0和ppp1的路由表。

echo 201 ppp0 >;>; /etc/iproutes/rt_tables
echo 202 ppp1 >;>; /etc/iproutes/rt_tables

5.创建路由表项
  上面创建的两个路由表都是空表,需要在其中注入路由表项。
  本人编写了如下脚本用于注入路由表项:

  1. #!/bin/bash
  2. # Name: cprt
  3. # This program copy the route from $1 route table to $2 route table,
  4. # exclude the default route entry.

  5. if [ -z "$1" -o -z "$2" ]; then
  6.     echo $"usage: cprt <source_table>; <dest_table>;"
  7.     exit 1
  8. fi

  9. SOURCE=$1
  10. DEST=$2

  11. # Clear the destination route table
  12. echo $"Clearing route table $DEST ......"
  13. echo
  14. /sbin/ip route flush table $DEST

  15. # Inject routes from source to destination
  16. echo $"Injecting route from $SOURCE to $DEST ......"
  17. /sbin/ip route ls table $SOURCE | grep -v default >; /tmp/route-tmp
  18. while read line; do
  19.       /sbin/ip route add table $DEST $line
  20. done < "/tmp/route-tmp"
复制代码


   把main表中的路由表项复制到ppp0和ppp1中。
  将下面命令加入到/etc/rc.d/rc.local中。
  cprt main ppp0
   cprt main ppp1

  此时,两个路由表中都有相同的路由表项了,除了default路由以外。缺省路由的添加要通过另外的途径添加。当ppp激活,或者掉线时,pppd守护进程会调用/etc/ppp/目录下的ip-up、ip-down脚本,这些教本又分别调用ip-up.local、ip-down.local。在此我们利用这两个脚本来对路由表和流量控制策略进行维护,此脚本需要人工创建。

下面时本例中的脚本:
/etc/ppp/ip-up.local
  1. #!/bin/bash
  2. # Name: ip-up.local
  3. # Created by lyking@CU
  4. # If the if-down is not completed, this script can't be excute.
  5. while [ -e /var/lock/subsys/if-down.$IFNAME ] ; do
  6.         sleep 3
  7. done

  8. # Creat a lock file to prevent the if-down from running on my turn
  9. touch /var/lock/subsys/if-up.$IFNAME

  10. # Determin device here
  11. # We should use IFNAME as the interface name.For some reason, the IFNAME maybe not
  12. # same as the LINKNAME. And the route table should associate with the IFNAME. For
  13. # some conveniency, I name the route table as "ppp0" and "ppp1".
  14. RT_TABLE=$IFNAME

  15. # Add or change static route here,including default route.
  16. # Check if a default is exist.
  17. RS=""
  18. ip route ls table $RT_TABLE | grep default
  19. RS=$?

  20. if [ $RS -eq 0 ] ; then
  21.         ip route change default dev $IFNAME table $RT_TABLE
  22. else
  23.         ip route add default dev $IFNAME table $RT_TABLE
  24. fi
  25. echo >;>; /var/log/ifchang.log
  26. echo "$0: $IFNAME going up at `date`." >;>; /var/log/ifchang.log
  27. echo "$0: $IFNAME got address: $IPLOCAL, peer address is $IPREMOTE." >;>; /var/log/ifchang.log
  28. echo "$0: Table $RT_TABLE default route change to `ip route ls table $RT_TABLE | grep default`." >;>; /var/log/ifchang.log

  29. # Refresh routing cache to activating the routing immediately.
  30. ip route flush cache

  31. # Add traffic control policy here
  32. tc qdisc add dev $IFNAME root handle 1: prio
  33. ## This *instantly* creates classes 1:1, 1:2, 1:3

  34. tc qdisc add dev $IFNAME parent 1:1 handle 10 sfq perturb 20
  35. tc qdisc add dev $IFNAME parent 1:2 handle 20 sfq perturb 20
  36. tc qdisc add dev $IFNAME parent 1:3 handle 30 sfq

  37. # Remove the lock file
  38. rm -f /var/lock/subsys/if-up.$IFNAME
复制代码



/etc/ppp/ip-down.local
  1. #!/bin/bash
  2. # Name: ip-down.local
  3. # Created by lyking@CU
  4. while [ -e /var/lock/subsys/if-up.$IFNAME ] ; do
  5.         sleep 3
  6. done

  7. touch /var/lock/subsys/if-down.$IFNAME


  8. cd /etc/sysconfig/network-scripts
  9. . network-functions

  10. # Determin device here
  11. # We should use IFNAME as the interface name.For some reason, the IFNAME maybe not
  12. # same as the LINKNAME. And the route table should associate with the IFNAME. For
  13. # some conveniency, I name the route table as "ppp0" and "ppp1".
  14. RT_TABLE=$IFNAME

  15. # Looking for a valide connection to Internet
  16. DEFAULT_RT=""
  17. PPPS='ppp0 ppp1'
  18. for i in $PPPS ; do
  19. ifconfig | grep $i
  20. RS=$?
  21.         if [ $RS -eq 0 ] ; then
  22.             DEFAULT_RT=$i
  23.             break
  24.         fi
  25. done

  26. # Update default route here as nesessary
  27. if [ $DEFAULT_RT != $IFNAME ] ; then
  28.         if [ $DEFAULT_RT != "" ] ; then
  29.                 ip route add default dev $DEFAULT_RT table $RT_TABLE
  30.         else
  31.                 for i in $PPPS ; do
  32.                         ip route del default dev $i table $i
  33.                 done
  34.                 echo >;>; /var/log/ifchang.log
  35.                 echo "$0: All connection is down, remove all default route from all branch tables" >;>; /var/log/ifchang.log
  36.         fi
  37.         echo >;>; /var/log/ifchang.log
  38.         echo "$0: $IFNAME going down at `date`." >;>; /var/log/ifchang.log
  39.         echo "$0: Connection lasted $CONNECT_TIME seconds." >;>; /var/log/ifchang.log
  40.         echo "$0: $BYTES_SENT bytes sent, $BYTES_RCVD bytes received." >;>; /var/log/ifchang.log
  41.         echo "$0: $DEFAULT_RT is available." >;>; /var/log/ifchang.log
  42.         echo "$0: Table $RT_TABLE default route changed to `ip route ls table $RT_TABLE | grep default`. " >;>; /var/log/ifchang.log
  43. fi

  44. # Refresh routing cache to activating the routing immediately.
  45. ip route flush cache

  46. rm -f /var/lock/subsys/if-down.$IFNAME
复制代码


注意,创建完脚本后必须将其属性改为可执行,否则不会被执行。


6.路由策略的选择
  策略路由可以通过源地址、目标地址、ToS或者fwmark标记来进行选择。在此,为了利用iptables的强大的过滤功能采用fwmark标记来决策路由。
  在/etc/rc.d/rc.local中添加如下命令:
  /sbin/ip rule add fwmark 1 table ppp0
   /sbin/ip rule add fwmark 2 table ppp1

7.防火墙规则的添加
  这里利用的iptables的强大过滤功能来对流量进行标记。本例中仅根据ip地址的奇偶性来拆分流量,根据具体需求,你还可以根据第4层端口号、ToS等来拆分流量。防火墙需要添加如下命令:

  1. # Divid traffic to different mark
  2. iptables -t mangle -A PREROUTING -s 10.0.0.0/255.255.255.1 -j MARK --set-mark 0x1
  3. iptables -t mangle -A PREROUTING -s 10.0.0.1/255.255.255.1 -j MARK --set-mark 0x2

  4. # NAT
  5. /sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
  6. /sbin/iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
复制代码

至此,双adsl链路的热互备及负载分担基本完成。

下面是一些运行结果
A.ifconfig显示结果
  1. ppp0      Link encap:Point-to-Point Protocol
  2.           inet addr:220.163.38.208  P-t-P:220.163.38.1  Mask:255.255.255.255
  3.           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
  4.           RX packets:100295 errors:0 dropped:0 overruns:0 frame:0
  5.           TX packets:67817 errors:0 dropped:0 overruns:0 carrier:0
  6.           collisions:0 txqueuelen:3
  7.           RX bytes:108844271 (103.8 Mb)  TX bytes:6073206 (5.7 Mb)

  8. ppp1      Link encap:Point-to-Point Protocol
  9.           inet addr:220.163.36.57  P-t-P:220.163.36.1  Mask:255.255.255.255
  10.           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
  11.           RX packets:150583 errors:0 dropped:0 overruns:0 frame:0
  12.           TX packets:125136 errors:0 dropped:0 overruns:0 carrier:0
  13.           collisions:0 txqueuelen:3
  14.           RX bytes:132921157 (126.7 Mb)  TX bytes:8749585 (8.3 Mb)
复制代码

B./var/log/ifchang.log部分内容
/etc/ppp/ip-down.local: ppp0 going down at Tue Aug 10 08:05:45 CST 2004.
/etc/ppp/ip-down.local: Connection lasted 22 seconds.
/etc/ppp/ip-down.local: 30 bytes sent, 30 bytes received.
/etc/ppp/ip-down.local: ppp1 is available.
/etc/ppp/ip-down.local: Table ppp0 default route changed to default dev ppp1  scope link .

/etc/ppp/ip-up.local: ppp0 going up at Tue Aug 10 08:05:53 CST 2004.
/etc/ppp/ip-up.local: ppp0 got address: 61.159.254.30, peer address is 61.159.254.1.
/etc/ppp/ip-up.local: Table ppp0 default route change to default dev ppp0  scope link .

/etc/ppp/ip-down.local: ppp1 going down at Tue Aug 10 08:12:45 CST 2004.
/etc/ppp/ip-down.local: Connection lasted 853 seconds.
/etc/ppp/ip-down.local: 9313 bytes sent, 116181 bytes received.
/etc/ppp/ip-down.local: ppp0 is available.
/etc/ppp/ip-down.local: Table ppp1 default route changed to default dev ppp0  scope link .

/etc/ppp/ip-up.local: ppp1 going up at Tue Aug 10 08:12:53 CST 2004.
/etc/ppp/ip-up.local: ppp1 got address: 220.163.38.20, peer address is 220.163.38.1.
/etc/ppp/ip-up.local: Table ppp1 default route change to default dev ppp1  scope link .[list=]
    [img][/img][code][/code]

    DualADSL.jpg (25.42 KB, 下载次数: 72)

    DualADSL.jpg

    论坛徽章:
    0
    2 [报告]
    发表于 2004-08-08 21:31 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    你的双adsl 是两个有一样的上网号?

    论坛徽章:
    0
    3 [报告]
    发表于 2004-08-08 22:27 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    要两组用户名密码。对于lan拨入方式,只要电信端没有限制同一个上网帐号的同时在线,也应可以,没环境,谁有的话试试。

    论坛徽章:
    0
    4 [报告]
    发表于 2004-08-09 12:20 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    写的不错

    论坛徽章:
    0
    5 [报告]
    发表于 2004-08-10 10:01 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    由于之前没有考虑ip-up.local和ip-down.local的互斥性,单端口状态快速翻转时,可能会有问题,所以重新修改了这两个脚本.原来的脚本有问题.

    论坛徽章:
    0
    6 [报告]
    发表于 2004-08-10 15:01 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    比如是两条512的adsl
    我单线下载会是50k还是100k?
    如果多线呢?
    这个负载均衡的原理是什么呢?
    希望高手帮忙解释小弟的问题

    论坛徽章:
    0
    7 [报告]
    发表于 2004-08-10 16:49 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    因为无论怎样,路由策略对于特定的源/目的地址,其只有一个出口,要么就是ppp0,要么就是ppp1,所以个人认为速度不能翻番,只是多了一条路由出路而已,也就是所谓的冗余备份以及减轻网络中的负载,提高网络的效率而已,如果需要速度翻番,那么个人认为只有通过bonding才可能解决。
      另外,现在的某些设备已经可以做到这一点了,比如tp-linkR480宽带路由其,就可以支持两个单独的adsl线路拨号,并能把两条线路整合成一条线路,事先速度翻番的功能!

    论坛徽章:
    0
    8 [报告]
    发表于 2004-08-11 08:47 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    其实,在这种情况下,负载均衡也只能做到会话级.因为对于外界而言,数据包是来自两个不同的IP的.他并不知道,两个不同的IP后面是同一个网络.所以,在数据包级做负载均衡也只是局域网内部的情况.至于向FTP这类的引用,控制连接走一个IP,而数据连接走另一个IP,可以吗?流量如何穿越server端的防火墙?
    bonding一般用在物理端口,在ppp0这样的端口上能实现吗?
    bonding需要两端都做,不同ISP之间怎么做?同一个ISP他愿意做吗?要占用他两个端口,不如在一个端口上把带宽加倍.

    论坛徽章:
    0
    9 [报告]
    发表于 2004-08-11 09:03 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    我还看见过这么一种路由,价格也就2000多元,却说可以实现光纤和ADSL的负载均衡,意思说当在光纤的速度没有达到指定速度的情况下,ADSL可以进行流量的补充?我听的有点晕,个人认为不大可能的!

    论坛徽章:
    0
    10 [报告]
    发表于 2004-08-11 10:29 |只看该作者

    【原创】双adsl链路冗余互备及流量分担的实现

    写的不错啊

    但是有个重要的前提,isp要么允许同一个账户重复登陆,要么有两个adsl帐号。满足这两个前提就 ok l了。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP