分享
 
 
 

LinuxADSLMultipathRoutingSolution

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

由于前些日子, 我所服务的单位, 决定将原本使用的专线退租, 改用 ADSL 来提供

上网的服务, 为了降低 ADSL 断线无法联机的情形, 所以由 SeedNet, Hinet 各申

请了一条单机型的 T1/384 ADSL 来使用.

但是一般 ISP 业者似乎没有提供两条线路频宽合用的服务, 更何况是使用两家不同

ISP 的线路, 所以决定自己利用 Linux 的 Equal-Cost MultiPath Routing (ECMP)

功能来解决这个问题.

关于 ECMP 的设定说明, 可以参考

http://www.study-area.org/tips/m_routing.htm

初期, 我利用上述的功能来处理, 但是发现效率不怎么好, 由于路由的决定, 并不

是依据 packet 来传送, 所以出去的时候, 同一个 session 只会使用一条线路,

仍然会常常造成, 明明另一条线路没有什么流量, 但是大家都挤在同一条线路的情

形发生.

在 iproute2 的说明中有提到 equalize 参数, 会将 packet 分散到不同的线路上

面, 但是 kernel 需要另外的 patch 才能运作, 上网查了一下, 有找到下面这个

patch:

http://www.van-dijk.net/linuxkernel/200212/att-0980/01-equalize_2.4.18.patch

测试后发现的确可以同时使用不同的线路传送 packet. 现在说明一下, 如何做到这

个功能:

1. 你必须要有 iproute2 套件. 另外由于要对 kernel 加上另外的 patch, 所以相关

的工具也是必要的.

2. 由 www.kernel.org 抓下 linux-2.4.18.tar.bz2 与上述的 patch.

上述的 patch, 我在 2.4.18 之后的版本都装过, 都可以正常使用, 之前的 kernel

没有试过, 并不清楚... 不过如果 2.4.18 应该算是 2.4 版本中最稳定的一个版

本, 如果你还在用旧的 kernel, 建议升级到这个版本.

tommywu@fw:/usr/src$ tar jxvf linux-2.4.18.tar.bz2

...

...

tommywu@fw:/usr/src$ cd linux

tommywu@fw:/usr/src/linux$ patch -p1

patching file Documentation/networking/load-balancing.txt

patching file include/linux/in_route.h

patching file net/ipv4/fib_semantics.c

patching file net/ipv4/ip_output.c

patching file net/ipv4/route.c

patching file net/ipv4/udp.c

这个 patch 并不会新增任何的设定, 所以你可以参考上述 ECMP 文件中的设定选

项来设定你的 kernel. 然后重新 make 一个新的 kernel 来使用. 我通常会选取

下面这几个功能:

CONFIG_IP_MULTICAST=y

CONFIG_IP_ADVANCED_ROUTER=y

CONFIG_IP_MULTIPLE_TABLES=y

CONFIG_IP_ROUTE_FWMARK=y

CONFIG_IP_ROUTE_NAT=y

CONFIG_IP_ROUTE_MULTIPATH=y

CONFIG_IP_ROUTE_TOS=y

CONFIG_IP_ROUTE_VERBOSE=y

CONFIG_IP_ROUTE_LARGE_TABLES=y

3. 利用上面的 kernel 重新开机之后, 就应该可以使用 equalize 参数了. 多数的设

定都与上述的 ECMP 文件相同, 只是多了一个 equalize 参数. 举例来说:

# 对外网卡

EXT_IF="eth0"

# HiNet IP

EXT_IP1="111.111.111.111"

EXT_MASK1="24"

GW1="111.111.111.1"

# SeedNet IP

EXT_IP2="222.222.222.222"

EXT_MASK2="24"

GW2="222.222.222.1"

# 设定 ip

ip addr add $EXT_IP1/$EXT_MASK1 dev $EXT_IF

ip addr add $EXT_IP2/$EXT_MASK2 dev $EXT_IF

# 设定 HiNet routing

ip rule add from $EXT_IP1 lookup 201

ip route add default via $GW1 dev $EXT_IF table 201

# 设定 SeedNet routing

ip rule add from $EXT_IP2 lookup 202

ip route add default via $GW2 dev $EXT_IF table 202

# 设定 Default route

ip route replace default equalize nexthop via $GW1 dev $EXT_IF nexthop via $GW2 dev $EXT_IF

# 清除 route cache

ip route flush cache

利用上面的设定, 我们就可以将两条线路合并使用. 以 T1/384 的 ADSL 来说, 一般

上传的频宽约可到 40KB 上下, 现在利用这个 patch, 我们上传一个档案试看看:

tommywu@hisstby:/usr/src$ ftp ftp.teatime.com.tw

Connected to www.teatime.com.tw.

220 ProFTPD 1.2.5rc1 Server (Debian) [211.23.144.122]

Name (ftp.teatime.com.tw:tommywu): tommy

331 Password required for tommy.

Password:

230 User tommy logged in.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp bin

200 Type set to I.

ftp put patch-2.4.19-pre6.bz2

local: patch-2.4.19-pre6.bz2 remote: patch-2.4.19-pre6.bz2

200 PORT command successful.

150 Opening BINARY mode data connection for patch-2.4.19-pre6.bz2.

226 Transfer complete.

3858685 bytes sent in 49.92 secs (75.5 kB/s)

ftp quit

221 Goodbye.

tommywu@hisstby:/usr/src$

可以超过 40KB, 也就是的确会同时使用到两条线路来传送.

如果有兴趣, 可以到下列的网址查看流量:

http://fw1.tahsda.org.tw/stats/mrtg/

http://fw2.tahsda.org.tw/stats/mrtg/

要注意这只有出去的 packet 是我们这端所能控制的, 回来的 packet 就不是我们

可以控制了, 所以出去的流量在不同的线路上看起来是类似的, 但是回来的流量就

不一定了. 如果要控制进来的流量, 可能要利用 DNS 的方式来控制了.

接下来, 要考虑一条线路断线时, 要改变 routing table 的设定. 由于 ADSL router

应该都有支持 SNMP 的功能, 所以我们可以利用 SNMP 来判断是否断线. 你要先确定你

的 linux 中有 snmpd, snmp 套件.

我们有两种方式来处理, 第一种是利用 snmp traps.

以 arcatel 340 来说, 内定的 password 应该是 12345.

telnet 192.168.1.1 之后, 打入密码, 在 符号打入 snmp, 就会进入 snmp 设定

目录, 打入 snmp trap help 有说明如下:

snmp trap add []

- add a trap destination

snmp trap delete []

- delete a trap destination

snmp trap flush - delete all trap destinations

snmp trap list - list trap destinations

假定你要收 trap 的 ip 是 192.168.1.254, 就打入

snmp trap add public 192.168.1.254

就可以了. 这样就应该在该机器可以收到相对的 snmp traps.

以上面 Hinet/SeedNet 两个线路来说, 如果要在同一网段上, 要先改变其中一个 ATU-R

的 ip 才可以, 内定都是 192.168.1.1, 我们把其中一个改成 192.168.1.2

然后在 192.168.1.254 机器上安装 snmptrapd, 修改 /etc/snmp/snmptrapd.conf

加上下面两行:

traphandle .1.3.6.1.6.3.1.1.5.2 /usr/local/bin/adsl_up

traphandle .1.3.6.1.6.3.1.1.5.3 /usr/local/bin/adsl_down

然后写 adsl_up, adsl_down 两个 script 来更改 route table.

内容大约是:

#!/bin/bash

read DUMMY_HOST

read ROUTE_IP

case "$ROUTE_IP" in

192.168.1.1)

ip route replace default ....

;;

*)

echo "snmp traps from unknown ip?"

esac

这样子就会在每次断线或恢复联机时收到 ATU-R 的通知了.

另外, 如果不想使用 snmp trap, 要使用 polling 的方式, 主动去查询线路情形,

可以使用 snmpwalk 来处理, 用上面的例子, 可以先执行

snmpwalk 192.168.1.1 public interfaces.ifTable.ifEntry

会出现一堆资料, 看一下 adsl 在的 index 是 20.

interfaces.ifTable.ifEntry.ifDescr.20 = ADSL physical interface

interfaces.ifTable.ifEntry.ifType.20 = adsl(94)

线路状态在

interfaces.ifTable.ifEntry.ifOperStatus.20 = up(1)

up(1) 表示联机中, 所以执行

snmpwalk 192.168.1.1 public interfaces.ifTable.ifEntry.ifOperStatus.20

会得到

interfaces.ifTable.ifEntry.ifOperStatus.20 = up(1)

当断线时, 上面就不会在 up(1) 的状态.

所以可以写个 adsl_test 的 script

snmpwalk 192.168.1.1 public interfaces.ifTable.ifEntry.ifOperStatus.20 |

grep "up(1)" | wc -l

如果得到 0 就是断线.

上面就是使用 snmpwalk 来查询线路的方法. 这个我在 arcatel 340 上面使用,

可以正确得知线路

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有