Multiple Routing with multiple pppoe
Saturday, May 29, 2010 5:24:48 PM
REFERENCE: 雙網卡雙pppoe撥號可行嗎?
http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=103310
1) 設定了第一個DSL連線之後,把/etc/ppp/peer/dsl-provider更名,例如dsl-provider2,再用pppoeconf設定第二個連線。不過這樣只會自動啟動dsl-provider這個連線,dsl-provider2這個連線要自己更改/etc/network/interface的設定。
這樣設定仍只會用到一條線路的頻寬,你需要設定iptables,對兩條線路作load-balance。這個「功能」稱作 Multiple Routing
俗稱 load-balance,中文稱「平衡負載」
它的原理是每次封包送出去時,會自動輪流跳「預設閘道」(default gateway,大陸稱作網關),以達到每次送出封包都用不同的線路送出去,模擬出合併頻寬的效果。
兩條線路可以分配「權重」,如果是 1:1 就是輪流跳,2:1 的話第一條線先跳2次,在輪到第二條線跳1次。比如有兩條線 10M 和 2M,10M頻寬較大則可以分配較大的「權重」。
Load-Balance 實際上是「分流」效果,但是市面上賣這類設備的廠商都很喜歡誇大,說是「合併」。此兩種效果有很大差別,具體送出的封包檔頭其 souce ip 欄位資料不同。基本上兩條不同的線路(不同 IP)是不可能合併的,說合併的一定是騙人,但是可以分流。
這功能適合用在內部 LAN 有很多台電腦要上網,單線頻寬不足,需要多線來分散負載的情況。
如果是伺服器 server 要加大頻寬的情況,不必這麼麻煩,在 DNS 動手腳,用 DNS 跳號就可以了。
有沒有現成軟體我是不知道,要實現 Multiple Routing 功能,使用 Linux 內建的 ip 指令(iprouter2 模組)即可辦到。
使用 ip 指令,需知道什麼是路由表,什麼 RPDB 路由策略表。這個有點複雜,所以就不說明了,有興趣自行上網查資料或買書來看。
提供一個在下幾年前寫的 shell script
實際有用過,是可用的,且很穩定
至於其詳細原理,老實說也有點忘記了
要查書才能恢復記憶,懶得查,所以就不討論了
#!/bin/sh
## "#" 號之後的內容為註解, 執行時不會有作用
# ===========================================================================
# 雙 WAN 線路分流,路由規則 script v1.0 最後修改日期:2006-10-19
# 環境:基本三片網卡,對外線路1 (EXT)、對外線路2 (EXT2) 、對內 (LAN)
# 功能:雙 WAN 多重路由自動設定
# 測試可運作環境為 Fedora、CentOS,其它 distro 不掛保證
# 建議檔名:mroute.sh,權限:700,擁有者:root:root
# 建議存放位置:/usr/local/bin,並將其寫入 /etc/rc.local 以便一開機即執行
# ===========================================================================
# 使用說明:
# 1.預設使用 table 100、200,請確定這兩個 RPDB 表沒有使用到
# 2.此 script 不會自動撥接,若使用 ppp 連線,請確定執行此 script 前,已經設定好 rp-pppoe 服務
# 版本演進:
# v1.0 基本版
# =====================================================================================
# 變數設定區
# =====================================================================================
# 您必須設定相關變數的值,這個 script 才會生效
# 線路一
# EXT1_TYPE=線路型態,可用的兩個選項 (小寫):static (固定 IP)、ppp (撥接取得)
# EXT1_IF=代表線路的網卡介面,若為 ppp,則為 ppp0....
# EXT1_IP=線路的 IP,若為 ppp,則會自動取得,此處省略
# EXT1_GW=線路的閘道 IP,若為 PPP,則會自動取得,此處省略
# EXT1_WEIGHT=線路權重,指該線路的使用量比率,數字愈高使用愈頻繁
EXT1_TYPE="ppp"
EXT1_IF="ppp0"
EXT1_IP=""
EXT1_GW=""
EXT1_WEIGHT="5"
# 線路二
EXT2_TYPE="static"
EXT2_IF="eth1"
EXT2_IP="11.22.33.44"
EXT2_GW="11.22.33.44"
EXT2_WEIGHT="1"
# =====================================================================================
# 程式區
# =====================================================================================
# 以下至檔尾為止,為指令稿的運作程式碼, 如果對於 shell script 不太熟悉, 建議您不要隨意更動
# 如果線路其中之一,是 ppp 連線
[ "$EXT1_TYPE" = "ppp" ] && PPP="1"
[ "$EXT2_TYPE" = "ppp" ] && PPP="1"
# 檢查是否有 ppp 連線,若無,程式結束 (例外錯誤)
if [ "$PPP" = "1" ]; then
if ! ip address ls | grep ppp > /dev/null; then
echo "ppp0 is down!"
exit 1
fi
fi
# 雙 WAN 的路由 table 分別使用 100、200
for i in 100 200 ; do
# 轉換區域變數
if [ "$i" = "100" ]; then
TYPE="$EXT1_TYPE"
IP="$EXT1_IP"
GW="$EXT1_GW"
else
TYPE="$EXT2_TYPE"
IP="$EXT2_IP"
GW="$EXT2_GW"
fi
# 判斷線路型態,依照型態執行專屬程式區段
if [ "$TYPE" = "static" ]; then
# 清除 table,以避免重複執行時,顯示錯誤
ip rule del from $IP table $i 2>/dev/null
ip route del table $i 2>/dev/null
# 設定固定 IP 線路的相關 rule 與 table
ip route replace default via $GW table $i
ip rule add from $IP table $i
# 重新定義閘道,給稍後設定多重路由時使用
[ "$i" = "100" ] && EXT1_GW_S="$GW"
[ "$i" = "200" ] && EXT2_GW_S="$GW"
else
# 因為 ppp 每次取得的 IP 或閘道,可能都不相同,所以必須用程式判斷
# 秀出目前 route 表,用 awk 搜尋含有 ppp0.src 的字串,取第 1、9 個字串
ppp0_gw=`ip route ls | awk '/ppp0.*src/ {print $1}'`
ppp0_ip=`ip route ls | awk '/ppp0.*src/ {print $9}'`
# 清除 table,以避免重複執行時,顯示錯誤
ip rule del from $ppp0_ip table $i 2>/dev/null
ip route del table $i 2>/dev/null
# 設定 ppp 線路的相關 rule 與 table
ip route replace default via $ppp0_gw table $i
ip rule add from $ppp0_ip table $i
# 重新定義閘道,給稍後設定多重路由時使用
[ "$i" = "100" ] && EXT1_GW_S="$ppp0_gw"
[ "$i" = "200" ] && EXT2_GW_S="$ppp0_gw"
fi
done
# 設定預設閘道,多重路由關鍵
ip route replace default \
nexthop via $EXT1_GW_S dev $EXT1_IF weight $EXT1_WEIGHT \
nexthop via $EXT2_GW_S dev $EXT2_IF weight $EXT2_WEIGHT
# 清除路由快取,使設定立刻生效
ip route flush cache
# 顯示設定完成之訊息
echo
echo "Multiple Routing set OK!"
echo
說明:
1.這個 shell script 需要修改裡頭變數的參數才能運作,如何修改註解都有說明。
2.看了一下,好像只支援一條 ppp 連線,原因是在抓 ppp 連線的 ip 時,只會去找 ppp0。兩條線會有 ppp1,如果要用兩條都 ppp,可能要自行稍微修改一下程式碼。
3.Multiple Routing 實際上可以很多條線路,例如 4線、8線、32線....不過這個 shell shell 範例只支援 2線。
若要支援更多線路,建議去瞭解 ip 指令如何使用,就可以自己寫指令了。
4.這支腳本只處理 Multiple Routing 的部份,不會去自動撥接 PPPoE,要執行此腳本前,需先撥接上。
5.這支腳本也不處理 iptables 防火牆的部份 (包括 NAT),Multiple Routing 雙線路以上的防火牆,其腳本會較一條線的來的複雜很多,原因是每條線都要 run 一次規則。
基本上路由腳本和防火牆腳本是分開撰寫的,以方便維護和除錯。這部份若有興趣在說,我可以提供防火牆腳本檔下載(因為太長了破千行,用貼的不適合)。
http://www.ubuntu-tw.org/modules/newbb/viewtopic.php?post_id=103310
1) 設定了第一個DSL連線之後,把/etc/ppp/peer/dsl-provider更名,例如dsl-provider2,再用pppoeconf設定第二個連線。不過這樣只會自動啟動dsl-provider這個連線,dsl-provider2這個連線要自己更改/etc/network/interface的設定。
這樣設定仍只會用到一條線路的頻寬,你需要設定iptables,對兩條線路作load-balance。這個「功能」稱作 Multiple Routing
俗稱 load-balance,中文稱「平衡負載」
它的原理是每次封包送出去時,會自動輪流跳「預設閘道」(default gateway,大陸稱作網關),以達到每次送出封包都用不同的線路送出去,模擬出合併頻寬的效果。
兩條線路可以分配「權重」,如果是 1:1 就是輪流跳,2:1 的話第一條線先跳2次,在輪到第二條線跳1次。比如有兩條線 10M 和 2M,10M頻寬較大則可以分配較大的「權重」。
Load-Balance 實際上是「分流」效果,但是市面上賣這類設備的廠商都很喜歡誇大,說是「合併」。此兩種效果有很大差別,具體送出的封包檔頭其 souce ip 欄位資料不同。基本上兩條不同的線路(不同 IP)是不可能合併的,說合併的一定是騙人,但是可以分流。
這功能適合用在內部 LAN 有很多台電腦要上網,單線頻寬不足,需要多線來分散負載的情況。
如果是伺服器 server 要加大頻寬的情況,不必這麼麻煩,在 DNS 動手腳,用 DNS 跳號就可以了。
有沒有現成軟體我是不知道,要實現 Multiple Routing 功能,使用 Linux 內建的 ip 指令(iprouter2 模組)即可辦到。
使用 ip 指令,需知道什麼是路由表,什麼 RPDB 路由策略表。這個有點複雜,所以就不說明了,有興趣自行上網查資料或買書來看。
提供一個在下幾年前寫的 shell script
實際有用過,是可用的,且很穩定
至於其詳細原理,老實說也有點忘記了
要查書才能恢復記憶,懶得查,所以就不討論了
#!/bin/sh
## "#" 號之後的內容為註解, 執行時不會有作用
# ===========================================================================
# 雙 WAN 線路分流,路由規則 script v1.0 最後修改日期:2006-10-19
# 環境:基本三片網卡,對外線路1 (EXT)、對外線路2 (EXT2) 、對內 (LAN)
# 功能:雙 WAN 多重路由自動設定
# 測試可運作環境為 Fedora、CentOS,其它 distro 不掛保證
# 建議檔名:mroute.sh,權限:700,擁有者:root:root
# 建議存放位置:/usr/local/bin,並將其寫入 /etc/rc.local 以便一開機即執行
# ===========================================================================
# 使用說明:
# 1.預設使用 table 100、200,請確定這兩個 RPDB 表沒有使用到
# 2.此 script 不會自動撥接,若使用 ppp 連線,請確定執行此 script 前,已經設定好 rp-pppoe 服務
# 版本演進:
# v1.0 基本版
# =====================================================================================
# 變數設定區
# =====================================================================================
# 您必須設定相關變數的值,這個 script 才會生效
# 線路一
# EXT1_TYPE=線路型態,可用的兩個選項 (小寫):static (固定 IP)、ppp (撥接取得)
# EXT1_IF=代表線路的網卡介面,若為 ppp,則為 ppp0....
# EXT1_IP=線路的 IP,若為 ppp,則會自動取得,此處省略
# EXT1_GW=線路的閘道 IP,若為 PPP,則會自動取得,此處省略
# EXT1_WEIGHT=線路權重,指該線路的使用量比率,數字愈高使用愈頻繁
EXT1_TYPE="ppp"
EXT1_IF="ppp0"
EXT1_IP=""
EXT1_GW=""
EXT1_WEIGHT="5"
# 線路二
EXT2_TYPE="static"
EXT2_IF="eth1"
EXT2_IP="11.22.33.44"
EXT2_GW="11.22.33.44"
EXT2_WEIGHT="1"
# =====================================================================================
# 程式區
# =====================================================================================
# 以下至檔尾為止,為指令稿的運作程式碼, 如果對於 shell script 不太熟悉, 建議您不要隨意更動
# 如果線路其中之一,是 ppp 連線
[ "$EXT1_TYPE" = "ppp" ] && PPP="1"
[ "$EXT2_TYPE" = "ppp" ] && PPP="1"
# 檢查是否有 ppp 連線,若無,程式結束 (例外錯誤)
if [ "$PPP" = "1" ]; then
if ! ip address ls | grep ppp > /dev/null; then
echo "ppp0 is down!"
exit 1
fi
fi
# 雙 WAN 的路由 table 分別使用 100、200
for i in 100 200 ; do
# 轉換區域變數
if [ "$i" = "100" ]; then
TYPE="$EXT1_TYPE"
IP="$EXT1_IP"
GW="$EXT1_GW"
else
TYPE="$EXT2_TYPE"
IP="$EXT2_IP"
GW="$EXT2_GW"
fi
# 判斷線路型態,依照型態執行專屬程式區段
if [ "$TYPE" = "static" ]; then
# 清除 table,以避免重複執行時,顯示錯誤
ip rule del from $IP table $i 2>/dev/null
ip route del table $i 2>/dev/null
# 設定固定 IP 線路的相關 rule 與 table
ip route replace default via $GW table $i
ip rule add from $IP table $i
# 重新定義閘道,給稍後設定多重路由時使用
[ "$i" = "100" ] && EXT1_GW_S="$GW"
[ "$i" = "200" ] && EXT2_GW_S="$GW"
else
# 因為 ppp 每次取得的 IP 或閘道,可能都不相同,所以必須用程式判斷
# 秀出目前 route 表,用 awk 搜尋含有 ppp0.src 的字串,取第 1、9 個字串
ppp0_gw=`ip route ls | awk '/ppp0.*src/ {print $1}'`
ppp0_ip=`ip route ls | awk '/ppp0.*src/ {print $9}'`
# 清除 table,以避免重複執行時,顯示錯誤
ip rule del from $ppp0_ip table $i 2>/dev/null
ip route del table $i 2>/dev/null
# 設定 ppp 線路的相關 rule 與 table
ip route replace default via $ppp0_gw table $i
ip rule add from $ppp0_ip table $i
# 重新定義閘道,給稍後設定多重路由時使用
[ "$i" = "100" ] && EXT1_GW_S="$ppp0_gw"
[ "$i" = "200" ] && EXT2_GW_S="$ppp0_gw"
fi
done
# 設定預設閘道,多重路由關鍵
ip route replace default \
nexthop via $EXT1_GW_S dev $EXT1_IF weight $EXT1_WEIGHT \
nexthop via $EXT2_GW_S dev $EXT2_IF weight $EXT2_WEIGHT
# 清除路由快取,使設定立刻生效
ip route flush cache
# 顯示設定完成之訊息
echo
echo "Multiple Routing set OK!"
echo
說明:
1.這個 shell script 需要修改裡頭變數的參數才能運作,如何修改註解都有說明。
2.看了一下,好像只支援一條 ppp 連線,原因是在抓 ppp 連線的 ip 時,只會去找 ppp0。兩條線會有 ppp1,如果要用兩條都 ppp,可能要自行稍微修改一下程式碼。
3.Multiple Routing 實際上可以很多條線路,例如 4線、8線、32線....不過這個 shell shell 範例只支援 2線。
若要支援更多線路,建議去瞭解 ip 指令如何使用,就可以自己寫指令了。
4.這支腳本只處理 Multiple Routing 的部份,不會去自動撥接 PPPoE,要執行此腳本前,需先撥接上。
5.這支腳本也不處理 iptables 防火牆的部份 (包括 NAT),Multiple Routing 雙線路以上的防火牆,其腳本會較一條線的來的複雜很多,原因是每條線都要 run 一次規則。
基本上路由腳本和防火牆腳本是分開撰寫的,以方便維護和除錯。這部份若有興趣在說,我可以提供防火牆腳本檔下載(因為太長了破千行,用貼的不適合)。






