由于前些日子, 我所服务的单位, 决定将原本使用的专线退租, 改用 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 < ../01-equalize_2.4.18.patch 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. 内容大约是: #!
复制本页网址和标题,发送给你QQ/Msn的好友一起分享
上一篇:在Linux下打开32位I/O和DMA
下一篇:中软linux券商管理办公系统解决方案