国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Linux ADSL Multipath Routing Solution

2024-07-21 02:36:56
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  由于前些日子, 我所服務(wù)的單位, 決定將原本使用的專(zhuān)線退租, 改用 ADSL 來(lái)提供
   上網(wǎng)的服務(wù), 為了降低 ADSL 斷線無(wú)法聯(lián)機(jī)的情形, 所以由 SeedNet, Hinet 各申
   請(qǐng)了一條單機(jī)型的 T1/384 ADSL 來(lái)使用.
  
   但是一般 ISP 業(yè)者似乎沒(méi)有提供兩條線路頻寬合用的服務(wù), 更何況是使用兩家不同
   ISP 的線路, 所以決定自己利用 linux 的 Equal-Cost Multipath Routing (ECMP)
   功能來(lái)解決這個(gè)問(wèn)題.
  
   關(guān)于 ECMP 的設(shè)定說(shuō)明, 可以參考
   http://www.study-area.org/tips/m_routing.htm
  
   初期, 我利用上述的功能來(lái)處理, 但是發(fā)現(xiàn)效率不怎么好, 由于路由的決定, 并不
   是依據(jù) packet 來(lái)傳送, 所以出去的時(shí)候, 同一個(gè) session 只會(huì)使用一條線路,
   仍然會(huì)經(jīng)常造成, 明明另一條線路沒(méi)有什么流量, 但是大家都擠在同一條線路的情
   形發(fā)生.
  
   在 iPRoute2 的說(shuō)明中有提到 equalize 參數(shù), 會(huì)將 packet 分散到不同的線路上
   面, 但是 kernel 需要另外的 patch 才能運(yùn)作, 上網(wǎng)查了一下, 有找到下面這個(gè)
   patch:
  
   http://www.van-dijk.net/linuxkernel/200212/att-0980/01-equalize_2.4.18.patch
  
   測(cè)試后發(fā)現(xiàn)的確可以同時(shí)使用不同的線路傳送 packet. 現(xiàn)在說(shuō)明一下, 如何做到這
   個(gè)功能:
  
   1. 你必須要有 iproute2 套件. 另外由于要對(duì) kernel 加上另外的 patch, 所以相關(guān)
   的工具也是必要的.
  
   2. 由 www.kernel.org 抓下 linux-2.4.18.tar.bz2 與上述的 patch.
   上述的 patch, 我在 2.4.18 之后的版本都裝過(guò), 都可以正常使用, 之前的 kernel
   沒(méi)有試過(guò), 并不清楚... 不過(guò)假如 2.4.18 應(yīng)該算是 2.4 版本中最穩(wěn)定的一個(gè)版
   本, 假如你還在用舊的 kernel, 建議升級(jí)到這個(gè)版本.
  
  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
  
   這個(gè) patch 并不會(huì)新增任何的設(shè)定, 所以你可以參考上述 ECMP 文件中的設(shè)定選
   項(xiàng)來(lái)設(shè)定你的 kernel. 然后重新 make 一個(gè)新的 kernel 來(lái)使用. 我通常會(huì)選取
   下面這幾個(gè)功能:
  
  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 重新開(kāi)機(jī)之后, 就應(yīng)該可以使用 equalize 參數(shù)了. 多數(shù)的設(shè)
   定都與上述的 ECMP 文件相同, 只是多了一個(gè) equalize 參數(shù). 舉例來(lái)說(shuō):
  
  # 對(duì)外網(wǎng)卡
  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"
  
  # 設(shè)定 ip
  ip addr add $EXT_IP1/$EXT_MASK1 dev $EXT_IF
  ip addr add $EXT_IP2/$EXT_MASK2 dev $EXT_IF
  
  # 設(shè)定 HiNet routing
  ip rule add from $EXT_IP1 lookup 201
  ip route add default via $GW1 dev $EXT_IF table 201
  
  # 設(shè)定 SeedNet routing
  ip rule add from $EXT_IP2 lookup 202
  ip route add default via $GW2 dev $EXT_IF table 202
  
  # 設(shè)定 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
  
   利用上面的設(shè)定, 我們就可以將兩條線路合并使用. 以 T1/384 的 ADSL 來(lái)說(shuō), 一般
   上傳的頻寬約可到 40KB 上下, 現(xiàn)在利用這個(gè) patch, 我們上傳一個(gè)檔案試看看:
  
  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$
  
   可以超過(guò) 40KB, 也就是的確會(huì)同時(shí)使用到兩條線路來(lái)傳送.
   假如有愛(ài)好, 可以到下列的網(wǎng)址查看流量:
  
   http://fw1.tahsda.org.tw/stats/mrtg/
   http://fw2.tahsda.org.tw/stats/mrtg/
  
   要注重這只有出去的 packet 是我們這端所能控制的, 回來(lái)的 packet 就不是我們
   可以控制了, 所以出去的流量在不同的線路上看起來(lái)是類(lèi)似的, 但是回來(lái)的流量就
   不一定了. 假如要控制進(jìn)來(lái)的流量, 可能要利用 DNS 的方式來(lái)控制了.
  
   接下來(lái), 要考慮一條線路斷線時(shí), 要改變 routing table 的設(shè)定. 由于 ADSL router
   應(yīng)該都有支持 SNMP 的功能, 所以我們可以利用 SNMP 來(lái)判定是否斷線. 你要先確定你
   的 linux 中有 snmpd, snmp 套件.
  
   我們有兩種方式來(lái)處理, 第一種是利用 snmp traps.
  
   以 arcatel 340 來(lái)說(shuō), 內(nèi)定的 password 應(yīng)該是 12345.
  
   telnet 192.168.1.1 之后, 打入密碼, 在 > 符號(hào)打入 snmp, 就會(huì)進(jìn)入 snmp> 設(shè)定
   目錄, 打入 snmp trap help 有說(shuō)明如下:
  
  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
  
   就可以了. 這樣就應(yīng)該在該機(jī)器可以收到相對(duì)的 snmp traps.
   以上面 Hinet/SeedNet 兩個(gè)線路來(lái)說(shuō), 假如要在同一網(wǎng)段上, 要先改變其中一個(gè) ATU-R
   的 ip 才可以, 內(nèi)定都是 192.168.1.1, 我們把其中一個(gè)改成 192.168.1.2
  
   然后在 192.168.1.254 機(jī)器上安裝 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
  
  然后寫(xiě) adsl_up, adsl_down 兩個(gè) script 來(lái)更改 route table.
  內(nèi)容大約是:
  
  #!
/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
  
   這樣子就會(huì)在每次斷線或恢復(fù)聯(lián)機(jī)時(shí)收到 ATU-R 的通知了.
  
   另外, 假如不想使用 snmp trap, 要使用 polling 的方式, 主動(dòng)去查詢線路情形,
   可以使用 snmpwalk 來(lái)處理, 用上面的例子, 可以先執(zhí)行
  
  snmpwalk 192.168.1.1 public interfaces.ifTable.ifEntry
  
   會(huì)出現(xiàn)一堆資料, 看一下 adsl 在的 index 是 20.
  
  interfaces.ifTable.ifEntry.ifDescr.20 = ADSL physical interface
  interfaces.ifTable.ifEntry.ifType.20 = adsl(94)
  
   線路狀態(tài)在
  
  interfaces.ifTable.ifEntry.ifOperStatus.20 = up(1)
  
   up(1) 表示聯(lián)機(jī)中, 所以執(zhí)行
  
  snmpwalk 192.168.1.1 public interfaces.ifTable.ifEntry.ifOperStatus.20
  
   會(huì)得到
  
  interfaces.ifTable.ifEntry.ifOperStatus.20 = up(1)
  
   當(dāng)斷線時(shí), 上面就不會(huì)在 up(1) 的狀態(tài).
   所以可以寫(xiě)個(gè) adsl_test 的 script
  
  snmpwalk 192.168.1.1 public interfaces.ifTable.ifEntry.ifOperStatus.20
   grep "up(1)" wc -l
  
   假如得到 0 就是斷線.
  
   上面就是使用 snmpwalk 來(lái)查詢線路的方法. 這個(gè)我在 arcatel 340 上面使用,
   可以正確得知線路

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 洪泽县| 丹巴县| 桑日县| 阳新县| 上思县| 中山市| 乃东县| 利津县| 建宁县| 双辽市| 海门市| 陈巴尔虎旗| 仁布县| 隆安县| 南召县| 嘉鱼县| 集贤县| 滦平县| 保山市| 闵行区| 华亭县| 永丰县| 印江| 苏州市| 白玉县| 杂多县| 寿阳县| 麻城市| 同仁县| 桂东县| 涞水县| 滕州市| 岱山县| 贺州市| 凤凰县| 缙云县| 那坡县| 满洲里市| 皮山县| 梨树县| 乐昌市|