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

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

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Linux ADSL Multipath Routing Solution
« 回覆 #60 於: 2004-02-25 08:31 »
引述: "JadeRabbit"

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 的那段文章的網址
=========================
http://www.kuolung.net
==========================

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #61 於: 2004-02-25 11:50 »
引述: "JadeRabbit"
如下片段則看 你的 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);
 }

看到了,都有...
不過還沒試出來...  >_<
看來還要努力了﹗

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #62 於: 2004-02-25 13:49 »
啊.... 總算知道問題了: 是測試方法不夠嚴謹...

跟據 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,接下來是斷線測試...  ^_^

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Linux ADSL Multipath Routing Solution
« 回覆 #63 於: 2004-02-26 09:37 »
引述: "netman"
啊.... 總算知道問題了: 是測試方法不夠嚴謹...

跟據 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 情況是不一樣的
=========================
http://www.kuolung.net
==========================

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #64 於: 2004-02-26 13:43 »
那我就不明了,因為 patch 很確定已加了... 且你提到的那幾行我也確認了...

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #65 於: 2004-03-19 16:56 »
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 。
大家還有啥點子,請提出來一起研究吧...

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Linux ADSL Multipath Routing Solution
« 回覆 #66 於: 2004-03-19 19:00 »
引述: "netman"
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 就不是那麼重要了
=========================
http://www.kuolung.net
==========================

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #67 於: 2004-03-19 19:05 »
關於斷線偵測,我初步想到就是:
1) 將 ISP router 設為 static route
2) 用 ping
不知可行否?
(我還沒開使寫...  ^_^ )

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #68 於: 2004-03-20 21:26 »
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 .... ^_^

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #69 於: 2004-03-22 14:47 »
大家好﹗

我目前在做 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

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #70 於: 2004-03-22 18:04 »
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 跑起來,然後"拔線"測試囉....  ^_^

歡迎回報錯誤﹗

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #71 於: 2004-03-23 16:20 »
okay,我已將這次實作用的 script 及 ddns key 包好在如下這個  tarball :
http://www.study-area.org/linux/src/multipath.tgz

有興趣的朋友可抓回去玩玩看... 當然,若能提出改良建議更好﹗  ^_^

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #72 於: 2004-03-24 17:32 »
最後,關於本次實作文件,整理如下:
http://www.study-area.org/tips/multipath.htm

歡迎修訂。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #73 於: 2004-03-31 14:41 »
再補一篇資料給大家參考:

http://peterkim.cgucccc.org/document/MPath.html

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Linux ADSL Multipath Routing Solution
« 回覆 #74 於: 2004-03-31 22:14 »
引述: "netman"
再補一篇資料給大家參考:

http://peterkim.cgucccc.org/document/MPath.html


我看完了,覺得,其中有一句話寫錯了

"ISP 會收到發出 IP 非自己網段的路由封包因而 Drop 掉的問題。"

在最後一段,討論 by session 和 by packet 這一句是錯的,理論上是不會發生這樣的情況的
=========================
http://www.kuolung.net
==========================

changchichung

  • 憂鬱的高中生
  • ***
  • 文章數: 148
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #75 於: 2004-04-06 09:55 »
關於 ddns server 與 client 的設定,請另行參考:
http://www.study-area.org/tips/ddns.htm
這裡不再重複...


連結開不起來耶 ~

cisco3662

  • 鑽研的研究生
  • *****
  • 文章數: 739
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #76 於: 2004-04-06 18:33 »
代碼: [選擇]
            line1      line2
             |            |
             |            |
             |            |
             |            |
______________________s/w1
                   |
                   |
               ---------
              |          |
              |          |
               ---------
                   |
                   |
---------------------------------s/w2
          |
          |
          |
         PC


請問netman學長
我想將架構改成以上圖示
試過多種版本的ip rule setting都無法成功
(但我一張網卡接一條線路的方式是可行的)
可否指點小弟哪裡該注意的
感機不盡

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #77 於: 2004-04-06 23:04 »
你可用  ip 命令在同一個 if 上設多個 address 哦,試試看...

cisco3662

  • 鑽研的研究生
  • *****
  • 文章數: 739
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #78 於: 2004-04-07 00:24 »
引述: "netman"
你可用  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

用兩個介面(對外)跑以上設定是正常的
但若改成新的架構(一張對內,一張對外)則會有問題

cisco3662

  • 鑽研的研究生
  • *****
  • 文章數: 739
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #79 於: 2004-04-07 00:29 »
引述: "cisco3662"
引述: "netman"
你可用  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

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #80 於: 2004-04-09 16:25 »
為此,我在我的機器上,修改為 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

  • 鑽研的研究生
  • *****
  • 文章數: 739
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #81 於: 2004-04-09 19:13 »
引述: "netman"
為此,我在我的機器上,修改為 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學長有測到這段嗎??

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #82 於: 2004-04-10 01:58 »
早說嘛... 我就不需要貼一堆有的沒的...

剩下的,等我有時間再看吧。。。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #83 於: 2004-04-11 00:21 »
okay,我再次將環境設為一樣,除了 ping 正常外,web 也很正常...
我這篇回覆就是用這個環境送出來的。

qinray

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #84 於: 2004-04-14 09:30 »
引用

抱歉......可能我沒說清楚....事實上我用ping去測試都正常
但就是開網頁時會時好時壞
一頓一頓的...

 可以看看这里http://www.chinalinuxpub.com/read.htm?id=1254

cisco3662

  • 鑽研的研究生
  • *****
  • 文章數: 739
    • 檢視個人資料
Linux ADSL Multipath Routing Solution
« 回覆 #85 於: 2004-04-14 10:20 »
引述: "qinray"
引用

抱歉......可能我沒說清楚....事實上我用ping去測試都正常
但就是開網頁時會時好時壞
一頓一頓的...

 可以看看这里http://www.chinalinuxpub.com/read.htm?id=1254


感謝阿~~
剛剛看完後,哪篇文章講的跟我敘述的不太一樣
它是指加了equal patch後的一些問題

而我的問題是發生在NAT後面主機上網的問題(一頓一頓,常常會開不起來)
從NAT主機ping,tracert都正常,也都有multi-path

目前我已經在下載rh9 iso
想把環境模擬成跟netman學長一樣再來測試看看

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Linux ADSL Multipath Routing Solution
« 回覆 #86 於: 2004-04-14 12:27 »
哦,對了,cisco362 兄,我用的是 2.4.25 kernel 哦....

akong

  • 鑽研的研究生
  • *****
  • 文章數: 523
    • 檢視個人資料
    • http://www.aspa.idv.tw
常被登出
« 回覆 #87 於: 2004-04-14 17:37 »
很奇怪
為什麼併線之後
msn常常被自動登出
是什麼原因呢
還有有關於併頻的nat
是需要如何設定呢

kuolung

  • 俺是博士!
  • *****
  • 文章數: 1031
    • 檢視個人資料
    • http://www.kuolung.net
Re: 常被登出
« 回覆 #88 於: 2004-04-14 18:10 »
引述: "akong"
很奇怪
為什麼併線之後
msn常常被自動登出
是什麼原因呢
還有有關於併頻的nat
是需要如何設定呢


其實這是併線一定會發生的問題,只要您所使用的軟體,會記錄使用者的 ip 都會有這個現象發生,就我所知,這是無解的問題
=========================
http://www.kuolung.net
==========================

akong

  • 鑽研的研究生
  • *****
  • 文章數: 523
    • 檢視個人資料
    • http://www.aspa.idv.tw
...
« 回覆 #89 於: 2004-04-14 18:14 »
真的無解嗎
因為我們都是用併線來用
登入登出的問題如果無法解決
就真的不知道該怎麼辦了
有哪位大大可以提供解決之道
謝謝