酷!學園
精華區 => 酷!學園 精華區 => 主題作者是: twu2 於 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
-
啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!
啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!啪!
手心都拍腫了
立正!敬禮
貪心的問一下
不知道Multi-Homing可以做到了嗎
-
貪心的問一下
不知道Multi-Homing可以做到了嗎
不要太貪心了....
目前的 multi-homing, 我覺得除了利用 dns 查詢時, 給定不同的 ip 來分流外, 在邏輯上, 我想不出有什麼方法可以利用...
假定我有兩個 ip, 111.111.111.111, 222.222.222.222, 別人要連上來時, 根本就不可能知道這兩個 ip 實際是到同一個地方去...
當然, 如果你能夠讓所有的 router 都知道這兩個 ip 是可以互通的, 就可能可以做到, 只是... 這是不太可能的事情...
-
使用上有沒有什麼限制或問題,
我們公司也想作Hinet+Sparq!
-
貪心的問一下
不知道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的容錯
應該是比較符合現況
-
太棒了﹗
tommy 兄﹐可以允許我轉貼到 study-area 的“技巧心得”裡面嗎﹖
謝謝﹗
-
太棒了﹗
tommy 兄﹐可以允許我轉貼到 study-area 的“技巧心得”裡面嗎﹖
謝謝﹗
可以.
-
使用上有沒有什麼限制或問題,
我們公司也想作Hinet+Sparq!
我用起來沒覺得有什麼限制...
只有一個問題...
目前由內部的網路連出去, 會有效果, 但是如果到那台機器上使用, 連出去時只有用到一條線路, 外面的連進來時, 如果連到那台機器抓檔案, 也是只用到一條線路.
這個還想不出來為什麼... 不過對於我們這兒來說, 多數的情形都是由內部的網路連出... 所以通常都有作用.
-
哇!!!
這篇文件很不賴
啪啪啪啪啪啪....................
可是....
我剛去你家逛了一下
http://forum.teatime.com.tw/
跟酷學園好像呀
不過你好像有打算討論ORACLE
加油歐!!!
到時候又多個地方可以去了
:D :D :D
-
哇!!!
我剛去你家逛了一下
http://forum.teatime.com.tw/
跟酷學園好像呀
不過你好像有打算討論ORACLE
加油歐!!!
到時候又多個地方可以去了
都用 phpBB2 做出來的, 樣子不都是那樣...
那個地方應該不會有什麼人上去, 我只是拿這個來放一些資料...
ORACLE 因為工作的關係, 多少也摸了一些...
有些資料, 怕會忘記, 整理後放到討論區中比較不會找不到. :-)
-
剛剛去看了一下Tommy的自我介紹網頁
真是相當優秀耶
經歷又豐富
那個Dialogic被Intel併購後
我一直搞不太清楚它的相關技術
因為好像只有墾懋有相關經驗
-
那個Dialogic被Intel併購後
我一直搞不太清楚它的相關技術
因為好像只有墾懋有相關經驗
Intel 當初應該是看上 Dialogic 在電話語音上面的技術, 才買下這家公司.
不過一直到這兩年才比較有覺得它是 intel 的一個子公司. Dialogic 應該
是在這個業界的領導廠商, 國內用這家公司的語音卡的比例也比較高些.
(以市場來看, 有電話的比有電腦的人多.... 市場也就大多了)
除了懇懋之外, 我知道國內還有不少廠商有做這方面的東西.
-
那個Dialogic被Intel併購後
我一直搞不太清楚它的相關技術
因為好像只有墾懋有相關經驗
Intel 當初應該是看上 Dialogic 在電話語音上面的技術, 才買下這家公司.
不過一直到這兩年才比較有覺得它是 intel 的一個子公司. Dialogic 應該
是在這個業界的領導廠商, 國內用這家公司的語音卡的比例也比較高些.
(以市場來看, 有電話的比有電腦的人多.... 市場也就大多了)
除了懇懋之外, 我知道國內還有不少廠商有做這方面的東西.
那它跟VOIP設備或過去的MUX或FRAD有什麼不一樣啊
還是它是CRM之類的應用
-
目前我所讀到的資料中
像是BGP需要ISP配合設定
而且兩條線路一定要是同一家ISP
我覺得這樣就失去Multi-Homing的意義
應該是,
BGP要把Router作Group起來,
通常在大校園網路時適用,像台大,
不過ISP一般不太想幫你作這段,
不知是沒這服務還是不會設?!
-
那它跟VOIP設備或過去的MUX或FRAD有什麼不一樣啊
還是它是CRM之類的應用
原本好像沒什麼關係...
Dialoigc 語音卡原本的應用多在 IVR 上面, 就是那些打電話去掛號, 查詢, 下單之類的服務, 它提供一些 API 在它的硬體上, 可以寫程式透過電話與使用者互動. 目前比較流行的是除了電話按鍵之外, 也加上一些語音辨識的功能, 用說的也可以通...
在國際電話還很貴的那個時候, 有很多人用 Dialogic 配合 MUX, VOIP 之類的產品, 自己接一條國際專線, 就提供電話服務, 賺取差價. (那時不合法, 但利潤很高, 有不少人做...)
現在 Dialoigc 本身的產品也有 VOIP 的部份了, 也就是可以直接處理, 不用利用 MUX 之類的東西來做... (MUX 的部份多用在壓縮, 將 64K 的語音壓成 5-8K)
-
BGP 有分成 wan 跟 lan 重點 就是之前 netman問到的 AS number
在 lan 裡面 AS 可以跟 private IP 一樣 自己定
但是 在 wan 上就得 申請
如果 有了 as number 就可以 不受限 ISP 業者
但是 一般 isp 業者 不會給你 AS 除非 你夠大
我朋友前一陣子申請過 twnic 也不給 據說是沒有了 (我看是打官腔)
最後逼的 我朋友跟apnic 申請
先別考慮 BGP 吧
-
太棒了﹗
tommy 兄﹐可以允許我轉貼到 study-area 的“技巧心得”裡面嗎﹖
謝謝﹗
可以.
已經刊出﹐差點忘記跟您道謝呢~~
謝謝啦﹗ ^_^
-
那它跟VOIP設備或過去的MUX或FRAD有什麼不一樣啊
還是它是CRM之類的應用
原本好像沒什麼關係...
Dialoigc 語音卡原本的應用多在 IVR 上面, 就是那些打電話去掛號, 查詢, 下單之類的服務, 它提供一些 API 在它的硬體上, 可以寫程式透過電話與使用者互動. 目前比較流行的是除了電話按鍵之外, 也加上一些語音辨識的功能, 用說的也可以通...
在國際電話還很貴的那個時候, 有很多人用 Dialogic 配合 MUX, VOIP 之類的產品, 自己接一條國際專線, 就提供電話服務, 賺取差價. (那時不合法, 但利潤很高, 有不少人做...)
現在 Dialoigc 本身的產品也有 VOIP 的部份了, 也就是可以直接處理, 不用利用 MUX 之類的東西來做... (MUX 的部份多用在壓縮, 將 64K 的語音壓成 5-8K)
收到
了解
謝啦
-
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的方式
-
若我想用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
同樣在原本線路是否正常的判斷上, 並沒有比較好的方法, 可能只能用一個檔案記錄上次的狀態, 再讀回來判斷...
-
使用上有沒有什麼限制或問題,
我們公司也想作Hinet+Sparq!
我用起來沒覺得有什麼限制...
只有一個問題...
目前由內部的網路連出去, 會有效果, 但是如果到那台機器上使用, 連出去時只有用到一條線路, 外面的連進來時, 如果連到那台機器抓檔案, 也是只用到一條線路.
這個還想不出來為什麼... 不過對於我們這兒來說, 多數的情形都是由內部的網路連出... 所以通常都有作用.
Sorry, 我發現這個是我在設定 routing table 的 rule 時, 把各 ip 的流量指到獨立的線路上, 造成這個情形....
把這個設定移除之後, 不論是由那台機器直接出去, 或由外面連到那台機器, 都一樣可以同時使用不同的線路出去了. :-)
-
使用上有沒有什麼限制或問題,
我們公司也想作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
-
我不大了解您這個 rule 的要移除的意思,您的意思是要把
-> 設定 HiNet routing
-> ip rule add from $EXT_IP1 lookup 201 ----->>> 要移除嗎
-> ip route add default via $GW1 dev $EXT_IF table 201
對... 這個移除就可以了.
-
可是我用上述的方法合併 4 條 adsl 會有時連不上網頁的問題,有時很好,有時又連不上去,有沒有什麼方法可以看問題 or debug
-
可是我用上述的方法合併 4 條 adsl 會有時連不上網頁的問題,有時很好,有時又連不上去,有沒有什麼方法可以看問題 or debug
我在沒有使用 equalize 參數之前, 如果沒有加上上面那個 ip rule ... 就會有這個現象, 加上後就正常了...
不過使用這個參數後, 移除那一段, 目前還沒碰到連不出去的情形... 明天上班再試試看..
我這兒雖然有另一條 512/512 的 ADSL 可以用, 但是那一條線路是我們這兒給外面的人連上來用的... 不太方便拿來測試... 所以沒有多的線路可以試驗.... 目前只試過 2 條線路...
-
我不大了解您這個 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
##### 引文結束 ######
請問一下,是否是這樣呢?
-
沒錯, 就是把那段 ip rule 移除, 讓所有的封包都走 main 的 default 那個路徑.
只是.... 今天發現如果移除那一段, 有時候連出會頓一下, 好像突然出不去的感覺, 加上之後又正常了.... 因為很少直接由那台機器傳送資料, 所以只好加回去..
這個目前還想不出來為什麼... :-(
-
沒錯, 就是把那段 ip rule 移除, 讓所有的封包都走 main 的 default 那個路徑.
只是.... 今天發現如果移除那一段, 有時候連出會頓一下, 好像突然出不去的感覺, 加上之後又正常了.... 因為很少直接由那台機器傳送資料, 所以只好加回去..
這個目前還想不出來為什麼... :-(
可是,這樣子之後,所有封包變成只會走同樣一個路徑耶! 並沒有您所說的,將兩條頻寬整合在一起... 因為啊~ 就小弟的環境而言,使用您的Script之後,兩個moden只會有一個有反應,另外一個則是一直處於沒事幹的情況底下....
小弟也檢查過了,在kernel那方面,已經將您在文章中所提到的部分全部開啟,並且都是選擇「Yes」;也已經將iproute更新到2.4.7-1的版本了..
請幫忙看一看,還有甚麼地方是小弟疏忽掉的,謝謝!
-
代碼:
# ?#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 的部份還是要留著
-
沒錯, 就是把那段 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 那條線路給外面的人連上來使用, 所以並沒有這個需求, 所以對我們目前沒有影響. 我也沒有別的線路可以測試... 所以, 如果你的環境與我的不同時, 可能只能自己試試了..
-
只移除 ip rule 的部份 ,ip route add 的部份還是要留著
沒有差別, 反正沒有 rule 指定到那個 table.
-
大家好!
經過小弟這幾天來瘋狂的實驗結果,發現,只要在編譯核心的時候,將那個「ecmp」的patch加入,將會導致系統不穩定的因素產生... 至少,在小弟的主機上(Dual-P!!!,VIA 694X主機板)會發生開機時必定當機的結果....
難道,那個patch還有分系統的嗎?
此致
-
大家好!
經過小弟這幾天來瘋狂的實驗結果,發現,只要在編譯核心的時候,將那個「ecmp」的patch加入,將會導致系統不穩定的因素產生... 至少,在小弟的主機上(Dual-P!!!,VIA 694X主機板)會發生開機時必定當機的結果....
難道,那個patch還有分系統的嗎?
此致
請問您的 [ecmp] 是指 equailze 的 path 嗎,我的 Dual-XP1800+ 也會當
-
大家好!
經過小弟這幾天來瘋狂的實驗結果,發現,只要在編譯核心的時候,將那個「ecmp」的patch加入,將會導致系統不穩定的因素產生... 至少,在小弟的主機上(Dual-P!!!,VIA 694X主機板)會發生開機時必定當機的結果....
難道,那個patch還有分系統的嗎?
此致
請問您的 [ecmp] 是指 equailze 的 path 嗎,我的 Dual-XP1800+ 也會當
沒錯耶! 還是說,對雙CPU過敏? 請問有沒有人用單顆處理器嘗試一下下好了...!!
沒想到,我們兩個都卡在同一個地方了.... @@"
-
Firewall是不是很操CPU,
為何大家都用雙CPU的板子,
我看很多Firewall版本,
都只說支援1個CPU而已!
VPN也不需要這麼快吧!
-
沒錯耶! 還是說,對雙CPU過敏? 請問有沒有人用單顆處理器嘗試一下下好了...!!
沒想到,我們兩個都卡在同一個地方了.... @@"
這個問題可以試試 kernel-2.4.19pre8 看看,好像是 ECMP 在 SMP 上處理會有些問題。
詳細請參考 LARTC 的 mail list
http://mailman.ds9a.nl/pipermail/lartc/2002q3/004354.html
這個 thread 的討論
最近自己也想來試試看了....^__^
-
這幾天想了想, 發現原本指定 from 各自的 ip 走各自的線路, 雖然可以解決有時連線會一頓一頓的問題, 不過總是怪怪的...
昨天把 rule 改為 to 那個 subnet 才走那條線路後, 似乎就正常多了...
可以試試看.
# 設定 HiNet routing
#=> ip rule add from $EXT_IP1 lookup 201 移除
#加上
ip rule add to $EXT_IP1/$EXT_MASK1 lookup 201
ip route add default via $GW1 dev $EXT_IF table 201
# 設定 SeedNet routing
#=> ip rule add from $EXT_IP2 lookup 202
#加上
ip rule add to $EXT_IP2/$EXT_MASK2 lookup 201
ip route add default via $GW2 dev $EXT_IF table 202
另外, 超過兩條線路的時候, 有在 google 看過有人以前問過, 不過沒有回應...
-
twu2大大,kernel 加上另外的 patch 已經不在了...
可否提供新的檔案位址,或 e-mail 給我呢!謝謝!
-
到這兒抓吧.
http://www.teatime.com.tw/~tommy/linux/equalize.patch
-
我把我前幾天重寫的有關 multipath 的 script 登出來吧,因為前面寫的 script
是針對固定制的 adsl 如果您的兩條或兩條以上用的是 pppoe 的方式便不能使用
所以我重寫如下
#!/bin/bash
#
IPTABLES=/sbin/iptables
LSMOD=/sbin/lsmod
GREP=/bin/grep
AWK=/bin/awk
SED=/bin/sed
IFCONFIG=/sbin/ifconfig
ECHO=/bin/echo
IP=/sbin/ip
LS=/bin/ls
#
declare -i j
#
interfaces=$($IFCONFIG | $GREP 'ppp' | $AWK '{print $1}')
DEFGW='/sbin/ip route replace'
#
# delete old rule table
#
rulelist=$($IP rule list | $AWK '{print $5}' | grep 1 )
#
for i in $rulelist ; do
OLDIP="`$IP rule show | $GREP $i | $AWK '{print $3}'`"
$IP rule del pref $i from $OLDIP table $i
done
#
#
#
for i in $interfaces ; do
IPPPP="`$IFCONFIG $i | $GREP 'inet addr' | $AWK '{print $2}' | $SED -e 's/.*://'`"
GWPPP="`$IFCONFIG $i | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"
j="`$IFCONFIG $i | $GREP 'ppp' | $AWK '{print $1}' | $SED -e 's/.*p//'`"
j=j+160
# set rule
$IP rule add pref $j from $IPPPP table $j
# set default gw
$IP route replace default via $GWPPP dev $i table $j
$IP route list table $j
DEFGW=$DEFGW' nexthop via '$GWPPP' dev '$i
done
$DEFGW
這樣就可以用了,不管用幾條計時的都可以,還是試過,將Hinet提供的4個計時ip全部取得也可以用喔
-
再補充一下,前面的 script 是假定所使用的
rule number 從 160 開始,
route table 的 number 也是 設為 160 ,table name 也是 160
這樣程式才可以簡化到如此
-
對不起,再補充一點,因為 pppoe 平均每 24小時都會斷線重來,所以您必需把上面的 script 建一個檔,然後在
/etc/ppp/ip-up.local
/etc/ppp/ip-down.local
中加入
這樣就可以在, pppoe 重新取得 ip 後,自動執行這個 script 一次,重新幫您訂 rule 和 route table 了
還有就是,以上的設定,我只有在 RedHat 7.3 / 8.0 / 9.0 中試用,其他的就要您們自己改了
另,我還沒有加 equlize 這個 patch
-
再請問大大一個問題...
如果用三張網卡(兩張對外,一張對內)
那 iptables 要如何下 NAT 的部分?
之前電腦有兩張網卡時,是這樣下的
iptables -t nat -A POSTROUTING -o $EXT_IF -s 192.168.7.0/24 -j SNAT --to $EXT_IP
可以下成兩行,在 EXT_IF 和 EXT_IP 分別設成 EXT_IF_1 EXT_IF _2 和 EXT_IP_1 EXT_IP_2 嗎?
謝謝大大的幫忙!
-
關於 ecmp 這個 patch....
我在另一個 thread 有討論過
有位學長是說那個equalize.patch 可以給 2.4.18+ 用
因為我本身是用 2.4.20 (RH 9.0)
所以也抓了那個去用
後來發覺從編後會一直當機, 有時候連login 的畫面都到不了
本來以為是SMP 的關係 (p4 2.4 HT). 後來把 HT disabled 後 重編也一樣有那個問題
只好放棄用equalize 那個參數.(現在用的kernel 是2.4.20 + helper-newnat for 2.4.20)
不過奇怪的事來了, 在編以前我就已經有留下做 ecmp 的 script 設定為開機執行
可是忘記把 equalize 那個參數拿掉. 照理會應該會跳error 出來
不過打ip route list 卻出現這樣的情形......
[root@servidor root]# ip route list
24.232.40.0/24 dev eth1 proto kernel scope link src 24.232.40.69
10.0.0.0/24 dev eth2 scope link
24.232.162.0/24 dev eth0 proto kernel scope link src 24.232.162.9
169.254.0.0/16 dev eth2 scope link
127.0.0.0/8 dev lo scope link
default equalize
nexthop via 24.232.162.1 dev eth0 weight 1
nexthop via 24.232.40.1 dev eth1 weight 1
這就讓我不知其所以然了...... 難到 2.4.20 已經有加入 equalize?
-
這就讓我不知其所以然了...... 難到 2.4.20 已經有加入 equalize?
搞不好會哦.... 最好挖一下 kernel source 下的 documentation...
-
這就讓我不知其所以然了...... 難到 2.4.20 已經有加入 equalize?
搞不好會哦.... 最好挖一下 kernel source 下的 documentation...
能否請學長指點一下那裡有 documentation 可以挖?
之前因為這個問題我有上www.kernel.org 找 2.4.19 跟 2.4.20 的changelog
但是好像都沒有跟equalize 有關係的.....
-
哦,一般是在 /usr/src/linux/documentation 底下。
因為我沒有你的版本,也不確定是否由 eq 相關的內容,用 grep 找一下如何?
要不然,找一找 .config 的內容?
-
這就讓我不知其所以然了...... 難到 2.4.20 已經有加入 equalize?
我記得 redhat 有把 iproute2 加入 equalize 這個參數的樣子。
但是如果 kernel 沒有 equalize patch ,結果是沒有關係的。
-
再請問大大一個問題...
如果用三張網卡(兩張對外,一張對內)
那 iptables 要如何下 NAT 的部分?
之前電腦有兩張網卡時,是這樣下的
iptables -t nat -A POSTROUTING -o $EXT_IF -s 192.168.7.0/24 -j SNAT --to $EXT_IP
可以下成兩行,在 EXT_IF 和 EXT_IP 分別設成 EXT_IF_1 EXT_IF _2 和 EXT_IP_1 EXT_IP_2 嗎?
謝謝大大的幫忙!
我不知道您的寫法,有沒有問題,但是我都是這樣用的
iptables -t nat -A POSTROUTING -o $EXT_IF -s 192.168.7.0/24 -j MASQUERAD
而不是用 -j SNAT --to $EXT_IP
-
我是用fedora的linux
但是不管我怎麼用都沒辦法
請問各位大大有什麼可能問題
請問是不是要用sh來執行他
還是要怎麼做
那幾行是寫在檔案內執行嗎
-
請問一下
像我們用多條ADSL的方法
給一個對內的DHCP
nat的部分要設定什麼嗎
我把iptables的-o的值設定成eth1跟eth2
執行時他跟我說
multiple -o flags not allowed
請問一下是要如何解決
-
你是分兩行來打還是打在同一行?
-
我現在的情形是這樣子
我用ecmp來併兩條adsl
但是用大大的方法
卻完全無法使用
不知道是不是我的設定有問題
我是用fedora core 1的linux系統
我把現在我的內容po上來
請各位大大幫我檢查一下
#!/bin/sh
LAN="eth0"
WAN1="192.168.XXX.4"
WANM1="24"
GW1="192.168.XXX.1"
WAN2="61.62.XXX.129"
WANM2="24"
GW2="61.62.XXX.254"
ip addr add $WAN1/$WANM1 dev $LAN
ip addr add $WAN2/$WANM2 dev $LAN
ip rule add from $WAN1 lookup 201
ip route add default via $GW1 dev $LAN table 201
ip rule add from $WAN2 lookup 202
ip route add default via $GW2 dev $LAN table 202
ip route replace default equalize \
nexthop via $GW1 dev $LAN
nexthop via $GW2 dev $LAN
這是我之前的方法
可是因為無法使用
我就試著把nexthop via $GW1 dev $LAN改成nexthop via $GW1 dev eth1
$GW2 dev eth2
可是也是無法使用
當時我想可能是nat的問題
但是因為我的iptables的nat只是針對一對一的nat
是不是nat也要改呢
所以好像也不能用
只能ping而不能上網
請各位大大能告訴我哪裡還需要設定需要改
感謝感謝
-
這個題目想玩很久了,但一直沒環境來做。
幸得阿忠兄慷慨讚助一條 hinst 固一 adsl ,終於有機會了...
(詳見: http://phorum.study-area.org/viewtopic.php?t=20673 )
為了方便日後討論,我不想另開主題了。
基本上我也是照著 twu2 兄的文件來做的,不過環境有點不一樣:
/\__/\__/\
,--| internet |--.
/ \/--\/--\/ \
| |
| |
[seednet ADSL] [hinet ADSL]
(非固定) (固一)
| 220.130.96.254
[ ip share ] |
192.168.100.1 |
| |
192.168.100.2 220.130.96.21
+----------------------------------+
| (eth1) (eth0) |
| kernel 2.4.23 |
+----------------------------------+
(my linux box RH9.0)
我是下載 2.4.23 的 kernel 及 equalize.patch 這個 patch 回來 compile 的。
(細節請自行解決)
不過,用 twu2 兄的 script 實作不起來,後來再重看『 Linux 平台上之 Multipath Routing 應用』
http://www.study-area.org/tips/m_routing.htm
將 script 改為如下:
#!/bin/bash
#-- hinet (fixed) ---#
EXT_IF0=eth0
EXT_IP0=220.130.96.21
EXT_MASK0=24
EXT_NET0=220.130.96.0
EXT_BRD0=220.130.96.255
EXT_GW0=220.130.96.254
#-- seednet (dialup) via ip share --#
EXT_IF1=eth1
EXT_IP1=192.168.100.2
EXT_MASK1=24
EXT_NET1=192.168.100.0
EXT_BRD1=192.168.100.255
EXT_GW1=192.168.100.1
#-- define tables --#
TB0=10
TB1=20
#-- config interfaces --#
ip addr flush dev $EXT_IF0
ip addr flush dev $EXT_IF1
ip addr add $EXT_IP0/$EXT_MASK0 broadcast $EXT_BRD0 dev $EXT_IF0
ip addr add $EXT_IP1/$EXT_MASK1 broadcast $EXT_BRD1 dev $EXT_IF1
#-- config routing --#
ip rule add pref 10 from $EXT_IP0 table $TB0
ip route add default table $TB0 via $EXT_GW0
ip rule add pref 20 from $EXT_IP1 table $TB1
ip route add default table $TB1 via $EXT_GW1
ip route add $EXT_NET0/$EXT_MASK0 dev $EXT_IF0
ip route add $EXT_NET1/$EXT_MASK1 dev $EXT_IF1
#-- apply routing --#
ip route replace default equalize \
nexthop via $EXT_GW0 dev $EXT_IF0 weight 2 \
nexthop via $EXT_GW1 dev $EXT_IF1 weight 1
#-- flushing cache --#
ip route flush cache
exit 0
嗯... 這樣可以連線到外面了,不過,問題狀況如下:
我用 ftp 來測試對外 upload ,
發現 packets 都是走 hinet 出去,也就是第一條 routing ...
(我是用 tcpdupm -i any 來看的)。
若將 weight 從 2 改為 1 ,那就只會走其中的一條,且是最前面一條 routing 。
(我試過互換行順了...)
因為才玩一會(今天開始),目前還在測試中...
且斷線偵測部份我還沒 try ,等有心得再回來報告。
(日後我會另外整理較為詳細的報告給大家)
-
N老, 期待你在2.6.x版本上的實驗啊!
-
這個題目想玩很久了,但一直沒環境來做。
#!/bin/bash
ip route replace default equalize \
nexthop via $EXT_GW0 dev $EXT_IF0 weight 2 \
nexthop via $EXT_GW1 dev $EXT_IF1 weight 1
嗯... 這樣可以連線到外面了,不過,問題狀況如下:
我用 ftp 來測試對外 upload ,
發現 packets 都是走 hinet 出去,也就是第一條 routing ...
(我是用 tcpdupm -i any 來看的)。
若將 weight 從 2 改為 1 ,那就只會走其中的一條,且是最前面一條 routing 。
(我試過互換行順了...)
equalize -> 已經做在 kernel 裡面了嗎 ?? 如果 kernel 已經內含了,這樣是有問題的,如果還是要另外加 patch 那您測出來的現象算是正常的
另我看您的架構,非固定的那一條 adsl 有過 ip share , 將來在寫斷線偵測會比較難寫
-
哦,感謝 Kuolung 兄﹗
我試過沒 patch 也試過有 patch ,
( 抓 http://www.teatime.com.tw/~tommy/linux/equalize.patch )
結果都一樣... >_<
倒是改了你的 script 來用,感覺蠻好的:
#!/bin/bash
#
IPTABLES=/sbin/iptables
LSMOD=/sbin/lsmod
GREP=/bin/grep
AWK=/bin/awk
SED=/bin/sed
CUT=/bin/cut
WC=/usr/bin/wc
SEQ=/usr/bin/seq
IFCONFIG=/sbin/ifconfig
ECHO=/bin/echo
IP=/sbin/ip
LS=/bin/ls
#-- define fixed interface & gateway --#
fixed_if="eth0 eth1"
#-- format: if:gw:weight --#
fixed_gw="eth0:220.130.96.254:1 eth1:192.168.100.1:1"
#-- determine active interfaces --#
interfaces=$($IFCONFIG | $GREP -E 'ppp|eth' | $AWK '{print $1}')
DEFGW='/sbin/ip route replace'
#-- define table_id --#
init_num=10
offset=`$ECHO -e "${interfaces// /\n}" | $WC -l`
last_num=$(($init_num + $((offset * 10)) ))
tb_num=`$SEQ $init_num 10 $last_num | xargs echo`
#-- delete old rule table --#
$IP rule list | $GREP -E `$ECHO ${tb_num// /|} | $SED 's/[^|][^|]*/^&:/g'` \
| while read line; do
TABID=`echo $line | awk -F: '{print $1}'`
OLDIP=`echo $line | awk '{print $3}'`
PREID=`echo $line | awk '{print $5}'`
$IP rule del pref $PREID from $OLDIP table $TABID
done
#-- FUNCTION: determine gw --#
dgw() {
#-- for fixed if --#
if $ECHO "$fixed_if" | $GREP -wq $1 ; then
GWIP=`$ECHO -e "${fixed_gw// /\n}" | $GREP "^$1:" | $CUT -d: -f2`
WEIGHT=`$ECHO -e "${fixed_gw// /\n}" | $GREP "^$1:" | $CUT -d: -f3`
#-- for ppp if --#
elif $ECHO $1 | $GREP -q ppp ; then
GWIP="`$IFCONFIG $i | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"
#-- for unkown, point back to itself --#
else
GWIP=$IFIP
fi
}
#-- config rule & routing --#
for i in $interfaces ; do
IFIP="`$IFCONFIG | $GREP -w -A1 $i | $AWK '/inet/{print $2}' | $SED -e 's/.*://'`"
dgw $i
[ "$tb_num" ] && tb_id=${tb_num%% *}
# set rule
$IP rule add pref $tb_id from $IFIP table $tb_id
# set default gw
$IP route replace default via $GWIP dev $i table $tb_id
DEFGW=$DEFGW" nexthop via $GWIP dev $i weight ${WEIGHT:=1}"
tb_num=${tb_num#* }
done
#-- apply routubg --#
$DEFGW
#-- flush cache --#
$IP route flush cache
#-- show routing
$IP route list
#-- FINISH --#
exit 0
-
說一下我自己之前實作時候遇到的心得:
我的環境跟 netman 雷同,一邊通往 gateway box再通往固接 ADSL;
一邊透過 pppoe 撥接上 ADSL。
1.iproute 可以下 equalize 參數成功並不代表 kernel 部分已有 equalize (outbound load sharing by packets) 的修補。
2.equalize 的 patch 之所以沒進 official Linux kernel,我在一次連上酷學園時終於明白了~對方會沒法紀錄你到底是從那個 IP 來。造成明明登入了,過不久就認為你又登出了。
3.若該台 gateway 本身所出去的也要 by session 分流。請注意之前所post 的 scripts or commands 都少了一段 routing 設定。所以才會有一頓一頓的現象。請跟 LARTC.org 原文的 4.2 那段範例比對一下,就可以知到囉。
-
請問 JR 兄: 不知如何確認 kernel 呢?
-
請問 JR 兄: 不知如何確認 kernel 呢?
在套用那個 equalize patch 成功後,如果沒有 errors 就應該有 patch 進 kernel..
可以看一下那個 patch file,
它 patch (diff) 哪些檔案,去 vi 再確認已經改過的即可。
如下片段則看 你的 kernel source dir/net/ipv4/udp.c
有沒有改成有 + 號開頭的那幾行。
diff -urN linux-2.4.18-clean/net/ipv4/udp.c linux-2.4.18/net/ipv4/udp.c
--- linux-2.4.18-clean/net/ipv4/udp.c Mon Feb 25 20:38:14 2002
+++ linux-2.4.18/net/ipv4/udp.c Thu Mar 21 20:48:07 2002
@@ -740,6 +740,14 @@
sk->state = TCP_ESTABLISHED;
sk->protinfo.af_inet.id = jiffies;
+ #ifdef CONFIG_IP_ROUTE_MULTIPATH
+ if(rt->rt_flags&RTCF_EQUALIZE) {
+ ip_rt_put(rt);
+ sk->dst_cache=NULL;
+ }
+ else
+ #endif
+
sk_dst_set(sk, &rt->u.dst);
return(0);
}
-
2.equalize 的 patch 之所以沒進 official Linux kernel,我在一次連上酷學園時終於明白了~對方會沒法紀錄你到底是從那個 IP 來。造成明明登入了,過不久就認為你又登出了。
3.若該台 gateway 本身所出去的也要 by session 分流。請注意之前所post 的 scripts or commands 都少了一段 routing 設定。所以才會有一頓一頓的現象。請跟 LARTC.org 原文的 4.2 那段範例比對一下,就可以知到囉。
1、這就是我後來都不再自己 patch 那個 equalize 的原因了,雖然 patch 過後,upload 可以合併頻寬到 by pocket,但我想大部份的應用,到 by session 就夠了.
2、可否列出 LARTC.org 的那段文章的網址
-
如下片段則看 你的 kernel source dir/net/ipv4/udp.c
有沒有改成有 + 號開頭的那幾行。
diff -urN linux-2.4.18-clean/net/ipv4/udp.c linux-2.4.18/net/ipv4/udp.c
--- linux-2.4.18-clean/net/ipv4/udp.c Mon Feb 25 20:38:14 2002
+++ linux-2.4.18/net/ipv4/udp.c Thu Mar 21 20:48:07 2002
@@ -740,6 +740,14 @@
sk->state = TCP_ESTABLISHED;
sk->protinfo.af_inet.id = jiffies;
+ #ifdef CONFIG_IP_ROUTE_MULTIPATH
+ if(rt->rt_flags&RTCF_EQUALIZE) {
+ ip_rt_put(rt);
+ sk->dst_cache=NULL;
+ }
+ else
+ #endif
+
sk_dst_set(sk, &rt->u.dst);
return(0);
}
看到了,都有...
不過還沒試出來... >_<
看來還要努力了﹗
-
啊.... 總算知道問題了: 是測試方法不夠嚴謹...
跟據 JR 兄提示,重讀如下文章:
http://www.lartc.org/howto/lartc.rpdb.multiple-links.html
在最後一段有提到:
Note that balancing will not be perfect, as it is route based, and routes are cached. This means that routes to often-used sites will always be over the same provider.
也就是說,因為 routing cache 的關係,通往同一個 site 的 routing 可能在某一段時間內是不變的。
我前面只測同一個 site ,因此沒發現有差。
剛再試另一個 site ,就有起用另一條 routing 了....
我是用 scp 分別上傳 kernel tarball 到兩台主機來試的...
13:45:19.602314 220.130.96.21.32772 > 140.113.27.184.ssh: . 56473:57921(1448) ac
k 0 win 10208 <nop,nop,timestamp 86857 1315489055> (DF) [tos 0x8]
13:45:19.602323 220.130.96.21.32772 > 140.113.27.184.ssh: . 57921:59369(1448) ac
k 0 win 10208 <nop,nop,timestamp 86857 1315489055> (DF) [tos 0x8]
13:45:19.664264 163.16.1.199.ssh > 192.168.100.2.32773: . ack 3301366857 win 639
20 <nop,nop,timestamp 828945993 86821> (DF) [tos 0x8]
13:45:19.671925 140.113.27.184.ssh > 220.130.96.21.32772: . ack 4345 win 56472 <
nop,nop,timestamp 1315489062 86719> (DF) [tos 0x8]
13:45:19.671939 220.130.96.21.32772 > 140.113.27.184.ssh: . 59369:60817(1448) ac
k 0 win 10208 <nop,nop,timestamp 86864 1315489062> (DF) [tos 0x8]
13:45:19.707740 140.113.27.184.ssh > 220.130.96.21.32772: . ack 5793 win 57920 <
nop,nop,timestamp 1315489066 86729> (DF) [tos 0x8]
13:45:19.707754 220.130.96.21.32772 > 140.113.27.184.ssh: . 60817:62265(1448) ac
k 0 win 10208 <nop,nop,timestamp 86867 1315489066> (DF) [tos 0x8]
13:45:19.707762 220.130.96.21.32772 > 140.113.27.184.ssh: . 62265:63713(1448) ac
k 0 win 10208 <nop,nop,timestamp 86867 1315489066> (DF) [tos 0x8]
13:45:19.725429 163.16.1.199.ssh > 192.168.100.2.32773: P 0:48(48) ack 1361 win
63920 <nop,nop,timestamp 828945998 86821> (DF) [tos 0x8]
13:45:19.725630 192.168.100.2.32773 > 163.16.1.199.ssh: P 1361:1425(64) ack 48 w
in 9568 <nop,nop,timestamp 86869 828945998> (DF) [tos 0x8]
不難看出在同一時間內:
1) to 140.113.27.184 走 220.130.96.21
2) to 163.16.1.199 走 192.168.100.2
okay,接下來是斷線測試... ^_^
-
啊.... 總算知道問題了: 是測試方法不夠嚴謹...
跟據 JR 兄提示,重讀如下文章:
http://www.lartc.org/howto/lartc.rpdb.multiple-links.html
在最後一段有提到:
Note that balancing will not be perfect, as it is route based, and routes are cached. This means that routes to often-used sites will always be over the same provider.
也就是說,因為 routing cache 的關係,通往同一個 site 的 routing 可能在某一段時間內是不變的。
我前面只測同一個 site ,因此沒發現有差。
上面這一段說明是指沒有加 equalize 這個 patch 的情況,而您的 kernel 是有加 patch 情況是不一樣的
-
那我就不明了,因為 patch 很確定已加了... 且你提到的那幾行我也確認了...
-
okay,今天我有空,再抓了 2.4.25 的 kernel ,
還有如下這個 patch :
http://www.ssi.bg/~ja/patch-2.4.25-ja2.diff
在我的 rh9.0 上編譯,以成功得做到 session base 的路由了﹗^_^
之前只能做到 destination base 的路由,也就是:
--- 通往同一個 site 的 routing 可能在某一段時間內是不變的。
現在已經沒問題了,且後面的 NAT client 也可以出去...
我是用上面最後改自 kuoluang 兄的 script 來跑的。
接下來,我再寫個斷線偵測的 script ,
再下下來,應是寫 ddns 來做 inbound 的 traffic 。
大家還有啥點子,請提出來一起研究吧...
-
okay,今天我有空,再抓了 2.4.25 的 kernel ,
還有如下這個 patch :
http://www.ssi.bg/~ja/patch-2.4.25-ja2.diff
在我的 rh9.0 上編譯,以成功得做到 session base 的路由了﹗^_^
之前只能做到 destination base 的路由,也就是:
--- 通往同一個 site 的 routing 可能在某一段時間內是不變的。
現在已經沒問題了,且後面的 NAT client 也可以出去...
我是用上面最後改自 kuoluang 兄的 script 來跑的。
接下來,我再寫個斷線偵測的 script ,
再下下來,應是寫 ddns 來做 inbound 的 traffic 。
大家還有啥點子,請提出來一起研究吧...
1. 我再重新去看了一下,您的架構,要寫斷線偵測,可能會比較不好寫喔 !!
2. 根據我上次的測試,如果改好用 load balancing by pockage , 我想 inbound traffic 就不是那麼重要了
-
關於斷線偵測,我初步想到就是:
1) 將 ISP router 設為 static route
2) 用 ping
不知可行否?
(我還沒開使寫... ^_^ )
-
okay,斷線的 script(假設命名為 chk_ip.sh) 總算寫好了,
後面我再將 code 貼出來請大家幫忙 debug ...
不過,這支 script 必需跟我前一個 script (假設命名為 run_ip.sh) 配搭一起使用才行。
當然,run_ip.sh 我也動了點小手術(有興趣的人自己用 diff 找吧),我也會將 code 貼在後面。
我先說明一下我的測試換境,基本上與我之前說的沒差太多,
不過,原本的 seednet adsl 是五個 IP 撥接的,
除了之前透過 ip share 來使用外,我再起了另外一個 ppp0 界面。
如此環境,基本上能夠分別測試到如下這幾種連線方式:
* 固接(固定 IP)
* 撥接(非固定 IP)
* ip share(非固定 IP)
見圖:
/\__/\__/\
,--| internet |--.
/ \/--\/--\/ \
| |
| |
+--[seednet ADSL] [hinet ADSL]
| (非固定) (固一)
| | 220.130.96.254
| [ ip share ] |
| 192.168.100.1 |
| | |
| 192.168.100.2 220.130.96.21
| +----------------------------------+
+---| (eth1) (eth0) |
ppp0| kernel 2.4.23 |
+----------------------------------+
(my linux box RH9.0)
雖然,撥接adsl 都是同一設備,或許還不十分理想,目前也只能如此了...
我採用的是拔線的方式來測斷線的,暫還沒想到其他方式,或許大家可以幫忙想想的...
我的測試基本上是用 ping 來做:
* 若是 ppp 或不指定測試目標,我會用 next hop 來測。
* 否則,我會用 traceroute 找出 ISP 端機房的 router ip ,
而不用 next hop ,是因為怕不準,比方說斷線是外部線路之類的。
若大家有更好提意,也歡迎提供....
好了,我目前所用的 code 如下:
chk_ip.sh :
#!/bin/bash
#
INTERVAL=5 # check time interval in seconds
RUN_SCRIPT=./run_ip.sh # script to run ip route
#-- define fixed ping destination --#
#-- tips: doing a traceroute may help you find out the proper target.
#-- format: if:dest:gw --#
fixed_dest="eth0:168.95.38.194:220.130.96.254 eth1:139.175.169.254:192.168.100.1"
#-- determine gateways --#
get_gw () {
defaults=$(ip route show | sed -n '/default/,$p' | grep via)
if_n_gw=$(echo -en "$defaults" | awk '{print $5":"$3}')
}
#-- configure static route --#
s_route () {
cmd=$1
for i in $fixed_dest; do
if=${i%%:*}
dest=$(echo -$i | cut -d: -f2)
gw=${i##*:}
ip route $cmd $dest via $gw
done
unset i
}
#-- determine destinations --#
get_dest () {
[ -n "$_if" ] && all_pair=$(echo "$if_n_gw" | grep -Ev "${_if// /|}")
all_pair=$(echo $fixed_dest $all_pair)
a_dest=$(echo -en "${all_pair// /\n}" | cut -d: -f2)
}
#-- determine dead destinations --#
get_dev () {
for i in $a_dest; do
ping -c1 -w2 $i &>/dev/null || {
echo -en "${all_pair// /\n}" | grep $i | cut -d: -f1
}
done
unset i
}
#-- main --#
main () {
get_gw # have gw
s_route replace # set static route
get_dest # have destination
d_dev=$(echo $(get_dev)) # have dead link
s_route del # remove static route
}
#-- run loop --#
while : ; do
$RUN_SCRIPT -d "$d_dev"
sleep $INTERVAL
main
unset _if _dest _gw all_pair
done
run_ip.sh:
#!/bin/bash
#
IPTABLES=/sbin/iptables
LSMOD=/sbin/lsmod
GREP=/bin/grep
AWK=/bin/awk
SED=/bin/sed
CUT=/bin/cut
WC=/usr/bin/wc
SEQ=/usr/bin/seq
IFCONFIG=/sbin/ifconfig
ECHO=/bin/echo
IP=/sbin/ip
LS=/bin/ls
#-- define fixed interface & gateway --#
fixed_if="eth0 eth1"
#-- format: if:gw:weight --#
fixed_gw="eth0:220.130.96.254:1 eth1:192.168.100.1:1"
#-- define internal interface, or comment out for none --#
int_if="eth2"
#-- define dead interface --#
while getopts "d:" opt; do
case $opt in
d) dead_dev=$OPTARG ;;
esac
done
#-- determine active interfaces --#
interfaces=$($IFCONFIG | $GREP -E 'ppp|eth' | $AWK '{print $1}')
if [ -n "$dead_dev" ]; then
interfaces=$(echo -e "${interfaces// /\n}"|grep -Ev "${dead_dev// /|}")
fi
DEFGW='/sbin/ip route replace'
#-- define table_id --#
init_num=10
offset=`$ECHO -e "${interfaces// /\n}" | $WC -l`
last_num=$(($init_num + $((offset * 10)) ))
tb_num=`$SEQ $init_num 10 $last_num | xargs echo`
#-- delete old rule table --#
$IP rule list | $GREP -E `$ECHO ${tb_num// /|} | $SED 's/[^|][^|]*/^&:/g'` \
| while read line; do
TABID=`echo $line | awk -F: '{print $1}'`
OLDIP=`echo $line | awk '{print $3}'`
PREID=`echo $line | awk '{print $5}'`
$IP rule del pref $PREID from $OLDIP table $TABID
done
#-- FUNCTION: determine gw --#
dgw() {
#-- for fixed if --#
if $ECHO "$fixed_if" | $GREP -wq $1 ; then
GWIP=`$ECHO -e "${fixed_gw// /\n}" | $GREP "^$1:" | $CUT -d: -f2`
WEIGHT=`$ECHO -e "${fixed_gw// /\n}" | $GREP "^$1:" | $CUT -d: -f3`
#-- for ppp if --#
elif $ECHO $1 | $GREP -q ppp ; then
GWIP="`$IFCONFIG $i | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"
#-- for unkown, point back to itself --#
else
GWIP=$IFIP
fi
}
#-- config rule & routing --#
for i in $interfaces ; do
IFIP="`$IFCONFIG | $GREP -w -A1 $i | $AWK '/inet/{print $2}' | $SED -e 's/.*://'`"
dgw $i
[ "$tb_num" ] && tb_id=${tb_num%% *}
# set rule
$IP rule add pref $tb_id from $IFIP table $tb_id
# set default gw
$IP route replace default via $GWIP dev $i table $tb_id
echo "$int_if" | grep -qw "$i" || {
DEFGW=$DEFGW" nexthop via $GWIP dev $i weight ${WEIGHT:=1}"
}
tb_num=${tb_num#* }
done
#-- apply routing --#
$DEFGW
#-- flush cache --#
$IP route flush cache
#-- show routing
$IP route list
#-- FINISH --#
exit 0
歡迎測試,及 debug .... ^_^
-
大家好﹗
我目前在做 ddns 測試,script 差不多完成了,但有一個小功能要請大家幫忙。
也就是幫忙寫一個類似如下的 php 程式,讓我可以放在 dns 的 web server 上:
http://www.chainfar.com/ip.php
以判斷 client 端的外部 IP ,
若能判斷出 proxy 代理後的 IP 更好。謝謝﹗
詳情見:
http://phorum.study-area.org/viewtopic.php?p=108638
-
okay, ddns 這部份算是完成了... ^_^
關於 ddns server 與 client 的設定,請另行參考:
http://www.study-area.org/tips/ddns.htm
這裡不再重複...
我目前使用的 ddns.sh 的 code 如下:
#!/bin/bash
#
# set variables
if echo $0 | grep '^/' ; then
w_dir=${0%/*}
else
w_dir=$PWD/${0%/*}
fi
KEY_FILE=$w_dir/Khome.+157+36043.key
UPDATE_DATA=$w_dir/nsupdate.data
UPDATE_OLD=$UPDATE_DATA.old
HOST_NAME=home.study-area.org
NS_SERVER=study-area.ks.edu.tw
IP_SERVER=www.study-area.org
IP_SERVER_IP=$(echo $(host $IP_SERVER) | awk '{print $NF}')
IP_URL="http://$IP_SERVER/ip.php"
CLIENT_IP="client"
#CLIENT_IP="proxy"
MASQ_IF="eth1"
# ensure key files
for file in $KEY_FILE ${KEY_FILE%key}private
do
if [ ! -r $file ]; then
echo "$(basename $0): ERROR: $file is not readable."
exit 1
fi
done
# ensure the server is connectable
host $NS_SERVER $NS_SERVER | grep "$NS_SERVER" &>/dev/null || {
echo "$(basename $0): ERROR: could not contact nameserver $NS_SERVER."
exit 2
}
# prepare initial script
cat >| $UPDATE_DATA <<END
server $NS_SERVER
update delete $HOST_NAME A
END
test "$?" = "0" || {
echo "$(basename $0): ERROR: could not create $UPDATE_SCR."
exit 3
}
# get interfaces
ALL_IF=$(ip route show | sed -n '/default/,$p' | awk '/nexthop/{print $5}')
# get masqueraded ip
get_mip () {
for M_IF in $MASQ_IF; do
echo $ALL_IF | grep -qw "$M_IF" || continue
m_gw=$(ip route show | sed -n '/default/,$p' |\
awk '/'$M_IF'/{print $3}')
ip route replace $IP_SERVER_IP via $m_gw
M_IP=$(lynx --dump $IP_URL | grep "$CLIENT_IP" |\
grep -Eo '([0-9]{1,3}\.){3}[0-9]+')
[ -z "$M_IP" ] && {
echo "${0##*/}: Error: can't determine IP for $M_IF."
exit 4
}
echo $M_IF:$M_IP
ip route del $IP_SERVER_IP via $m_gw
unset m_gw M_IP
done
}
# get current ip
for IF in $ALL_IF; do
if echo "$MASQ_IF" | grep -wq "$IF"; then
NEW_IP=$(get_mip | awk -F: '/'$IF'/{print $2}')
else
NEW_IP=$(ip address show dev $IF | awk '/inet/{print $2}')
fi
echo "update add $HOST_NAME 0 A ${NEW_IP%/*}"
unset NEW_IP
done >> $UPDATE_DATA
echo "send" >> $UPDATE_DATA
# do a test then update
touch $UPDATE_OLD
if ! diff $UPDATE_DATA $UPDATE_OLD; then
/usr/bin/nsupdate -k $KEY_FILE -v $UPDATE_DATA && {
mv $UPDATE_DATA $UPDATE_OLD
}
fi
#-- end of script --#
將這段 code 與其他 dns Key 放進一個叫 ddns 的子目錄後,
再來要修改 chk_ip.sh ,如下:
#!/bin/bash
#
# change working directory
cd ${0%/*}
INTERVAL=5 # check time interval in seconds
RUN_SCRIPT=./run_ip.sh # script to run ip route
DDNS_SCRIPT=./ddns/ddns.sh # script to run ddns update
#-- set commands --#
IP=/sbin/ip
SED=/bin/sed
GREP=/bin/grep
AWK=/bin/awk
CUT=/bin/cut
PING=/bin/ping
#-- define fixed ping destination --#
#-- tips: doing a traceroute may help you find out the proper target.
#-- format: if:dest:gw --#
fixed_dest="eth0:168.95.38.194:220.130.96.254 eth1:139.175.169.254:192.168.100.1"
#-- determine gateways --#
get_gw () {
defaults=$($IP route show | $SED -n '/default/,$p' | $GREP via)
if_n_gw=$(echo -en "$defaults" | $AWK '{print $5":"$3}')
}
#-- configure static route --#
s_route () {
cmd=$1
for i in $fixed_dest; do
if=${i%%:*}
dest=$(echo -$i | $CUT -d: -f2)
gw=${i##*:}
$IP route $cmd $dest via $gw
done
unset i
}
#-- determine destinations --#
get_dest () {
[ -n "$_if" ] && all_pair=$(echo "$if_n_gw" | $GREP -Ev "${_if// /|}")
all_pair=$(echo $fixed_dest $all_pair)
a_dest=$(echo -en "${all_pair// /\n}" | $CUT -d: -f2)
}
#-- determine dead destinations --#
get_dev () {
for i in $a_dest; do
$PING -c1 -w2 $i &>/dev/null || {
echo -en "${all_pair// /\n}" | $GREP $i | $CUT -d: -f1
}
done
unset i
}
#-- main --#
main () {
get_gw # have gw
s_route replace # set static route
get_dest # have destination
d_dev=$(echo $(get_dev)) # have dead link
s_route del # remove static route
}
#-- run loop --#
while : ; do
$RUN_SCRIPT -d "$d_dev"
sleep $INTERVAL
main
$DDNS_SCRIPT
unset _if _dest _gw all_pair
done
接下來就是將 ./chk_ip.sh 跑起來,然後"拔線"測試囉.... ^_^
歡迎回報錯誤﹗
-
okay,我已將這次實作用的 script 及 ddns key 包好在如下這個 tarball :
http://www.study-area.org/linux/src/multipath.tgz
有興趣的朋友可抓回去玩玩看... 當然,若能提出改良建議更好﹗ ^_^
-
最後,關於本次實作文件,整理如下:
http://www.study-area.org/tips/multipath.htm
歡迎修訂。
-
再補一篇資料給大家參考:
http://peterkim.cgucccc.org/document/MPath.html
-
再補一篇資料給大家參考:
http://peterkim.cgucccc.org/document/MPath.html
我看完了,覺得,其中有一句話寫錯了
"ISP 會收到發出 IP 非自己網段的路由封包因而 Drop 掉的問題。"
在最後一段,討論 by session 和 by packet 這一句是錯的,理論上是不會發生這樣的情況的
-
關於 ddns server 與 client 的設定,請另行參考:
http://www.study-area.org/tips/ddns.htm
這裡不再重複...
連結開不起來耶 ~
-
line1 line2
| |
| |
| |
| |
______________________s/w1
|
|
---------
| |
| |
---------
|
|
---------------------------------s/w2
|
|
|
PC
請問netman學長
我想將架構改成以上圖示
試過多種版本的ip rule setting都無法成功
(但我一張網卡接一條線路的方式是可行的)
可否指點小弟哪裡該注意的
感機不盡
-
你可用 ip 命令在同一個 if 上設多個 address 哦,試試看...
-
你可用 ip 命令在同一個 if 上設多個 address 哦,試試看...
我試過以下指令
ip addr add $EXT_IP1/$EXT_MASK1 dev $EXT_IF
ip addr add $EXT_IP2/$EXT_MASK2 dev $EXT_IF
我其他相關設定長的像這樣
eth0,eth2對外兩路ADSL
eth1對內虛擬IP
echo "1" > /proc/sys/net/ipv4/ip_forward
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
ip rule add pref 10 to 192.168.1.0/24 table 5
ip route add 192.168.1.0/24 table 5 dev eth1
ip rule add pref 20 from 61.61.0.253 table 20
ip route add default table 20 via 61.61.0.254
ip rule add pref 20 from 61.62.0.101 table 30
ip route add default table 40 via 61.62.0.102
ip route replace default nexthop via 61.61.0.254 dev eth0 weight 1 nexthop via 61.62.0.102 dev eth2
用兩個介面(對外)跑以上設定是正常的
但若改成新的架構(一張對內,一張對外)則會有問題
-
你可用 ip 命令在同一個 if 上設多個 address 哦,試試看...
我有試過以下指令
ip addr add $EXT_IP1/$EXT_MASK1 dev $EXT_IF
ip addr add $EXT_IP2/$EXT_MASK2 dev $EXT_IF
我其他相關設定長的像這樣
eth0,eth2對外兩路ADSL
eth1對內虛擬IP
echo "1" > /proc/sys/net/ipv4/ip_forward
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
ip rule add pref 10 to 192.168.1.0/24 table 5
ip route add 192.168.1.0/24 table 5 dev eth1
ip rule add pref 20 from 61.61.0.253 table 20
ip route add default table 20 via 61.61.0.254
ip rule add pref 20 from 61.62.0.101 table 30
ip route add default table 40 via 61.62.0.102
ip route replace default nexthop via 61.61.0.254 dev eth0 weight 1 nexthop via 61.62.0.102 dev eth2
用兩個介面(對外)跑以上設定是正常的
但若改成新的架構(一張對內,一張對外)則會有問題
我沒有上equalize patch
-
為此,我在我的機器上,修改為 cisco3662 兄的環境來測試:
ip route
ip rule
ip rule del pref 10 from 220.130.96.21 table 10
ip rule del pref 20 from 192.168.100.2 table 20
ip rule del pref 40 from 203.70.217.196 table 40
ifdown ppp0
ifdown eth1
ifconfig eth0:0 192.168.100.2
ifconfig
ip rule add pref 10 from 220.130.96.21 table 10
ip rule add pref 20 from 192.168.100.2 table 20
ip route replace default via 220.130.96.254 dev eth0 table 10
ip route replace default via 192.168.100.2 dev eth0 table 20
ip route replace nexthop via 220.130.96.254 dev eth0 weight 1 nexthop via 192.168.100.1 dev eth0 weight 1
ip route
service iptables stop
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
修改後的結果為:
[root@pc2 root]# ip address
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:02:44:84:26:4f brd ff:ff:ff:ff:ff:ff
inet 220.130.96.21/24 brd 220.130.96.255 scope global eth0
inet 192.168.100.2/24 brd 192.168.100.255 scope global eth0:0
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:20:ed:36:f9:74 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:02:b3:4b:69:49 brd ff:ff:ff:ff:ff:ff
inet 10.1.2.3/24 brd 10.1.2.255 scope global eth2
[root@pc2 root]# ip rule
0: from all lookup local
10: from 220.130.96.21 lookup 10
20: from 192.168.100.2 lookup 20
30: from 10.1.2.3 lookup 30
32766: from all lookup main
32767: from all lookup 253
[root@pc2 root]# ip route
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.2
220.130.96.0/24 dev eth0 scope link
10.1.2.0/24 dev eth2 scope link
169.254.0.0/16 dev eth2 scope link
127.0.0.0/8 dev lo scope link
default
nexthop via 220.130.96.254 dev eth0 weight 1
nexthop via 192.168.100.1 dev eth0 weight 1
[root@pc2 root]# iptables-save
# Generated by iptables-save v1.2.7a on Fri Apr 9 16:18:28 2004
*nat
:PREROUTING ACCEPT [108:8447]
:POSTROUTING ACCEPT [30:1997]
:OUTPUT ACCEPT [77:5923]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Fri Apr 9 16:18:28 2004
# Generated by iptables-save v1.2.7a on Fri Apr 9 16:18:28 2004
*filter
:INPUT ACCEPT [756:158143]
:FORWARD ACCEPT [124:10416]
:OUTPUT ACCEPT [674:166960]
COMMIT
# Completed on Fri Apr 9 16:18:28 2004
[root@pc2 root]# cat /proc/sys/net/ipv4/ip_forward
1
然後我在本機起用 ping 168.95.1.1 ,也在後面的 client 也來 ping ...
然後從 tcpdump -ni any 中發現:
16:20:54.186574 10.1.2.4 > 168.95.1.1: icmp: echo request (DF)
16:20:54.186608 220.130.96.21 > 168.95.1.1: icmp: echo request (DF)
16:20:54.225225 168.95.1.1 > 220.130.96.21: icmp: echo reply
16:20:54.225240 168.95.1.1 > 10.1.2.4: icmp: echo reply
16:20:54.739245 192.168.100.2 > 168.95.1.1: icmp: echo request (DF)
16:20:54.824102 168.95.1.1 > 192.168.100.2: icmp: echo reply
已經發現所走的 IP 已經分散了...
且從小烏龜的燈號也看得出來(若停掉其中一個 ping ,燈也跟著滅...)
好了,我想,我已說得夠清楚了吧? ^_^
-
為此,我在我的機器上,修改為 cisco3662 兄的環境來測試:
ip route
ip rule
ip rule del pref 10 from 220.130.96.21 table 10
ip rule del pref 20 from 192.168.100.2 table 20
ip rule del pref 40 from 203.70.217.196 table 40
ifdown ppp0
ifdown eth1
ifconfig eth0:0 192.168.100.2
ifconfig
ip rule add pref 10 from 220.130.96.21 table 10
ip rule add pref 20 from 192.168.100.2 table 20
ip route replace default via 220.130.96.254 dev eth0 table 10
ip route replace default via 192.168.100.2 dev eth0 table 20
ip route replace nexthop via 220.130.96.254 dev eth0 weight 1 nexthop via 192.168.100.1 dev eth0 weight 1
ip route
service iptables stop
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
修改後的結果為:
[root@pc2 root]# ip address
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:02:44:84:26:4f brd ff:ff:ff:ff:ff:ff
inet 220.130.96.21/24 brd 220.130.96.255 scope global eth0
inet 192.168.100.2/24 brd 192.168.100.255 scope global eth0:0
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:20:ed:36:f9:74 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:02:b3:4b:69:49 brd ff:ff:ff:ff:ff:ff
inet 10.1.2.3/24 brd 10.1.2.255 scope global eth2
[root@pc2 root]# ip rule
0: from all lookup local
10: from 220.130.96.21 lookup 10
20: from 192.168.100.2 lookup 20
30: from 10.1.2.3 lookup 30
32766: from all lookup main
32767: from all lookup 253
[root@pc2 root]# ip route
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.2
220.130.96.0/24 dev eth0 scope link
10.1.2.0/24 dev eth2 scope link
169.254.0.0/16 dev eth2 scope link
127.0.0.0/8 dev lo scope link
default
nexthop via 220.130.96.254 dev eth0 weight 1
nexthop via 192.168.100.1 dev eth0 weight 1
[root@pc2 root]# iptables-save
# Generated by iptables-save v1.2.7a on Fri Apr 9 16:18:28 2004
*nat
:PREROUTING ACCEPT [108:8447]
:POSTROUTING ACCEPT [30:1997]
:OUTPUT ACCEPT [77:5923]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Fri Apr 9 16:18:28 2004
# Generated by iptables-save v1.2.7a on Fri Apr 9 16:18:28 2004
*filter
:INPUT ACCEPT [756:158143]
:FORWARD ACCEPT [124:10416]
:OUTPUT ACCEPT [674:166960]
COMMIT
# Completed on Fri Apr 9 16:18:28 2004
[root@pc2 root]# cat /proc/sys/net/ipv4/ip_forward
1
然後我在本機起用 ping 168.95.1.1 ,也在後面的 client 也來 ping ...
然後從 tcpdump -ni any 中發現:
16:20:54.186574 10.1.2.4 > 168.95.1.1: icmp: echo request (DF)
16:20:54.186608 220.130.96.21 > 168.95.1.1: icmp: echo request (DF)
16:20:54.225225 168.95.1.1 > 220.130.96.21: icmp: echo reply
16:20:54.225240 168.95.1.1 > 10.1.2.4: icmp: echo reply
16:20:54.739245 192.168.100.2 > 168.95.1.1: icmp: echo request (DF)
16:20:54.824102 168.95.1.1 > 192.168.100.2: icmp: echo reply
已經發現所走的 IP 已經分散了...
且從小烏龜的燈號也看得出來(若停掉其中一個 ping ,燈也跟著滅...)
好了,我想,我已說得夠清楚了吧? ^_^
抱歉......可能我沒說清楚....事實上我用ping去測試都正常
但就是開網頁時會時好時壞
一頓一頓的...
不曉得netman學長有測到這段嗎??
-
早說嘛... 我就不需要貼一堆有的沒的...
剩下的,等我有時間再看吧。。。
-
okay,我再次將環境設為一樣,除了 ping 正常外,web 也很正常...
我這篇回覆就是用這個環境送出來的。
-
抱歉......可能我沒說清楚....事實上我用ping去測試都正常
但就是開網頁時會時好時壞
一頓一頓的...
可以看看这里http://www.chinalinuxpub.com/read.htm?id=1254
-
抱歉......可能我沒說清楚....事實上我用ping去測試都正常
但就是開網頁時會時好時壞
一頓一頓的...
可以看看这里http://www.chinalinuxpub.com/read.htm?id=1254
感謝阿~~
剛剛看完後,哪篇文章講的跟我敘述的不太一樣
它是指加了equal patch後的一些問題
而我的問題是發生在NAT後面主機上網的問題(一頓一頓,常常會開不起來)
從NAT主機ping,tracert都正常,也都有multi-path
目前我已經在下載rh9 iso
想把環境模擬成跟netman學長一樣再來測試看看
-
哦,對了,cisco362 兄,我用的是 2.4.25 kernel 哦....
-
很奇怪
為什麼併線之後
msn常常被自動登出
是什麼原因呢
還有有關於併頻的nat
是需要如何設定呢
-
很奇怪
為什麼併線之後
msn常常被自動登出
是什麼原因呢
還有有關於併頻的nat
是需要如何設定呢
其實這是併線一定會發生的問題,只要您所使用的軟體,會記錄使用者的 ip 都會有這個現象發生,就我所知,這是無解的問題
-
真的無解嗎
因為我們都是用併線來用
登入登出的問題如果無法解決
就真的不知道該怎麼辦了
有哪位大大可以提供解決之道
謝謝
-
大大現在提供的方法
是針對兩條T1
那小弟有個小小的問題 :-?
如果是3條t1
是要改什麼地方呢
有沒有什麼規則可找呢
就是已N大大所提供的multipath為原則來更改可以嗎
-
我試好久好久了
我目前的環境是5個網卡
eth0~eth3將做WAN
eth4做internal
因目前在測試中故先使用:
eth0:192.168.0.83 (WAN 1)
eth1:192.168.1.84 (WAN 2)
eth4:192.168.2.1 (internal)
我使用N大大的run_ip.sh結果如下
192.168.2.0/24 dev eth4 scope link
192.168.1.0/24 dev eth1 scope link
192.168.0.0/24 dev eth0 scope link
169.254.0.0/16 dev eth4 scope link
127.0.0.0/8 dev lo scope link
default
nexthop via 192.168.0.1 dev eth0 weight 1
nexthop via 192.168.1.254 dev eth1 weight 1
nexthop via 192.168.2.1 dev eth4 weight 1
ps.上述最後一行是不是不太正確啊,記得是加了下述才出現的,後來刪掉也還是出現
#-- define internal interface, or comment out for none --#
int_if="eth4"
如果走到eth4就連不上網
我也另外試過先關eth4再執行run_ip.sh可得後,再開eth4,可server上網
[root@test tmp]# ./test
192.168.1.0/24 dev eth1 scope link
192.168.0.0/24 dev eth0 scope link
127.0.0.0/8 dev lo scope link
default
nexthop via 192.168.0.1 dev eth0 weight 1
nexthop via 192.168.1.254 dev eth1 weight 1
在還沒執行run_ip.sh前我下(gateway有設)
#iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
是可以client上網的,但下run_ip.sh後就出現
MASQUERADE: Route sent us somewhere else.
唉~我試好久了 , 也看了不少文章了 :cry: :cry: :cry:
另外我有試過ip_config,只開eth0 gateway就一定OK
-
那請問你的
fixed_if
與 fixed_gw 是怎麼設定?
又,在跑 run_ip.sh 之前,下面結果如何:
service network restart
ip addr
ip route
-
我試好久好久了
我目前的環境是5個網卡
eth0~eth3將做WAN
eth4做internal
因目前在測試中故先使用:
eth0:192.168.0.83 (WAN 1)
eth1:192.168.1.84 (WAN 2)
eth4:192.168.2.1 (internal)
我使用N大大的run_ip.sh結果如下
給您一個建議,就以 N 大大的 run_ip.sh 為參考,
一條一條指令下,看有什麼結果
就知道您的問題在那兒了
-
我有修改過run_ip.sh二行如下
#-- define fixed interface & gateway --#
fixed_if="eth0 eth1"
#-- format: if:gw:weight --#
fixed_gw="eth0:192.168.0.1:1 eth1:192.168.1.254:1"
在/etc/rc.d/init.d/network restart後
[root@test tmp]# ip addr
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:05:5d:93:9f:78 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.83/24 brd 192.168.0.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0d:88:18:10:5c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.84/24 brd 192.168.1.255 scope global eth1
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 00:05:5d:93:9f:7b brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 00:05:5d:93:9f:79 brd ff:ff:ff:ff:ff:ff
6: eth4: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:fc:64:07:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.2.1/24 brd 192.168.2.255 scope global eth4
[root@test tmp]# ip route
192.168.2.0/24 dev eth4 scope link
192.168.1.0/24 dev eth1 scope link
192.168.0.0/24 dev eth0 scope link
169.254.0.0/16 dev eth4 scope link
127.0.0.0/8 dev lo scope link
是因為上述192.168.2.0/24 dev eth4 scope link & 169.254.0.0/16 dev eth4 scope link這兩行的關係嗎???
我下route del吧那兩行刪掉執行run_ip.sh得
[root@test tmp]# ./test
192.168.1.0/24 dev eth1 scope link
192.168.0.0/24 dev eth0 scope link
127.0.0.0/8 dev lo scope link
default
nexthop via 192.168.0.1 dev eth0 weight 1
nexthop via 192.168.1.254 dev eth1 weight 1
nexthop via 192.168.2.1 dev eth4 weight 1
仍然一樣走到eth4之後就會出不去,走eth0 & eth1即可分流出去
另外我想請問做NAT在iptable裡要下什麼指令
#iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE -o eth0
還是
#iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE ! -o eth0
-
請問你的 test 是用哪個版本?
若不是 v0.03 的話,請重抓:
http://www.study-area.org/linux/src/multipath.tgz
-
:D
我馬上下載後修改
#-- define fixed interface & gateway --#
fixed_if="eth0 eth1"
#-- format: if:gw:weight --#
fixed_gw="eth0:192.168.0.1:1 eth1:192.168.1.254:1"
#-- define internal interface, or comment out for none --#
#int_if="eth4"
因為我沒有在機器旁,所以先#int_if="eth4",再restart network執行後得
[root@test multipath]# ./run_ip.sh
192.168.2.0/24 dev eth4 scope link
192.168.1.0/24 dev eth1 scope link
192.168.0.0/24 dev eth0 scope link
169.254.0.0/16 dev eth4 scope link
127.0.0.0/8 dev lo scope link
default equalize
nexthop via 192.168.0.1 dev eth0 weight 4
nexthop via 192.168.1.254 dev eth1 weight 1
nexthop via 192.168.2.1 dev eth4 weight 1
於是我又再把加回int_if="eth4",不管有沒有在機器旁硬給它試試
[root@test multipath]# ./run_ip.sh
192.168.2.0/24 dev eth4 scope link
192.168.1.0/24 dev eth1 scope link
192.168.0.0/24 dev eth0 scope link
169.254.0.0/16 dev eth4 scope link
127.0.0.0/8 dev lo scope link
default equalize
nexthop via 192.168.0.1 dev eth0 weight 4
nexthop via 192.168.1.254 dev eth1 weight 1
OK了,感謝N大大。
NAT部份該如何設定呢?
#iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE -o eth0
可嗎?? :) :)
-
最後的 "可以嗎?" 的問題,通常我的標準答案是:
--- 那你試過了嗎?結果如何?
-
我下
#iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE -o eth0
但用戶端仍無法上網,我利用tcpdump -i eth4原因如下:
MASQUERADE: Route sent us somewhere else.
我再參考鳥哥大大網站上的iptables.rule,並針對我的環境修改如下:
# Generated by iptables-save v1.2.8 on Mon May 10 11:35:42 2004
*mangle
:PREROUTING ACCEPT [2032:242992]
:INPUT ACCEPT [1981:239635]
:FORWARD ACCEPT [39:2612]
:OUTPUT ACCEPT [172:67153]
:POSTROUTING ACCEPT [211:69765]
COMMIT
# Completed on Mon May 10 11:35:42 2004
# Generated by iptables-save v1.2.8 on Mon May 10 11:35:42 2004
*filter
:INPUT DROP [180:21830]
:FORWARD ACCEPT [39:2612]
:OUTPUT ACCEPT [162:66477]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth4 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 3/4 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 14 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 16 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 18 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 113 -j ACCEPT
COMMIT
# Completed on Mon May 10 11:35:42 2004
# Generated by iptables-save v1.2.8 on Mon May 10 11:35:42 2004
*nat
:PREROUTING ACCEPT [225:24493]
:POSTROUTING ACCEPT [7:450]
:OUTPUT ACCEPT [3:226]
-A POSTROUTING -s 192.168.2.0/255.255.255.0 -o eth0 -j MASQUERADE
COMMIT
# Completed on Mon May 10 11:35:42 2004
後client端可成功ping 168.95.1.1 & 203.133.1.6(各DNS server)
但client端要開啟網頁等動作,連線很鈍的樣子,也常出現如下訊息
MASQUERADE: Route sent us somewhere else.
-
這跟我是雙PIII 1G 有關嗎?????? :-?
-
這跟我是雙PIII 1G 有關嗎?????? :-?
無關 -> 之前有人懷疑過,會和雙 cpu 的主機有關,後來都証實無關
我想您可能,都沒有看我們給您的建議,
請您先用下指令的方式,確定可以工作了,再改用 script
比較容易找出問題所在
-
連網怪怪的問題我大概再多試了幾次,發現如下現象:
我執行如下指令:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.2.0/24 -j MASQUERADE
http://tw.yahoo.com(絕對可連,而且速度超快)
但經由網頁再點選YAHOO新聞會出現無法連取的現象
(超連結為http://tw.rd.yahoo.com/refurl/news/topic1/*http://tw.news.yahoo.com/)
但如果將上述的網址只截取後面http://tw.news.yahoo.com/即可連線(超快感)
想請問這種現象該朝那個方向處理,望請各位學長指點指點 :) :) :)
-
kuolung大大,我試了慢慢下指令後(run_ip.sh),皆順利執行
另外我自己再下NAT 的指令(如下)仍會有上述的一些現象
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE
麻煩指引指引~~~~感恩啦
-
這樣如何:
iptables -t nat -F
iptables -t nat -A POSTROUTING -d ! 192.168.2.0/24 -j MASQUERADE
-
我提供一下我用的方法
iptables -t nat -A PREROUTING -o eth1 -s 192.168.2.0 -j SNAT --to 61.62.136.127
iptables -t nat -A PREROUTING -o eth2 -s 192.168.2.0 -j SNAT --to 61.62.87.129
是一定可以上網
但是有什麼問題我會不知道
但是我很肯定玩game等等必須持續連線的軟體
一段時間就會斷線
不知各位大大有解決方法
-
我樓上打錯了
是POSTROUTING
sorry
-
不要用by packet RR
by packet RR只能在router上看的出功用
如過你是在router後 也就是透過這台router 做NAT上網
又想要用by packet RR ....事實上是有很大問題的
-
想到一句話: 1+1!=2 還會<1
-
http://peterkim.cgucccc.org/document/MPath.html
有沒有人試過這裡的scripts 8)
-
請問一下,
我現在的環境是一台 linux 主機,用 2.4.18 的 kernel,開啟 MultiPath routing,沒有做任何的 patch。接三張網卡,一張接 LAN ,兩張接 WAN,但是是接在同一網域內。(只是為了測試用)
開啟了 rp_filter 跟 arp_filter。
WAN 的 IP 分別是 192.168.1.100 跟 192.168.1.101,LAN ip 是 10.0.0.1。兩個 WAN 的 Gateway 都是設成 192.168.1.1。也依照前面的 script 設定好了。
subnet mask 都是 255.255.255.0
我現在的情形是當我由 linux 機器上要 ping WAN 上面另一台電腦 192.168.1.102 的時候
會很難 ping 得出去,會 time out 個五、六個封包才 ping 通一個。
在 192.168.1.102 抓取封包來看,發現 ping 的封包都沒送出來,只有偶爾出來一、兩個(就是 ping 通的那一、兩個)
另外一個奇怪的情形,當我由 192.168.1.102 ping 192.168.1.100 或是 192.168.1.101 的時候,完全收不到回應的封包。 當我抓取封包來看,發現 linux 有回應 ping 的封包,但是回應封包的 destination mac address 居然是 gateway 的 mac address ...>_<
為什麼會有這麼奇怪的行為呢?
-
http://peterkim.cgucccc.org/document/MPath.html
高雄有沒有人可以帶我做長庚的這個範例呀?~
我願意出學費滴~ 但是太高也是出不起啦~ >"<
我滴Redhat Linux 9.0目前有ProFTPD Postfix Apache SSH OpenWebMail
目前有HiNet 2M/384 SeedNet 2M/128 兩條線路可以合併...
我太衝動了..跑企多請了SeedNet的線...
線都來裝了,確不會設定多路由.. >"< 救...救...救..偶吧~
-
最後我也是使用by Session
設定如下:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/255.255.255.0 -j SNAT --to x.x.x.x
iptables -t nat -A POSTROUTING -o eth2 -s 192.168.0.0/255.255.255.0 -j SNAT --to x.x.x.x
iptables -t nat -A POSTROUTING -o eth3 -s 192.168.0.0/255.255.255.0 -j SNAT --to x.x.x.x
iptables -t nat -A POSTROUTING -o eth5 -s 192.168.0.0/255.255.255.0 -j SNAT --to x.x.x.x
ps x.x.x.x是連外網卡的IP :D :D :D
-
http://peterkim.cgucccc.org/document/MPath.html
高雄有沒有人可以帶我做長庚的這個範例呀?~
我願意出學費滴~ 但是太高也是出不起啦~ >"<
我滴Redhat Linux 9.0目前有ProFTPD Postfix Apache SSH OpenWebMail
目前有HiNet 2M/384 SeedNet 2M/128 兩條線路可以合併...
我太衝動了..跑企多請了SeedNet的線...
線都來裝了,確不會設定多路由.. >"< 救...救...救..偶吧~
那篇文章與這篇討論應該不會很難, 有試著去做過嗎?
如果無法照著做出來, 那我覺得似乎不應該使用這個解決方案, 因為你找別人做了之後, 你應該也沒有能力可以維護它.
買個現成的硬體來做, 可能會比較好一些.
-
在實作OK後...就修改 放到rc.local
嗎?
那下面這一堆指令是要在 run_ip.sh之前執行嗎?~
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
/bin/echo "1" /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
/bin/echo "0" /proc/sys/net/ipv4/conf/all/accept_source_route
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
/bin/echo "1" > /proc/sys/net/ipv4/ip_forward
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/log_martians
for i in /proc/sys/net/ipv4/conf/*; do
/bin/echo "0" > $ i/rp_filter
done
modprobe ip_tables
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
ip link set lo up
ip addr add 127.0.0.1/8 brd + dev lo
ip link set eth2 up
ip addr add 192.168.0.254/16 brd + dev eth2
ip route del default table main
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/16 -j SNAT --to eth0 的實體 IP
iptables -t nat -A POSTROUTING -o eth2 -s 192.168.0.0/16 -j SNAT --to eth1 的實體 IP
還有呀像長庚http://peterkim.cgucccc.org/document/MPath.html中滴
QoS 機制
ip link set dev eth1 mtu 1000
tc qdisc add dev eth1 root handle 1: htb default 25
tc class add dev eth1 parent 1: classid 1:1 htb rate 364kbit
(設定 ICMP 的權重在較高的位置)
iptables -t mangle -A MYSHAPER-OUT -p udp -j MARK --set-mark 21
(設定 TCP port 在 1024 以下的權重)
iptables -t mangle -A MYSHAPER-OUT -p tcp -- dport 0:1024 -j MARK --set-mark
24
這些部份要如何加入到run_ip.sh檔中呢???~
還是放到rc.local在run_ip.sh之前執行就可以了?~
因為我不太懂LINUX所以有粉多問題可能會很蠢..請見諒~ :o :o :o
-
感謝大家~*
合併ADSL的部份我已經試成功了..
不過因為我還不會組譯核心,所以還沒辦法自動第一條ADSL滿載跑第二條ADSL
Mandrake LINUX10有內建該http://www.ssi.bg/~ja/patch-2.4.25-ja2.diff
這個PATCH了嗎?~
另外想請問這合併ADSL範例可以使用用純LAN環境上嗎?~
也就是可以不設NAT合併兩台主機之間的多條LAN嗎?~ :oops: :oops: :oops:
-
感謝大家~*
合併ADSL的部份我已經試成功了..
不過因為我還不會組譯核心,所以還沒辦法自動第一條ADSL滿載跑第二條ADSL
Mandrake LINUX10有內建該http://www.ssi.bg/~ja/patch-2.4.25-ja2.diff
這個PATCH了嗎?~
另外想請問這合併ADSL範例可以使用用純LAN環境上嗎?~
也就是可以不設NAT合併兩台主機之間的多條LAN嗎?~ :oops: :oops: :oops:
基本上,這樣的思考是沒有錯,所以可以這樣做的
但是,換個方式想,如果您的目的是為了要合併兩片網卡,來提升主機對內部網路的頻寬和作備援的話,可以 chinnel 或 bounded 的方式
-
最新消息,我最近使用 FC2 再升級 Kernel 到 2.6.5 後
好像原來的 多網路的設定,會有一些問題,
NAT 本身可以上網,
但是,NAT 內部的電腦,卻不能上網,有沒有人試過類似的環境,
FC2 + kenrel 2.6.5
用一條固定的 adsl 和一條浮動的 adsl
-
:o
那請想請問一下
-j SNAT
可以嗎
-
請問:
1. 我有依照您的大作,在一台主機成功做分流,而且有掛上網頁;
但卻發生一問題:nat內部網段的電腦無法瀏覽分流主機的網頁,但可藉由分流主機上網;另外外部真實ip網路段可正常瀏覽分流主機的網頁,
分流主機有三塊網路卡,eth0:學術網路,eth1:hinet,eth2:nat,
-以下是nat設定,
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to xxx.xxx.xxx.10
iptables -t nat -A POSTROUTING -o eth2 -s 192.168.1.0/24 -j SNAT --to xxx.xxx.xxx.13
2. 現在有很多網路不允許ping指令,不知道可否改成ping 80 port的方式,
如果可以,但不知程式如何修改...
謝謝.
-
eth2 不是內部用的嗎?
若然, 下面這行:
iptables -t nat -A POSTROUTING -o eth2 -s 192.168.1.0/24 -j SNAT --to xxx.xxx.xxx.13
要將 eth2 改為 eth0 .
-
對不起我寫錯了,
我的eth0是nat,eth1是學術網路,eth2是hinet...
-
對不起我寫錯了,
我的eth0是nat,eth1是學術網路,eth2是hinet...
這個問題後來加下列指令就解決了.
iptables -A PREROUTING -t nat -i eth0 -p tcp -d 163.xx.xxx.xx -j DNAT --to-destination 192.168.0.254
iptables -A PREROUTING -t nat -i eth0 -p UDP -d 163.xx.xxx.xx -j DNAT --to-destination 192.168.0.254
另有一個問題是:
eth1是學術網路.網段是一個c.也就是163.xx.xxx.xx/24.Gateway 是163.xx.xxx.254.當內部網路eth0.內的電腦用網路芳鄰.連到eth1 163.xx.xxx.10時.如果上傳檔案.速度非常慢.而.254 router是一台cisco1600.它col燈會一直恆亮.直到檔案上傳結朿.這個問題是不是eth0內的電腦要上傳到163.xx.xxx.10的封包要經由163.xx.xxx.254的Gateway.在回來.不知這樣對不對.不知有無解方法.
謝謝..
-
很奇怪
為什麼併線之後
msn常常被自動登出
是什麼原因呢
還有有關於併頻的nat
是需要如何設定呢
其實這是併線一定會發生的問題,只要您所使用的軟體,會記錄使用者的 ip 都會有這個現象發生,就我所知,這是無解的問題
個人是利用下面方式來指定 msn 走一條線出去的 , 提供給各位參考 :
------------------------------------------------------------------------
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 1863 -j MARK --set-mark 1
ip rule add fwmark 1 table 101
ip route add default via 203.73.1.1 dev eth2 table 101
------------------------------------------------------------------------
我內部的網卡為 eth0 , 連到外部internal的其中一片網卡則為 eth2,這條線的gateway 為 203.73.1.1 ; 而 msn client 與 那些 msn server 溝通都是走 1863 port .
希望對大家有幫助 :D
-
很奇怪
為什麼併線之後
msn常常被自動登出
是什麼原因呢
還有有關於併頻的nat
是需要如何設定呢
其實這是併線一定會發生的問題,只要您所使用的軟體,會記錄使用者的 ip 都會有這個現象發生,就我所知,這是無解的問題
個人是利用下面方式來指定 msn 走一條線出去的 , 提供給各位參考 :
------------------------------------------------------------------------
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 1863 -j MARK --set-mark 1
ip rule add fwmark 1 table 101
ip route add default via 203.73.1.1 dev eth2 table 101
------------------------------------------------------------------------
我內部的網卡為 eth0 , 連到外部internal的其中一片網卡則為 eth2,這條線的gateway 為 203.73.1.1 ; 而 msn client 與 那些 msn server 溝通都是走 1863 port .
希望對大家有幫助 :D
那~~* 不就是要再加上一個script在其中一條斷線時改設由另一條線走嚕?~
太棒嚕~* 多線路合並NAT功能越來越完全嚕~
那QoS還有H.323VoIP的部份怎麼辦呢?~ :D :lol: :P :o 8)
-
各位高手們:
我有兩個固接的ADSL
分別接上Linux(redhat9)
Linux有三張網卡,分別為
eth0 ---- 固接一 1.2.3.4/24 gw 5.6.7.8
eth1 ---- 固接二 a.b.c.d/24 gw e.f.g.h
eth2 ----內網 192.168.1.0/24
並設定Apache Web (Virtual Host)
1.2.3.4 一個DNS
a.b.c.d 一個DNS
default gw 為 5.6.7.8
eth1只負責一個Web站台的服務
,當然eth0也有一個Web站台...而內網皆使用eth0上網
在內部的ip皆能透過iptables的設定連到各Web站台
但是外部始終只能連上eth0的Web站台
不知各位高手能否解救
讓我能夠連上eth1的Web站台
謝謝!!!
-
hi大家好...h.323nat請找一下helpers-2.4.30.patch.gz 至於Multipath就不用我多說了qos可以用cbq or htb這樣就解決了穩定測試中目前用下滿穩定的喔!不過小弟核心是用2.4.30拉!......努力加油 :D
-
那各位大大...
如果小弟不想要這台機器有NAT的功能
也就是說3張網卡都是WAN ip
有那位大大知道要如何做嗎??
-
不用, 就不理 nat 即可. 沒差.
-
不好意思netman學長
因為我第3張網卡是要接 firewall用firewall當NAt
所以這第三張網卡應該設那一條的線的IP呢??
-
書局有書且實做有成功您可以去買依本看看
-
書...叫什麼名字呢??
-
請問你的 test 是用哪個版本?
若不是 v0.03 的話,請重抓:
http://www.study-area.org/linux/src/multipath.tgz
如果,其中一張網卡,上兩個 ip 這個程式,好像 run 不起來,
不知要怎麼改才能用
如我的
eth0 : 對內
eth1 : x.x.x.85 對外
eth1:1 x.x.x.87
eth2: y.y.y.y 對外
run_ip.sh 會有問題
-
我原來是用FC1搭配2.4的kernel,改用FC3 核心為 2.6.12後
1.會無法翻譯網站的Domain Name,只能用IP連網站
2.會無法連MSN
我的NAT設定如下
echo "1" > /proc/sys/net/ipv4/ip_forward
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
#NAT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT --to-source x.x.x.x
#Use Proxy
iptables -t nat -A PREROUTING -i eth4 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth4 -p tcp --dport 8080 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth4 -p tcp --dport 3128 -j REDIRECT --to-port 3128
#shutdown Reverse Path Filtering
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
是不是要載入modprobe才能用,之前用fedora core 1時可以使用
:o :o :o
-
我原來是用FC1搭配2.4的kernel,改用FC3 核心為 2.6.12後
1.會無法翻譯網站的Domain Name,只能用IP連網站
2.會無法連MSN
功課做的不夠好,詳讀鳥哥大大的NAT篇即解決
:D :D :D
-
http://www.mobile01.com/newsdetail.php?id=2208
不知道這台是不是也是用這種方法辦到雙網合併滴呀?~
-
應該這麼說netman的說法我都做測過確實可以run拉..只是遇到一個小問題..我讓多wan eth0~eth3 椄不同的adsl也達到想要的功能..可是eth4做lan eth5做dmZ
也加了h.323nat的功能都ok可是我想要始sip也可以跟h.323NAT一樣加到這台機器上..不知有沒有哪裡有寫好的Patch可以上..因為這樣才是我理想中的合併頻寬分流可以在nat下裝voip..還請網友沒告知一下我來做做看摟...感恩阿...
-
書...叫什麼名字呢??
施先生團隊的書好像是從這看去寫的吧?~
-
kuolung大大你好:
小弟最近也想要嘗試使用multipath,看到你的文章,想要採用你的script,但是環境與你不太相同,所以想要先請教你一下。
小弟的作業系統是RedHat EL AS3
網路是Hinet-pppoe,加quote="kuolung"]dhcp)
跟大大的所有連線都是pppoe的不太相同,所以想要請問一下kuolung,如果要使用此script,有那些部份需要修改呢?
eth0-->hinet(pppoe)
eth1-->192.168.1.254/24
eth2-->東森cablemodem(dhcp)
http://phorum.study-area.org/viewtopic.php?t=35503
我把我前幾天重寫的有關 multipath 的 script 登出來吧,因為前面寫的 script
是針對固定制的 adsl 如果您的兩條或兩條以上用的是 pppoe 的方式便不能使用
所以我重寫如下
#!/bin/bash
#
IPTABLES=/sbin/iptables
LSMOD=/sbin/lsmod
GREP=/bin/grep
AWK=/bin/awk
SED=/bin/sed
IFCONFIG=/sbin/ifconfig
ECHO=/bin/echo
IP=/sbin/ip
LS=/bin/ls
#
declare -i j
#
interfaces=$($IFCONFIG | $GREP 'ppp' | $AWK '{print $1}')
DEFGW='/sbin/ip route replace'
#
# delete old rule table
#
rulelist=$($IP rule list | $AWK '{print $5}' | grep 1 )
#
for i in $rulelist ; do
OLDIP="`$IP rule show | $GREP $i | $AWK '{print $3}'`"
$IP rule del pref $i from $OLDIP table $i
done
#
#
#
for i in $interfaces ; do
IPPPP="`$IFCONFIG $i | $GREP 'inet addr' | $AWK '{print $2}' | $SED -e 's/.*://'`"
GWPPP="`$IFCONFIG $i | $GREP 'inet addr' | $AWK '{print $3}' | $SED -e 's/.*://'`"
j="`$IFCONFIG $i | $GREP 'ppp' | $AWK '{print $1}' | $SED -e 's/.*p//'`"
j=j+160
# set rule
$IP rule add pref $j from $IPPPP table $j
# set default gw
$IP route replace default via $GWPPP dev $i table $j
$IP route list table $j
DEFGW=$DEFGW' nexthop via '$GWPPP' dev '$i
done
$DEFGW
這樣就可以用了,不管用幾條計時的都可以,還是試過,將Hinet提供的4個計時ip全部取得也可以用喔
-
kuolung大大你好:
小弟最近也想要嘗試使用multipath,看到你的文章,想要採用你的script,但是環境與你不太相同,所以想要先請教你一下。
小弟的作業系統是RedHat EL AS3
dhcp)
跟大大的所有連線都是pppoe的不太相同,所以想要請問一下kuolung,如果要使用此script,有那些部份需要修改呢?
eth0-->hinet(pppoe)
eth1-->192.168.1.254/24
eth2-->東森cablemodem(dhcp)
對不起,實在是看不太懂您的環境如何 ? 不過,好像您有一條 東森的 dhcp 線
所以寫法會不太一樣,
-
書...叫什麼名字呢??
給你參考一下
http://www.flag.com.tw/book_info/F5340.htm
-
okay,我已將這次實作用的 script 及 ddns key 包好在如下這個 tarball :
http://www.study-area.org/linux/src/multipath.tgz
有興趣的朋友可抓回去玩玩看... 當然,若能提出改良建議更好﹗ ^_^
這個檔案中的 run_ip.sh 有一點小問題,就是對浮動 ip 的 ppp0 時 rule 會不能刪除,越堆越多
所以把其中的
#-- remove old rule table --#
for i in $interfaces; do
$IP address | $GREP -A2 $i | $AWK '/inet[^6]/{print $2}' | $CUT -d'/' -f1
done | xargs -n1 echo from | while read line; do
$IP rule | grep "$line"
done | $SED -e "s/^/ip rule del pref /;s/://;s/lookup/table/" | $BASH
unset i
改為
#-- define table_id --#
init_num=10
offset=`echo -e "${interfaces// /\n}" | $WC -l`
last_num=$(($init_num + $(((offset-1) * 10)) ))
tb_num=`$SEQ $init_num 10 $last_num | xargs echo`
tb_num1=`echo ${tb_num// /|} | $SED 's/[^|][^|]*/^&:/g'`
#-- remove old rule table --#
$IP rule list | $GREP -E $tb_num1 | while read line; do
TABID=`echo $line | awk -F: '{print $1}'`
OLDIP=`echo $line | awk '{print $3}'`
PREID=`echo $line | awk '{print $5}'`
$IP rule del pref $PREID from $OLDIP table $TABID
done
會比較好一點
-
拜讀各位大大的資料,真的非常的寶貴.無私的精神.
雖然multipath已經實作完成,但有些功能仍需請教
eth0 內部區網 192.168.1.0/24 gatway 192.168.1.254
eth1 ppp0 hinet gateway 100.100.100.254 IP 100.100.100.2
eth2 ppp1 seednet gateway 200.200.200.254 IP 200.200.200.2
例子:
1指定區網內寄信25port全都經由 ppp1 第二線出去
2指定區網內192.168.1.1/25 只能從 ppp0 第一線出去
3指定區網內192.168.1.129/25 只能從 ppp2 第二線出去
由實作route 測試可以指定來源ip or 網段 至 pppoe 出去 2,3問題可解
ip rule add from 192.168.1.1/25 table 100
ip rule add 100.100.100.2 table 100 <好像不需要加也可以
ip rule add default via 100.100.100.254 dev ppp 2table 100
ip rule add from 192.168.1.128/25 table 101
ip rule add 200.200.200.2 table 101 <好像不需要加也可以
ip rule add default via 200.200.200.254 dev ppp1 table 101
最重要是第1題 route 好像只能有來源/目的地/gateway, 而無port功能
曾做fwmark但是無效
ip rule add fwmark 1 table 102
ip rule add default via 200.200.200.254 dev ppp1 table 101
iptables -I PREROUTING -p tcp --dport -j MARK --set-mark 1
一般多wan的路由器均具備來源/目的地/gateway, PORT設定路由功能
請教各位前輩有做過的分享經驗給大家
-
ip rule add from 192.168.1.1/25 table 100
ip rule add 100.100.100.2 table 100 <好像不需要加也可以
ip rule add default via 100.100.100.254 dev ppp 2table 100
ip rule add from 192.168.1.128/25 table 101
ip rule add 200.200.200.2 table 101 <好像不需要加也可以
ip rule add default via 200.200.200.254 dev ppp1 table 101
最重要是第1題 route 好像只能有來源/目的地/gateway, 而無port功能
曾做fwmark但是無效
ip rule add fwmark 1 table 102
ip rule add default via 200.200.200.254 dev ppp1 table 101
iptables -I PREROUTING -p tcp --dport -j MARK --set-mark 1
一般多wan的路由器均具備來源/目的地/gateway, PORT設定路由功能
1. ip rule add 100.100.100.2 table 100 <好像不需要加也可以
從 FC4 以後就要加了,原因我也不清楚
2.
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 0/0 --dport 25 -j MARK --set-mark 25
ip rule add pref 5 fwmark 25 table 100
ip route replace default via 200.200.200.254 dev ppp1 table 100
試看看
-
2.
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 0/0 --dport 25 -j MARK --set-mark 25
ip rule add pref 5 fwmark 25 table 100
ip route replace default via 200.200.200.254 dev ppp1 table 100
試看看
謝謝您的回答.很抱歉我自己也打了很多錯次.
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 0/0 --dport 25 -j MARK --set-mark 25
-A FORWARD 有錯誤,好像不大對應該是 -t mangle -A FORWARD
不過 -t mangle -A FORWARD 還是測試不出來,都是跑2wan功能,不是走二線.
-t mangle -A PREROUTING也是相同情形.
後來直接測試 --dport 80比較常用結果,都是跑2wan功能,不是走二線.
我實作2WAN+HTB QOS功能及來源或目的地指定路由均無問題.唯獨PORT指定路由均無效,
請教一下各位大大提供實際測過有效的,是哪裡出問題 fwmark 真的有用嗎
-
如果同時製作多WAN+HTB頻寬管理功能時,
此時在加入使用來源IP、目的地IP要指定路由時,
可以使用ip rule 以及 ip route 達成目標.且無問題.
但是要指定服務PORT指定路由時會與HTB頻寬管理指令有互相衝突.
因為都是同樣使用 iptables 的 -j MARK --set-mark XXX.
所以造成亂跑現象.
MARK功能是貼標籤所以還是繼續會往下一行iptables繼續執行.
歡迎各位大大有無更好的解決方式.
-
各位大大..
小弟依照各位大大的方法.是可以實線multipath的功能.但是問題來了...
小弟用這個功能在總公司跟分公司實現這功能
都是Hinet+速博
可是今天有一個地方兩條線都是hinet的.這個功能竟無法實現.它都一直走default gateway.小弟show ip route list或ip route list table 的command都正常.這台機器拿去別的地方測用不同的ISP也正常.後來小弟用tcpdump來觀察..發現在Lan卡中..它對2張wan卡都會有package流通..只是不是default gateway那一條線路..
好像到了最後有資料出不去.這個功能是要用在ftp server上的.用ftp連不是default gateway那條線...有看見連上的訊息..險是waiting welcome message但就會timeout連不上..去上ftp server的netstat那條連不上的..只能到sync而沒辦法到ESTABLISHED的狀態..如果把default gateway改成另一條線.那原來那條沒有default gateway就會變得一樣的狀況.
但另一個狀況來了...
現在所有外部的網路都無法連結的狀況.這兩條線路A跟B.它都各有3個wan ip.小弟都各抓一個來用.可是如果小弟隨便用一台電腦用B的線路其中一個ip來連結的話就不會有上面發生的問題而且不論這台multipath的default gateway是那一條都可以通....
請問有那位大大知道這問題嗎??
謝謝
-
各位大大..
小弟依照各位大大的方法.是可以實線multipath的功能.但是問題來了...
小弟用這個功能在總公司跟分公司實現這功能
都是Hinet+速博
可是今天有一個地方兩條線都是hinet的.這個功能竟無法實現.它都一直走default gateway.小弟show ip route list或ip route list table 的command都正常.這台機器拿去別的地方測用不同的ISP也正常.後來小弟用tcpdump來觀察..發現在Lan卡中..它對2張wan卡都會有package流通..只是不是default gateway那一條線路..
好像到了最後有資料出不去.這個功能是要用在ftp server上的.用ftp連不是default gateway那條線...有看見連上的訊息..險是waiting welcome message但就會timeout連不上..去上ftp server的netstat那條連不上的..只能到sync而沒辦法到ESTABLISHED的狀態..如果把default gateway改成另一條線.那原來那條沒有default gateway就會變得一樣的狀況.
但另一個狀況來了...
現在所有外部的網路都無法連結的狀況.這兩條線路A跟B.它都各有3個wan ip.小弟都各抓一個來用.可是如果小弟隨便用一台電腦用B的線路其中一個ip來連結的話就不會有上面發生的問題而且不論這台multipath的default gateway是那一條都可以通....
請問有那位大大知道這問題嗎??
謝謝
-
書...叫什麼名字呢??
施先生團隊的書好像是從這看去寫的吧?~
我也是用施先生的書做Muitlpath有成功,但如果搭配第4章的Iptables Script會造成合併頻寬失效,由於小弟對Script語言不了解,所以並沒有改寫,有請各位先進幫忙!
-
真的無解嗎
因為我們都是用併線來用
登入登出的問題如果無法解決
就真的不知道該怎麼辦了
有哪位大大可以提供解決之道
謝謝
小弟最近也合併了Hinet與Sparq的線路..
一開始也是一直斷, 後來發現了一個patch可以解決, 位置在此:
http://www.ssi.bg/~ja/#routes
-
想請問一下,我主機上有三片網卡,有兩條adsl,分別接上eth0跟eth1,而eth2 是對內提供ip 給192.168.1.0/24 這個網段的主機。
如果不採用合併頻寬的方式,有辦法讓這同個網段中的電腦,其ip是192.168.1.1~192.168.1.126 走 eth0 出去,而192.168.1.128~192.168.1.253走eth1出去嗎?