在RouterOS中實做雙ADSL負載平衡,與ADSL斷線自動備援

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

要在 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

評論 (39) -

  • 大大  我依照你的方法設定  
    的確 雙線 都會有動作  但是出現一個問題
    就是 ~~ 遊戲會斷線  ~~ 會自己 有時跑一線 有時跑二線

    請問要怎樣排除  = =  我是設定 PPPOE 撥上網 每一個帳號都是不同網段
  • 要解決這個問題最簡單的方法就是,強迫該遊戲所使用到的port,統一走某條ADSL出去

    下面這個規則在Firewall的Mangle中,你可以參考一下

         chain=prerouting action=mark-connection new-connection-mark=nth_1
         passthrough=yes connection-state=new protocol=tcp in-interface=LAN
         dst-port=遊戲用的到Port

         chain=prerouting action=mark-routing new-routing-mark=to_adsl_1
         passthrough=no in-interface=LAN connection-mark=nth_1
  • 那就是  依照你上面所寫ㄉ那先 都弄進去 玩家  直接 強迫 port 跑哪邊就好ㄌ嗎?
  • 對的,就封包固定出去時,是那某個特定的port,就只能走ADSL 1
    這樣子就不會有2條同時出去的問題

    如果有負載的問題,可以再切網段去跑
    例如:網段1的遊戲port全部走ADSL 1,網段2的遊戲port全部走ADSL 2,以此類推

    設定的方式可能要請你try一下
  • 可以請問一下  遊戲的PORT 大概是多少
    我的想法是  BT 那一類的 走1線  遊戲走二線
  • 每個遊戲的 port 都不一樣,你可以找找官網,或是用wireshark抓封包自已解
    要判斷是不是BT的封包,Firewall裡面有個P2P封包的選項可以選
  • add chain=prerouting action=mark-connection new-connection-mark=nth_1 passthrough=yes connection-state=new protocol=tcp in-interface=LAN dst-port=21457


    add chain=prerouting action=mark-routing new-routing-mark=to_adsl_1 passthrough=no in-interface=LAN connection-mark=nth_1

    這樣輸入之後 出現錯誤
    input does not match any value of interface
    請問大大 是什意思ㄋ
  • 先切換到mangle下面

    /ip firewall mangle

    add chain=prerouting action=mark-connection new-connection-mark=nth_1 passthrough=yes connection-state=new protocol=tcp in-interface=LAN dst-port=21457
    add chain=prerouting action=mark-routing new-routing-mark=to_adsl_1 passthrough=no in-interface=LAN connection-mark=nth_1
  • in-interface=LAN   <== 要設定 什ㄇ 對外網卡  還是對內網卡
  • 在請問一下 ....
    可否針對 內部 PPPOE帳號 來選擇 她要走 1線 還是二線
  • add chain=prerouting action=mark-connection new-connection-mark=nth_1 passthrough=yes connection-state=new protocol=tcp in-interface=ether1 dst-port=1-65535
    add chain=prerouting action=mark-routing new-routing-mark=to_adsl_1 passthrough=no in-interface=ether1 connection-mark=nth_1

    依照這樣設定  還是沒有依照現制 有時候跑1線 有時候跑二線 = =
  • 可以依據內部PPPOE後所取得的IP來當作判斷走那條線路的條件
  • 先確認有沒有使用到UDP的協定,上面這條規是只給TCP協定用的

    如果你要做實驗可以試試這樣子

    add chain=prerouting action=mark-connection new-connection-mark=nth_1 passthrough=yes connection-state=new in-interface=ether1
    add chain=prerouting action=mark-routing new-routing-mark=to_adsl_1 passthrough=no in-interface=ether1 connection-mark=nth_1
  • 測試結果  到最後 還是 指定網段 走某一線出去

    用PORT來跑 一樣也是會瞬段

    還是用網段 來限定比較容易 也比較穩定
  • 這樣子也是可以

    如果對方的IP是固定的話,也可以用對方的IP來判斷走固定的線路出去
  • Dear sir
    請問如何做到 撥號adsl+固IP分流(例如國內學術走學術固ip,其餘走adsl)
    感謝您
  • to yauger:
    1.你要先有國內學術的IP清單
    2.依據清單去對封包做分流mark connection + mark routing 最後在 IP -> Route 裡面依據你設定的mark routing去做路由就可以了
  • 請問第15行comment="\C5\FD\A5~\B3\A1\A5i\A5H\B3s\B3q\A5\BB\BE\F7\A6h\B1\F8 ADSL"這些代表什麼呢?最近煩惱要用PCC還是NTH~~你的段線備援好特別喔!!不懂她的原哩!!
  • 請教一下, 我有3條FTTB, 3條各用PPPoe取得7浮動IP 共會有21個IP , 我有一台 Web Server 架了21個站, 只插一張網卡, 使用內部192.168.x.x 的內部IP,
    如果使用這台RB750同時連接3條FTTB. 我可以設定這21個IP 各自NAT到 伺服器的21個站嗎?
  • to gina:
    設定上是沒問題,可以做的到,
    但效能上RB750是否可以勝任,可能要實際上線試試看。

    以RB750的硬體,可能會撐不住21台,不過這也只是我的猜測。
  • vic
    您好:
    想請問如果我想要照IP位址來做可以嗎?
    EX
    192.168.1.1-100     走 ADSL1線路。
    192.168.1.101-254 走 ADSL2線路。

    請問我因該在哪裡下功夫,謝謝。
  • vic
    哈哈!我這人真的很奇怪!
    每次都是發完問題自己在試成功了。自問自答一下。

    要先去/IP Firewall Addrss List 設List
    /ip firewall address-list> add address=List1_To_ADSL1 disabled=no list=192.168.1.1-192.168.1.100
    /ip firewall address-list> add address=List2_To_ADSL2 disabled=no list=192.168.1.101-192.168.1.254

    然後在家jason大中的mark-routing那兩條規則分別指定上src-address-list=List1_To_ADSL1 OR List2_To_ADSL2就好了。

    之前都不行是因為我都做半,mark-routing規則只有一條有指定src-address-list為其中一個建立的address-list,但不知道為啥這樣會失敗,哈。
  • 提供一下找到且在 5.25 上設定後確認可用的設定

    網路環境:
    RouterOS 接在 CISCO Router 後面,網段 10.0.0.64/28
    可用公網 IP:10.0.0.65/28 與 10.0.0.66/28,Gateway 10.0.0.67
    內網 IP 範圍:192.168.88.0/24

    /ip address
    add address=192.168.88.1/24 comment=Lan disabled=no interface=master-local network=192.168.88.0
    add address=10.0.0.65/28 comment=WAN disabled=no interface=wan1 network=10.0.0.64
    add address=10.0.0.66/28 comment=WAN disabled=no interface=wan2 network=10.0.0.64
    /ip firewall address-list
    add address=192.168.88.0/24 disabled=no list="LAN IP"
    /ip firewall nat
    add action=masquerade chain=srcnat disabled=no out-interface=wan1
    add action=masquerade chain=srcnat disabled=no out-interface=wan2
    add action=masquerade chain=srcnat disabled=no
    add action=masquerade chain=srcnat disabled=no src-address-list="LAN IP"
    add action=masquerade chain=srcnat disabled=no out-interface=!master-local
    /ip firewall mangle
    add action=mark-connection chain=input disabled=no in-interface=wan1 new-connection-mark=from_wan1 passthrough=yes
    add action=mark-routing chain=output connection-mark=from_wan1 disabled=no new-routing-mark=to_wan1 passthrough=yes
    add action=mark-connection chain=input disabled=no in-interface=wan2 new-connection-mark=from_wan2 passthrough=yes
    add action=mark-routing chain=output connection-mark=from_wan2 disabled=no new-routing-mark=to_wan2 passthrough=yes
    add action=mark-connection chain=prerouting disabled=no dst-address-type=!local in-interface=wan1 new-connection-mark=from_wan1 passthrough=yes per-connection-classifier=both-addresses:2/0 src-address-list="LAN IP"
    add action=mark-routing chain=prerouting connection-mark=from_wan1 disabled=no new-routing-mark=to_wan1 passthrough=yes src-address-list="LAN IP"
    add action=mark-connection chain=prerouting disabled=no dst-address-type=!local in-interface=wan2 new-connection-mark=from_wan2 passthrough=yes per-connection-classifier=both-addresses:2/1 src-address-list="LAN IP"
    add action=mark-routing chain=prerouting connection-mark=from_wan2 disabled=no new-routing-mark=to_wan2 passthrough=yes src-address-list="LAN IP"
    /ip route
    add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=10.0.0.67%wan1 routing-mark=to_wan1 scope=30 target-scope=10
    add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=10.0.0.67%wan2 routing-mark=to_wan2 scope=30 target-scope=10
    add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=10.0.0.67 scope=30 target-scope=10

    這樣設定完後,使用 traceroute 去 trace 168.95.1.1
    interface 選擇 wan1 或 wan2 都可以成功

    不過以下的問題仍舊存在
    1. PPTP VPN 從 wan1 或 wan2 進來還是只會從其中一條路出去,至於走那一條看 gateway=10.0.0.67 顯示的是 reachable wan1 還是 reachable wan2
    2. L2TP over VPN 只有一條路能撥進來,至於那一條能撥進來,一樣看 gateway=10.0.0.67 顯示的是 reachable wan1 還是 reachable wan2
    3. OpenVPN 只能連內網,不能經由 VPN 連外網
  • 大大,請教是否可以做到>>雙ADSL負載平衡,與ADSL斷線自動備援,內部IP按IP數量平均分配到二線,而不是按Session數或流量大小分配,以防止任何狀況走不同線而出問題。
  • to 馬汀:

    可以的,給你的方向。
    判斷內部來源的IP為192.168.1.1~192.168.1.100,走ADSL1
    判斷內部來源的IP為192.168.1.101~192.168.1.200,走ADSL2

    規則可以依想要做的方式,而有所不同
  • Jason大,對ros是初步接觸,對此能做到的功能跟您請教一下,是否能做到DHCP自動取得IP後並自動綁定MAC?
  • to 馬汀:

    使用winbox連線進去後。
    IP -> DHCP Server -> Leases -> 點2列表上,未綁定的IP -> Make Static
    這樣子,就可以綁定MAC與IP了
  • 您好,
    請問PCC有辦法測試線路是否正常運作後自動修改PCC的設定(把斷線的排除在PCC外)嗎?
  • to 訪客:

    在ROS中寫script配合scheduler應該可以達成
  • 您好,請問有相關的 範例及說明嗎?
    因為網路上都找不到類似的作法。
  • to joejoe:

    這邊提供一些思維,實作的部份,可能就要請你google或自行研究了。

    1.要知道如何進行測試線路是否正常,可用 /ping interface=AR2_ADSL-1 address=168.95.1.1  測試

    2.不正常,透過script把pcc的規則關掉。正常了,透過script把pcc的規則打開。

    3.script的部份,可以參考官方wiki
    http://wiki.mikrotik.com/wiki/Manual:Scripting
  • 您好,
    關於script卡在 pcc 的 /? ..? 的設定問題,因為沒辦法確定斷幾條或是哪幾條斷,所以不知道 /? ..? 這邊的值該怎麼處理,另外想請教一下,我要做 dstnat 但發現,一個ip只要做過一個 dstnat 就沒辦法做 第二個了,
    EX:
    1.1.1.1:3389 轉內部 192.168.0.1:3389
    1.1.1.1:3388 轉內部 192.169.0.2:3389
    這時 0.1 的 會通 但 0.2 的不會通,但看 log 又有 1.1.1.1:3388 的連線記錄

    而把設定改為
    1.1.1.2:3388 轉內部 0.2:3380 就ok
  • detnat 部分搞定了,原來是因為去回不同路的關係,所以內部server 要指定特別走進來的線路出去..
  • to joejoe:

    http://wiki.mikrotik.com/wiki/ManualTongCC

    /ip firewall mangle add chain=prerouting action=mark-connection   new-connection-mark=2nd_conn per-connection-classifier=src-address-and-port:3/1

    假設 2nd_conn 這條線斷掉,你可以用script改成有通的連線

    例如改成:

    /ip firewall mangle add chain=prerouting action=mark-connection   new-connection-mark=1st_conn per-connection-classifier=src-address-and-port:3/1
  • 了解,
    所以就變成 3/0 走第Wan1
    3/1 原本走第Wan2但若偵測到斷線就改走Wan1
    3/2 走 Wan3

    而不用改為 2/0 Wan1 2/1 Wan3 摟..
  • to joejoe:

    是的,斷線後要改走那一條,可依據網路狀況而定。原則就是pcc的規則不動,只動出去的connection-mark
  • Hi joejoe:

    facebook我已經很少在用,可用email,每天都會收信。
    jokkson@gmail.com

新增評論

Loading