七月 17

如果你於RouterOS中使用負載平衡時,你會發現要從RapidShare下載檔案有很大的機會失敗

這是因為當你第1次連到RapidShare上的IP,然後等完看廣告的時間之後要下載檔案的IP不一樣所造成的

舉個例來說,假設第1次連上到RapidShare上的IP是123.1.1.1,但是要下載檔案時

因為負載平衡的關係,使得本次連到RapidShare 的已經變成123.1.1.2

這時就會發生無法下載的情況。

最簡單的解決方式就是,把要連到RapidShare上的連線全部走同1條線路

那麼要怎麼判斷那些連線是要到RapidShare的呢

就是看RouterOS DNS快取裡的Doman與IP的對照表

這個時候就需要使用Script來自動把RapidShare相關的IP濾出來,放到Address List供我們使用

相關的Script如下。新增Script的方式為到Winbox裡 System -> Scripts -> 按介面上的 +

把下面這個Script命名為 Update_RapidShare_IP ,後面會用到

# 把DNS快取裡資料全部讀出來
:foreach i in=[/ip dns cache find] do={
    :local bNew "true";
# 檢查DNS快取裡是否有包含rapidshare的關鍵字
    :if ([:find [/ip dns cache get $i name] "rapidshare"] != 0) do={
        :local tmpAddress [/ip dns cache get $i address] ;

# 轉換rapidshare的IP到"/16"的網段
        :local mjesto ([:find $tmpAddress "."]);
        :set mjesto ([:find $tmpAddress "." $mjesto]);
        :local tmpAddress ([:pick $tmpAddress 0 $mjesto]);
        :set tmpAddress ($tmpAddress . ".0.0/16");

#---- 如果address list是空的就不用查檢了(直接把IP加入)
        :if ( [/ip firewall address-list find ] = "") do={
            /ip firewall address-list add address=$tmpAddress list=RapidShare_IP disabled=no;
        } else={
#------- 檢查每一列的值
            :foreach j in=[/ip firewall address-list find ] do={
#---------- 如果IP已經存在address list就不用新增了
                :if ( [/ip firewall address-list get $j address] = $tmpAddress ) do={
                    :set bNew "false";
                }
            }
#------- 如果IP不存在就新增一筆上去address list
            :if ( $bNew = "true" ) do={
                /ip firewall address-list add address=$tmpAddress list=RapidShare_IP disabled=no
            }
        }
    }
}

接下來則是設定每30秒自動執行1次(相關設定如圖所示),隨時更新

System -> Scheduler -> 按介面上的 +

把這個 Scheduler 命名為 Auto_Update_RapidShare_IP

/system script run Update_RapidShare_IP

最後一個步驟就是判斷只要目的位置是在RapidShare_IP這個Address List裡的話

就強迫走單一路由。怎麼設定就因人而異了,不過大方向是不變的

有了RapidShare的相關IP,要針對RapidShare做限速、擋掉….等,都很方便了

相關參考資料:
Fight against P2P on port 80





六月 03

首先先說明一下實做的環境,如下圖

要在 RouterOS 中實現多條 ADSL 負載平衡與自動備援並不困難

但是主要的問題會是 ADSL 的 閘道(Gateway),都是同一個位置(假設是同一家ISP)

要解決這個問題必需使用 Mangle 裡的標記(mark) 且配合 nth,請看以下範例

使用 Mangle 裡的標記(mark) 且配合 nth 可以解決ADSL 負載平衡的問題。

而自動備援的問題,則是在 NAT 裡加入一行不指定條件的 masquerade 即可(需放置於正常有指定條件masquerade的後面)

設定檔的使用方式很簡單,先在 Winbox 的左邊點選 New Terminal

然後把下面的設定檔貼上就可以了


#以下設定檔在 RouterOS 3.20 下測試通過

/interface pppoe-client
add ac-name="" add-default-route=no allow=pap,chap,mschap1,mschap2 comment=\
"" dial-on-demand=no disabled=no interface=掛載ADSL-1的網卡 max-mru=1480 max-mtu=1480 \
mrru=disabled name=ADSL-1 password=ADSL-1密碼 profile=default service-name="" \
use-peer-dns=yes user=ADSL-1帳號
add ac-name="" add-default-route=no allow=pap,chap,mschap1,mschap2 comment=\
"" dial-on-demand=no disabled=no interface=掛載ADSL-2的網卡 max-mru=1480 max-mtu=1480 \
mrru=disabled name=ADSL-2 password=ADSL-2密碼 profile=default service-name="" \
use-peer-dns=yes user=ADSL-2帳號

/ip firewall mangle
#讓外部可以連通本機多條 ADSL
add action=mark-connection chain=input comment=\
"\C5\FD\A5~\B3\A1\A5i\A5H\B3s\B3q\A5\BB\BE\F7\A6h\B1\F8 ADSL" disabled=no \
in-interface=ADSL-1 new-connection-mark=from_adsl_1 passthrough=yes
add action=mark-routing chain=output comment="" connection-mark=from_adsl_1 \
disabled=no new-routing-mark=to_adsl_1 passthrough=yes
add action=mark-connection chain=input comment="" disabled=no in-interface=\
ADSL-2 new-connection-mark=from_adsl_2 passthrough=yes
add action=mark-routing chain=output comment="" connection-mark=from_adsl_2 \
disabled=no new-routing-mark=to_adsl_2 passthrough=yes

#內部網路負載平衡
add action=mark-connection chain=prerouting comment=\
"\A4\BA\B3\A1\BA\F4\B8\F4\ADt\B8\FC\A5\AD\BF\C5" connection-state=new \
disabled=no in-interface=請改成你的內部網卡 new-connection-mark=nth_1 nth=2,1 \
passthrough=yes
add action=mark-routing chain=prerouting comment="" connection-mark=nth_1 \
disabled=no in-interface=請改成你的內部網卡 new-routing-mark=to_adsl_1 passthrough=no
add action=mark-connection chain=prerouting comment="" connection-state=new \
disabled=no in-interface=請改成你的內部網卡 new-connection-mark=nth_2 passthrough=yes
add action=mark-routing chain=prerouting comment="" connection-mark=nth_2 \
disabled=no in-interface=請改成你的內部網卡 new-routing-mark=to_adsl_2 passthrough=no

/ip firewall nat
#線路正常時,依負載平衡走不一樣的 ADSL 線路出去
add action=masquerade chain=srcnat comment="\BDu\B8\F4\A5\BF\B1`\AE\C9\A1A\A8\
\CC\ADt\B8\FC\A5\AD\BF\C5\A8\AB\A4\A3\A4@\BC\CB\AA\BA ADSL \BDu\B8\F4\A5X\
\A5h" disabled=no out-interface=ADSL-1 routing-mark=to_adsl_1
add action=masquerade chain=srcnat comment="" disabled=no out-interface=\
ADSL-2 routing-mark=to_adsl_2

#ADSL 斷線自動備援
add action=masquerade chain=srcnat comment=\
"ADSL \C2_\BDu\A6\DB\B0\CA\B3\C6\B4\A9" disabled=no

/ip route
#設定 ADSL 路由
add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=ADSL-1 \
routing-mark=to_adsl_1
add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=ADSL-2 \
routing-mark=to_adsl_2
add comment="" disabled=no distance=1 dst-address=0.0.0.0/0 gateway=\
ADSL-1,ADSL-2

/ip route print