作者 主題: Linux ADSL Multipath Routing Solution  (閱讀 220532 次)

0 會員 與 1 訪客 正在閱讀本文。

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 於: 2002-07-01 10:55 »
Linux ADSL Multipath Routing Solution
By Tommy Wu <tommy at teatime.com.tw>


  由於前些日子, 我所服務的單位, 決定將原本使用的專線退租, 改用 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.teatime.com.tw/~tommy/linux/equalize.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 addr add $EXT_IP1/$EXT_MASK1 dev $EXT_IF
ip addr add $EXT_IP2/$EXT_MASK2 dev $EXT_IF

#
ip rule add to $EXT_IP1/$EXT_MASK1 lookup 201
ip route add default via $GW1 dev $EXT_IF table 201

#
ip rule add to $EXT_IP2/$EXT_MASK2 lookup 202
ip route add default via $GW2 dev $EXT_IF table 202

#
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 <community> <IP addr> [<port>]
- add a trap destination
snmp trap delete <community> <IP addr> [<port>]
- 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 上面使用,
  可以正確得知線路的情形. 另外, 在我家的 cisco 677 上, 在 bridge mode 下,
  使用 snmpwalk 查詢線路都是 up(1), 無法知道線路情形... 不過如有異動, 仍可
  以收到對應的 snmp traps.
 
  這兩種方式各有利弊, 第一種方式無法得知一開始的狀態, 第二種方式無法即時
  得知狀態的改變, 所以通常會同時利用兩種方式來處理, 以上述的例子來說, 我
  們可以使用下列的 script 來處理:

代碼: [選擇]
 
#!/bin/bash
# chk_adsl: check the status of ADSL and change routing table  
 
# SNMP tree
SNMP_KEY="interfaces.ifTable.ifEntry.ifOperStatus.20"
 
# 對外網卡
EXT_IF="eth0"
     
# HiNet IP
EXT_ATUR1="192.168.1.1"
EXT_IP1="111.111.111.111"
EXT_MASK1="24"
GW1="111.111.111.1"

# SeedNet IP
EXT_ATUR2="192.168.1.2"
EXT_IP2="222.222.222.222"
EXT_MASK2="24"
GW2="222.222.222.1"


STATUS1=`snmpwalk $EXT_ATUR1 public $SNMP_KEY | grep "up(1)" | wc -l`
STATUS2=`snmpwalk $EXT_ATUR2 public $SNMP_KEY | grep "up(1)" | wc -l`

if [ "$STATUS1" = "0" ]; then
  if [ "$STATUS2" = "0" ]; then
    # ALL line down
    echo -e "\n\
ALL ADSL DOWN!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ALL ADSL DOWN!" root
  else
    # ATUR1 down, ATUR2 up
    echo -e "\n\
ADSL $EXT_ATUR1 DOWN!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ADSL $EXT_ATUR1 DOWN!" root
    ip route relpace default via $GW2 dev $EXT_IF
    ip route flush cache
  fi
else
  if [ "$STATUS2" = "0" ]; then
    # ATUR1 up, ATUR2 down
    echo -e "\n\
ADSL $EXT_ATUR2 DOWN!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ADSL $EXT_ATUR2 DOWN!" root
    ip route relpace default via $GW1 dev $EXT_IF
    ip route flush cache
  else
    # All line up
    echo -e "\n\
ALL ADSL UP!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ALL ADSL UP!" root
    ip route replace default equalize \
nexthop via $GW1 dev $EXT_IF \
nexthop via $GW2 dev $EXT_IF
    ip route flush cache
  fi
fi


  利用上面的 script, 我們只要在 snmptrapd.conf 中將相關的 traphandle
  指到這一個 script, 就可以依照線路的狀態來做對應的處理. 當然, 如果你
  的線路不只兩條, 我想應該也可以照上面的作法自己試試看.

  後記:
  1. 在幾個月的使用下, 這個功能在我們這兒看起來並沒有其他的問題, 可以正常使用.
  2. 在 SMP 的 kernel 下, 這個 patch 會無法正常開機... 我試過幾台機器都一樣. 我發現這個 patch 在 2.2 的 kernel 中已經有內含, 或許可以在 2.2 的 SMP 下正常使用 (沒試過), 也就是你如果使用 2.2 的 kernel, 應該原本就有這個功能.
  3. 要合併的線路, 並非是沒有條件的, 也就是兩條線路的回應時間並不能相差過大, 否則反而會更慢.
   

  本文的最新版本可以由下列的網頁取得:
 
  http://www.teatime.com.tw/~tommy/doc/multipath.txt

ZMAN

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 6247
  • 性別: 男
    • 檢視個人資料
    • 魔力門部落格
Linux ADSL Multipath Routing Solution
« 回覆 #1 於: 2002-07-01 11:00 »
啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!
啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!

手心都拍腫了
立正!敬禮


貪心的問一下
不知道Multi-Homing可以做到了嗎
佈線深似海!
網路高如天!

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #2 於: 2002-07-01 11:11 »
引述: "ZMAN"

貪心的問一下
不知道Multi-Homing可以做到了嗎


不要太貪心了....

目前的 multi-homing, 我覺得除了利用 dns 查詢時, 給定不同的 ip 來分流外, 在邏輯上, 我想不出有什麼方法可以利用...

假定我有兩個 ip, 111.111.111.111, 222.222.222.222, 別人要連上來時, 根本就不可能知道這兩個 ip 實際是到同一個地方去...

當然, 如果你能夠讓所有的 router 都知道這兩個 ip 是可以互通的, 就可能可以做到, 只是... 這是不太可能的事情...

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #3 於: 2002-07-01 12:08 »
使用上有沒有什麼限制或問題,
我們公司也想作Hinet+Sparq!

ZMAN

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 6247
  • 性別: 男
    • 檢視個人資料
    • 魔力門部落格
Linux ADSL Multipath Routing Solution
« 回覆 #4 於: 2002-07-01 12:38 »
引述: "twu2"
引述: "ZMAN"

貪心的問一下
不知道Multi-Homing可以做到了嗎


不要太貪心了....

目前的 multi-homing, 我覺得除了利用 dns 查詢時, 給定不同的 ip 來分流外, 在邏輯上, 我想不出有什麼方法可以利用...

假定我有兩個 ip, 111.111.111.111, 222.222.222.222, 別人要連上來時, 根本就不可能知道這兩個 ip 實際是到同一個地方去...

當然, 如果你能夠讓所有的 router 都知道這兩個 ip 是可以互通的, 就可能可以做到, 只是... 這是不太可能的事情...


目前我所讀到的資料中
像是BGP需要ISP配合設定
而且兩條線路一定要是同一家ISP
我覺得這樣就失去Multi-Homing的意義
而國內廠商多是利用DNS查詢作手腳
這部分我覺得容錯比負載平衡的意義來得重要
所以設計上來說作到OUTBOND的整合和INBOND的容錯
應該是比較符合現況
佈線深似海!
網路高如天!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #5 於: 2002-07-01 12:49 »
太棒了﹗

tommy 兄﹐可以允許我轉貼到 study-area 的“技巧心得”裡面嗎﹖

謝謝﹗

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #6 於: 2002-07-01 12:50 »
引述: "netman"
太棒了﹗

tommy 兄﹐可以允許我轉貼到 study-area 的“技巧心得”裡面嗎﹖

謝謝﹗


可以.

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #7 於: 2002-07-01 12:54 »
引述: "duncanlo"
使用上有沒有什麼限制或問題,
我們公司也想作Hinet+Sparq!


我用起來沒覺得有什麼限制...
只有一個問題...
目前由內部的網路連出去, 會有效果, 但是如果到那台機器上使用, 連出去時只有用到一條線路, 外面的連進來時, 如果連到那台機器抓檔案, 也是只用到一條線路.
這個還想不出來為什麼... 不過對於我們這兒來說, 多數的情形都是由內部的網路連出... 所以通常都有作用.

beethobear

  • 鑽研的研究生
  • *****
  • 文章數: 539
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #8 於: 2002-07-01 12:57 »
哇!!!

這篇文件很不賴
啪啪啪啪啪啪....................


可是....
我剛去你家逛了一下
http://forum.teatime.com.tw/

跟酷學園好像呀

不過你好像有打算討論ORACLE
加油歐!!!
到時候又多個地方可以去了

 :D  :D  :D
BEETHOBEAR  !!
--------------------------------------------------------

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #9 於: 2002-07-01 13:16 »
引述: "beethobear"
哇!!!

我剛去你家逛了一下
http://forum.teatime.com.tw/

跟酷學園好像呀

不過你好像有打算討論ORACLE
加油歐!!!
到時候又多個地方可以去了



都用 phpBB2 做出來的, 樣子不都是那樣...
那個地方應該不會有什麼人上去, 我只是拿這個來放一些資料...

ORACLE 因為工作的關係, 多少也摸了一些...
有些資料, 怕會忘記, 整理後放到討論區中比較不會找不到. :-)

ZMAN

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 6247
  • 性別: 男
    • 檢視個人資料
    • 魔力門部落格
Linux ADSL Multipath Routing Solution
« 回覆 #10 於: 2002-07-01 13:24 »
剛剛去看了一下Tommy的自我介紹網頁
真是相當優秀耶
經歷又豐富

那個Dialogic被Intel併購後
我一直搞不太清楚它的相關技術
因為好像只有墾懋有相關經驗
佈線深似海!
網路高如天!

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #11 於: 2002-07-01 13:38 »
引述: "ZMAN"

那個Dialogic被Intel併購後
我一直搞不太清楚它的相關技術
因為好像只有墾懋有相關經驗


Intel 當初應該是看上 Dialogic 在電話語音上面的技術, 才買下這家公司.
不過一直到這兩年才比較有覺得它是 intel 的一個子公司. Dialogic 應該
是在這個業界的領導廠商, 國內用這家公司的語音卡的比例也比較高些.
(以市場來看, 有電話的比有電腦的人多.... 市場也就大多了)

除了懇懋之外, 我知道國內還有不少廠商有做這方面的東西.

ZMAN

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 6247
  • 性別: 男
    • 檢視個人資料
    • 魔力門部落格
Linux ADSL Multipath Routing Solution
« 回覆 #12 於: 2002-07-01 13:42 »
引述: "twu2"
引述: "ZMAN"

那個Dialogic被Intel併購後
我一直搞不太清楚它的相關技術
因為好像只有墾懋有相關經驗


Intel 當初應該是看上 Dialogic 在電話語音上面的技術, 才買下這家公司.
不過一直到這兩年才比較有覺得它是 intel 的一個子公司. Dialogic 應該
是在這個業界的領導廠商, 國內用這家公司的語音卡的比例也比較高些.
(以市場來看, 有電話的比有電腦的人多.... 市場也就大多了)

除了懇懋之外, 我知道國內還有不少廠商有做這方面的東西.


那它跟VOIP設備或過去的MUX或FRAD有什麼不一樣啊
還是它是CRM之類的應用
佈線深似海!
網路高如天!

duncanlo

  • SA 苦力組
  • 俺是博士!
  • *****
  • 文章數: 7312
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #13 於: 2002-07-01 13:44 »
引述: "ZMAN"
目前我所讀到的資料中
像是BGP需要ISP配合設定
而且兩條線路一定要是同一家ISP
我覺得這樣就失去Multi-Homing的意義


應該是,
BGP要把Router作Group起來,
通常在大校園網路時適用,像台大,
不過ISP一般不太想幫你作這段,
不知是沒這服務還是不會設?!

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #14 於: 2002-07-01 13:59 »
引述: "ZMAN"

那它跟VOIP設備或過去的MUX或FRAD有什麼不一樣啊
還是它是CRM之類的應用


原本好像沒什麼關係...
Dialoigc 語音卡原本的應用多在 IVR 上面, 就是那些打電話去掛號, 查詢, 下單之類的服務, 它提供一些 API 在它的硬體上, 可以寫程式透過電話與使用者互動. 目前比較流行的是除了電話按鍵之外, 也加上一些語音辨識的功能, 用說的也可以通...

在國際電話還很貴的那個時候, 有很多人用 Dialogic 配合 MUX, VOIP 之類的產品, 自己接一條國際專線, 就提供電話服務, 賺取差價. (那時不合法, 但利潤很高, 有不少人做...)

現在 Dialoigc 本身的產品也有 VOIP 的部份了, 也就是可以直接處理, 不用利用 MUX 之類的東西來做... (MUX 的部份多用在壓縮, 將 64K 的語音壓成 5-8K)

huckly

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3420
    • 檢視個人資料
    • http://blog.huckly.net
Linux ADSL Multipath Routing Solution
« 回覆 #15 於: 2002-07-01 14:00 »
BGP 有分成 wan 跟 lan 重點 就是之前 netman問到的 AS number
在 lan 裡面 AS 可以跟 private IP 一樣 自己定
但是 在 wan 上就得 申請
如果 有了 as number 就可以 不受限 ISP 業者
但是 一般 isp 業者 不會給你  AS 除非 你夠大

我朋友前一陣子申請過 twnic 也不給 據說是沒有了 (我看是打官腔)
最後逼的 我朋友跟apnic 申請  

先別考慮 BGP 吧
IT doesn't matter

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #16 於: 2002-07-01 17:00 »
引述: "twu2"
引述: "netman"
太棒了﹗

tommy 兄﹐可以允許我轉貼到 study-area 的“技巧心得”裡面嗎﹖

謝謝﹗


可以.


已經刊出﹐差點忘記跟您道謝呢~~

謝謝啦﹗  ^_^

ZMAN

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 6247
  • 性別: 男
    • 檢視個人資料
    • 魔力門部落格
Linux ADSL Multipath Routing Solution
« 回覆 #17 於: 2002-07-01 18:08 »
引述: "twu2"
引述: "ZMAN"

那它跟VOIP設備或過去的MUX或FRAD有什麼不一樣啊
還是它是CRM之類的應用


原本好像沒什麼關係...
Dialoigc 語音卡原本的應用多在 IVR 上面, 就是那些打電話去掛號, 查詢, 下單之類的服務, 它提供一些 API 在它的硬體上, 可以寫程式透過電話與使用者互動. 目前比較流行的是除了電話按鍵之外, 也加上一些語音辨識的功能, 用說的也可以通...

在國際電話還很貴的那個時候, 有很多人用 Dialogic 配合 MUX, VOIP 之類的產品, 自己接一條國際專線, 就提供電話服務, 賺取差價. (那時不合法, 但利潤很高, 有不少人做...)

現在 Dialoigc 本身的產品也有 VOIP 的部份了, 也就是可以直接處理, 不用利用 MUX 之類的東西來做... (MUX 的部份多用在壓縮, 將 64K 的語音壓成 5-8K)



收到
了解
謝啦
佈線深似海!
網路高如天!

cisco3662

  • 鑽研的研究生
  • *****
  • 文章數: 739
    • 檢視個人資料
Re: Linux ADSL Multipath Routing Solution
« 回覆 #18 於: 2002-07-01 19:46 »
引述: "twu2"
Linux ADSL Multipath Routing Solution
By Tommy Wu <tommy at teatime.com.tw>


  由於前些日子, 我所服務的單位, 決定將原本使用的專線退租, 改用 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 <community> <IP addr> [<port>]
- add a trap destination
snmp trap delete <community> <IP addr> [<port>]
- 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 上面使用,
  可以正確得知線路的情形. 另外, 在我家的 cisco 677 上, 在 bridge mode 下,
  使用 snmpwalk 查詢線路都是 up(1), 無法知道線路情形... 不過如有異動, 仍可
  以收到對應的 snmp traps.
 
  這兩種方式各有利弊, 第一種方式無法得知一開始的狀態, 第二種方式無法即時
  得知狀態的改變, 所以通常會同時利用兩種方式來處理, 以上述的例子來說, 我
  們可以使用下列的 script 來處理:
 
#!/bin/bash
# chk_adsl: check the status of ADSL and change routing table  
 
# SNMP tree
SNMP_KEY="interfaces.ifTable.ifEntry.ifOperStatus.20"
 
# 對外網卡
EXT_IF="eth0"
     
# HiNet IP
EXT_ATUR1="192.168.1.1"
EXT_IP1="111.111.111.111"
EXT_MASK1="24"
GW1="111.111.111.1"

# SeedNet IP
EXT_ATUR2="192.168.1.2"
EXT_IP2="222.222.222.222"
EXT_MASK2="24"
GW2="222.222.222.1"


STATUS1=`snmpwalk $EXT_ATUR1 public $SNMP_KEY | grep "up(1)" | wc -l`
STATUS2=`snmpwalk $EXT_ATUR2 public $SNMP_KEY | grep "up(1)" | wc -l`

if [ "$STATUS1" = "0" ]; then
  if [ "$STATUS2" = "0" ]; then
    # ALL line down
    echo -e "\n\
ALL ADSL DOWN!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ALL ADSL DOWN!" root
  else
    # ATUR1 down, ATUR2 up
    echo -e "\n\
ADSL $EXT_ATUR1 DOWN!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ADSL $EXT_ATUR1 DOWN!" root
    ip route relpace default via $GW2 dev $EXT_IF
    ip route flush cache
  fi
else
  if [ "$STATUS2" = "0" ]; then
    # ATUR1 up, ATUR2 down
    echo -e "\n\
ADSL $EXT_ATUR2 DOWN!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ADSL $EXT_ATUR2 DOWN!" root
    ip route relpace default via $GW1 dev $EXT_IF
    ip route flush cache
  else
    # All line up
    echo -e "\n\
ALL ADSL UP!\n\
Date: $(date)\n\
Host: $(hostname)\n\
" | /bin/mail -s "$(date) ALL ADSL UP!" root
    ip route replace default equalize \
   nexthop via $GW1 dev $EXT_IF \
   nexthop via $GW2 dev $EXT_IF
    ip route flush cache
  fi
fi


  利用上面的 script, 我們只要在 snmptrapd.conf 中將相關的 traphandle
  指到這一個 script, 就可以依照線路的狀態來做對應的處理. 當然, 如果你
  的線路不只兩條, 我想應該也可以照上面的作法自己試試看.

  本文的最新版本可以由下列的網頁取得:
 
  http://www.teatime.com.tw/~tommy/doc/multipath.txt



若我想用ping的方式,也就是icmp echo icmp reply的方式偵測線路,不要用snmp的方式,不曉的有沒有方法可解
我認為...用snmp的方式就要受限於atu-r的規格及穩定度了,而且,並不是每一台atu-r都可以有密碼進去編輯(有些會被改過,問也問不到)

用icmp的方式應該是最完整的solution,我知道F5的斷線偵測也是用icmp的方式

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: Linux ADSL Multipath Routing Solution
« 回覆 #19 於: 2002-07-01 20:16 »
引述: "cisco3662"

若我想用ping的方式,也就是icmp echo icmp reply的方式偵測線路,不要用snmp的方式,不曉的有沒有方法可解
我認為...用snmp的方式就要受限於atu-r的規格及穩定度了,而且,並不是每一台atu-r都可以有密碼進去編輯(有些會被改過,問也問不到)

用icmp的方式應該是最完整的solution,我知道F5的斷線偵測也是用icmp的方式


用 ping 的方式不能用於 router mode 的 ATU-R, 只能用於 bridge mode.
如果一定要用 ping... 可以試試這個  script

COUNT="5"
GATEWAY="111.111.111.111"

# 測試 gateway 是否正常
LOSS=`ping -c $COUNT -q $GATEWAY | grep loss | awk '{ print $7; }'`

if [ "$LOSS" == "100%" ]; then
  # 線路不正常
  ...
else
  # 線路正常
  ...
fi

同樣在原本線路是否正常的判斷上, 並沒有比較好的方法, 可能只能用一個檔案記錄上次的狀態, 再讀回來判斷...

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #20 於: 2002-07-03 08:33 »
引述: "twu2"
引述: "duncanlo"
使用上有沒有什麼限制或問題,
我們公司也想作Hinet+Sparq!


我用起來沒覺得有什麼限制...
只有一個問題...
目前由內部的網路連出去, 會有效果, 但是如果到那台機器上使用, 連出去時只有用到一條線路, 外面的連進來時, 如果連到那台機器抓檔案, 也是只用到一條線路.
這個還想不出來為什麼... 不過對於我們這兒來說, 多數的情形都是由內部的網路連出... 所以通常都有作用.


Sorry, 我發現這個是我在設定 routing table 的 rule 時, 把各 ip 的流量指到獨立的線路上, 造成這個情形....
把這個設定移除之後, 不論是由那台機器直接出去, 或由外面連到那台機器, 都一樣可以同時使用不同的線路出去了. :-)

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Linux ADSL Multipath Routing Solution
« 回覆 #21 於: 2002-07-03 17:00 »
引述: "twu2"
引述: "twu2"
引述: "duncanlo"
使用上有沒有什麼限制或問題,
我們公司也想作Hinet+Sparq!


我用起來沒覺得有什麼限制...
只有一個問題...
目前由內部的網路連出去, 會有效果, 但是如果到那台機器上使用, 連出去時只有用到一條線路, 外面的連進來時, 如果連到那台機器抓檔案, 也是只用到一條線路.
這個還想不出來為什麼... 不過對於我們這兒來說, 多數的情形都是由內部的網路連出... 所以通常都有作用.


Sorry, 我發現這個是我在設定 routing table 的 rule 時, 把各 ip 的流量指到獨立的線路上, 造成這個情形....
把這個設定移除之後, 不論是由那台機器直接出去, 或由外面連到那台機器, 都一樣可以同時使用不同的線路出去了. :-)


我不大了解您這個 rule 的要移除的意思,您的意思是要把

-> 設定 HiNet routing
-> ip rule add from $EXT_IP1 lookup 201  ----->>> 要移除嗎
-> ip route add default via $GW1 dev $EXT_IF table 201

還是指內部網路要上網的 rule 要移除

不大了  :o
=========================
http://www.kuolung.net
==========================

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #22 於: 2002-07-03 17:04 »
引述: "kuolung"

我不大了解您這個 rule 的要移除的意思,您的意思是要把

-> 設定 HiNet routing
-> ip rule add from $EXT_IP1 lookup 201  ----->>> 要移除嗎
-> ip route add default via $GW1 dev $EXT_IF table 201



對... 這個移除就可以了.

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Linux ADSL Multipath Routing Solution
« 回覆 #23 於: 2002-07-03 21:17 »
可是我用上述的方法合併 4 條 adsl 會有時連不上網頁的問題,有時很好,有時又連不上去,有沒有什麼方法可以看問題 or debug
=========================
http://www.kuolung.net
==========================

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #24 於: 2002-07-03 23:02 »
引述: "kuolung"
可是我用上述的方法合併 4 條 adsl 會有時連不上網頁的問題,有時很好,有時又連不上去,有沒有什麼方法可以看問題 or debug


我在沒有使用 equalize 參數之前, 如果沒有加上上面那個 ip rule ... 就會有這個現象, 加上後就正常了...
不過使用這個參數後, 移除那一段, 目前還沒碰到連不出去的情形... 明天上班再試試看..

我這兒雖然有另一條 512/512 的 ADSL 可以用, 但是那一條線路是我們這兒給外面的人連上來用的... 不太方便拿來測試... 所以沒有多的線路可以試驗.... 目前只試過 2 條線路...

日京三子

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 8832
    • 檢視個人資料
    • http://www.24online.cjb.net
Linux ADSL Multipath Routing Solution
« 回覆 #25 於: 2002-07-04 20:10 »
引述: "twu2"
引述: "kuolung"

我不大了解您這個 rule 的要移除的意思,您的意思是要把

-> 設定 HiNet routing
-> ip rule add from $EXT_IP1 lookup 201  ----->>> 要移除嗎
-> ip route add default via $GW1 dev $EXT_IF table 201



對... 這個移除就可以了.


抱歉,小弟又來插花了....^^"

您指的「移除」,是否是將整個script修改成下面的樣子:

#####  引入  #####

# 對外網卡
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
代碼: [選擇]

#
# ip rule add from $EXT_IP1 lookup 201
# ip route add default via $GW1 dev $EXT_IF table 201

#
# 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

#####  引文結束  ######

請問一下,是否是這樣呢?
哈克不愛的多合一輸入平台----->新香草口味
過去的時間不斷流逝,抹去的眼淚已成追憶;
乾枯的雙手無力阻止,再會了我遠去的曾經。

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #26 於: 2002-07-04 20:25 »
沒錯, 就是把那段 ip rule 移除, 讓所有的封包都走 main 的 default 那個路徑.

只是.... 今天發現如果移除那一段, 有時候連出會頓一下, 好像突然出不去的感覺, 加上之後又正常了.... 因為很少直接由那台機器傳送資料, 所以只好加回去..

這個目前還想不出來為什麼... :-(

日京三子

  • 全區板主
  • 俺是博士!
  • *****
  • 文章數: 8832
    • 檢視個人資料
    • http://www.24online.cjb.net
Linux ADSL Multipath Routing Solution
« 回覆 #27 於: 2002-07-05 08:19 »
引述: "twu2"
沒錯, 就是把那段 ip rule 移除, 讓所有的封包都走 main 的 default 那個路徑.

只是.... 今天發現如果移除那一段, 有時候連出會頓一下, 好像突然出不去的感覺, 加上之後又正常了.... 因為很少直接由那台機器傳送資料, 所以只好加回去..

這個目前還想不出來為什麼... :-(


可是,這樣子之後,所有封包變成只會走同樣一個路徑耶!  並沒有您所說的,將兩條頻寬整合在一起... 因為啊~  就小弟的環境而言,使用您的Script之後,兩個moden只會有一個有反應,另外一個則是一直處於沒事幹的情況底下....

小弟也檢查過了,在kernel那方面,已經將您在文章中所提到的部分全部開啟,並且都是選擇「Yes」;也已經將iproute更新到2.4.7-1的版本了..

請幫忙看一看,還有甚麼地方是小弟疏忽掉的,謝謝!
哈克不愛的多合一輸入平台----->新香草口味
過去的時間不斷流逝,抹去的眼淚已成追憶;
乾枯的雙手無力阻止,再會了我遠去的曾經。

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Linux ADSL Multipath Routing Solution
« 回覆 #28 於: 2002-07-05 08:27 »
代碼:

# ?#93;定 HiNet routing
# ip rule add from $EXT_IP1 lookup 201
# ip route add default via $GW1 dev $EXT_IF table 201

# ?#93;定 SeedNet routing
# ip rule add from $EXT_IP2 lookup 202
# ip route add default via $GW2 dev $EXT_IF table 202  


只移除 ip rule 的部份 ,ip route add 的部份還是要留著
=========================
http://www.kuolung.net
==========================

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Linux ADSL Multipath Routing Solution
« 回覆 #29 於: 2002-07-05 08:58 »
引述: "日京三子"
引述: "twu2"
沒錯, 就是把那段 ip rule 移除, 讓所有的封包都走 main 的 default 那個路徑.

只是.... 今天發現如果移除那一段, 有時候連出會頓一下, 好像突然出不去的感覺, 加上之後又正常了.... 因為很少直接由那台機器傳送資料, 所以只好加回去..

這個目前還想不出來為什麼... :-(


可是,這樣子之後,所有封包變成只會走同樣一個路徑耶!  並沒有您所說的,將兩條頻寬整合在一起... 因為啊~  就小弟的環境而言,使用您的Script之後,兩個moden只會有一個有反應,另外一個則是一直處於沒事幹的情況底下....

小弟也檢查過了,在kernel那方面,已經將您在文章中所提到的部分全部開啟,並且都是選擇「Yes」;也已經將iproute更新到2.4.7-1的版本了..

請幫忙看一看,還有甚麼地方是小弟疏忽掉的,謝謝!


我加上那一段的結果只有影響到那台 router/firewall 上的封包. 由內部網路出去的封包看起來還是有同時使用到兩條線路.

至於為什麼, 我說過, 我還不知道... 要慢慢試.

我使用 patched kernel 加上 equalize 參數後, 並沒有其他的設定就可以使用了.
iproute 的版本我不清楚.... 因為在 debian 上沒有那個版本號碼, 請有用 RedHat 的人說明一下吧.

你是直接在那台機器傳檔案嗎 ? 如果加上前面所的 rule, 的確只會使用一條線路.
另外, 我試的結果, 同樣的設定, 在我這兒如果是 T1/384 + 512, 反而比原本慢多了, 不知封包都往那兒去了... 為什麼 ? 我也不清楚.... 有需要的人請自己試試吧.. 我這兒被要求保留 512 那條線路給外面的人連上來使用, 所以並沒有這個需求, 所以對我們目前沒有影響. 我也沒有別的線路可以測試... 所以, 如果你的環境與我的不同時, 可能只能自己試試了..