在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 thoughts on “在RouterOS中實做雙ADSL負載平衡,與ADSL斷線自動備援

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

    請問要怎樣排除 = = 我是設定 PPPOE 撥上網 每一個帳號都是不同網段

    1. 要解決這個問題最簡單的方法就是,強迫該遊戲所使用到的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

    1. 對的,就封包固定出去時,是那某個特定的port,就只能走ADSL 1
      這樣子就不會有2條同時出去的問題

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

      設定的方式可能要請你try一下

    1. 每個遊戲的 port 都不一樣,你可以找找官網,或是用wireshark抓封包自已解
      要判斷是不是BT的封包,Firewall裡面有個P2P封包的選項可以選

  2. 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
    請問大大 是什意思ㄋ

    1. 先切換到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

  3. 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線 有時候跑二線 = =

    1. 先確認有沒有使用到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

  4. 測試結果 到最後 還是 指定網段 走某一線出去

    用PORT來跑 一樣也是會瞬段

    還是用網段 來限定比較容易 也比較穩定

    1. to yauger:
      1.你要先有國內學術的IP清單
      2.依據清單去對封包做分流mark connection + mark routing 最後在 IP -> Route 裡面依據你設定的mark routing去做路由就可以了

  5. 請問第15行comment=\
    “\C5\FD\A5~\B3\A1\A5i\A5H\B3s\B3q\A5\BB\BE\F7\A6h\B1\F8 ADSL”這些代表什麼呢?最近煩惱要用PCC還是NTH~~你的段線備援好特別喔!!不懂她的原哩!!

  6. 請教一下, 我有3條FTTB, 3條各用PPPoe取得7浮動IP 共會有21個IP , 我有一台 Web Server 架了21個站, 只插一張網卡, 使用內部192.168.x.x 的內部IP,
    如果使用這台RB750同時連接3條FTTB. 我可以設定這21個IP 各自NAT到 伺服器的21個站嗎?

  7. to gina:
    設定上是沒問題,可以做的到,
    但效能上RB750是否可以勝任,可能要實際上線試試看。

    以RB750的硬體,可能會撐不住21台,不過這也只是我的猜測。

  8. 您好:
    想請問如果我想要照IP位址來做可以嗎?
    EX
    192.168.1.1-100 走 ADSL1線路。
    192.168.1.101-254 走 ADSL2線路。

    請問我因該在哪裡下功夫,謝謝。

  9. 哈哈!我這人真的很奇怪!
    每次都是發完問題自己在試成功了。自問自答一下。

    要先去/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,但不知道為啥這樣會失敗,哈。

  10. 提供一下找到且在 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 連外網

  11. 大大,請教是否可以做到>>雙ADSL負載平衡,與ADSL斷線自動備援,內部IP按IP數量平均分配到二線,而不是按Session數或流量大小分配,以防止任何狀況走不同線而出問題。

  12. to 馬汀:

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

    規則可以依想要做的方式,而有所不同

  13. to 馬汀:

    使用winbox連線進去後。
    IP -> DHCP Server -> Leases -> 點2列表上,未綁定的IP -> Make Static
    這樣子,就可以綁定MAC與IP了

  14. 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

  15. 您好,
    關於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

  16. to joejoe:

    http://wiki.mikrotik.com/wiki/Manual:PCC

    /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

  17. 了解,
    所以就變成 3/0 走第Wan1
    3/1 原本走第Wan2但若偵測到斷線就改走Wan1
    3/2 走 Wan3

    而不用改為 2/0 Wan1 2/1 Wan3 摟..

  18. to joejoe:

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *