免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 14359 | 回复: 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
    41 [报告]
    发表于 2011-05-03 16:40 |只看该作者
    谁能告诉我DNAT的转发效率

    论坛徽章:
    0
    40 [报告]
    发表于 2011-05-03 16:07 |只看该作者
    lyking 在的时候回答下我啊!我按照你的说法去做。可惜adsl不能分流啊?只有一个在动。我的环境是这样的。我两台虚拟机。一个做pppoe服务器,一台来拨两个adsl账号。账号拨上去了,通过tftp从服务器下载东西可以,但是就是只有一个adsl的流量在动。

    论坛徽章:
    0
    39 [报告]
    发表于 2011-04-25 20:17 |只看该作者
    在线等你求解。。急救。。

    论坛徽章:
    0
    38 [报告]
    发表于 2011-04-25 20:16 |只看该作者
    done < "/tmp/route-tmp"
    我这里错了。。。不知道为什么  
    错误显示syntax error near unexpected token ‘done’
            done < "/tmp/route-tmp"

    论坛徽章:
    0
    37 [报告]
    发表于 2006-07-20 15:41 |只看该作者
    固定IP如何做
    onenight 该用户已被删除
    36 [报告]
    发表于 2005-10-27 17:20 |只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽

    论坛徽章:
    0
    35 [报告]
    发表于 2005-03-26 19:05 |只看该作者

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

    请教各位~~~
    我已经可以实现两个ADSL同时上网~~~外部也可以连接到我电脑的不同IP和端口~~

    也就是实现了分流下载~~`

    但是上传的数据却总是在一个主的ADSL上产生~~~
    请教各位大哥~~~怎么样才可以真正的实现上传和下载平衡负载~~~
    帮帮我~~
    本人联系方法Q58862743

    谢谢~~~

    论坛徽章:
    0
    34 [报告]
    发表于 2005-01-19 18:05 |只看该作者

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

    这个好贴正需要,再顶上来,看看大家哪位实验过?效果怎么样?

    论坛徽章:
    0
    33 [报告]
    发表于 2004-09-04 01:36 |只看该作者

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

    说明一下,本贴的方法只能对于PPP链路生效。因为,PPP协议能够维护其链路的状态,并且pppd会调用ip-up/ip-down脚本。
    而对于类以太网的多路访问网络,不仅要能够检测链路状况,而且需要相应检测对端网关的手段,比如中间加了交换机的情况,链路状态无法反映网关的可达状态。
    所以,要在多路访问网络上实现多链路冗余,还需要另寻它路。
    网中人的方法是其中一个方法。
      

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

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP