RouterOS 網路負載平衡

Mason Lyu
MischievousBOSS
Published in
6 min readAug 4, 2019

Load Balancing — Pros & Cons

在RouterOS中,所有的網路埠都可以設定成WAN或LAN,因此我們可以將其中幾個網路埠當成WAN來使用,這時候如果有申請不同網路服務商 (ISP) 的線路,就可以做網路負載平衡及備援。同一個ISP則意義不大,除非都是單獨拉專線,否則真要斷線也是一起斷。

要在RouterOS達到網路負載平衡 (Load Balancing),最後一步一定是透過策略路由 (Policy Route) 來決定資料走向,但是要如何作分配呢?其中就有三種作法可以參考。至於RouterOS所有的方式則可以參考MikroTik Load Balancing

ECMP (Equal Cost Multi-Path)

有關ECMP的詳細步驟,可以參考MikroTik ECMP load balancing with masquerade,主要是在Default Gateway將所有可連接的Gateway寫在一起

/ip route 
add dst-address=0.0.0.0/0 gateway=10.1.1.254,10.2.1.254,10.3.1.254 check-gateway=ping

Pros

  • 擁有簡單的容錯移轉機制,一旦其中一條路徑斷了,自然改由其他剩餘有效路徑來平均分配

Cons

  • 要特別注意並增加連線至RouterOS本身的Policy Route,因為來自A路徑的封包可能會經由B路徑出去,這時原本預計收到來自A路徑封包的設備會丟棄來自B路徑封包,造成連線失敗。
  • 有些ISP內的主機(譬如DNS)僅提供給該ISP的線路,這時經由不同ISP線路出去的request可能不被接受。

NTH <第N個封包或連線>

有關NTH的詳細步驟,可以參考MikroTik NTH load balancing with masquerade,主要是在防火牆標記這裡,指定封包或連線的次序。

譬如我們利用NTH=3,1來讓每三個封包中的第一個標記為Gateway_1;利用NTH=3,2來讓每三個封包中的第二個標記為Gateway_2;利用NTH=3,3來讓每三個封包中的第三個標記為Gateway_3

/ip firewall mangle 
add action=mark-packet chain=prerouting new-packet-mark=Gateway_1 nth=3,1 passthrough=yes
add action=mark-packet chain=prerouting new-packet-mark=Gateway_2 nth=3,2 passthrough=yes
add action=mark-packet chain=prerouting new-packet-mark=Gateway_3 nth=3,3 passthrough=yes

或者也可以透過順序的調整,利用NTH=3,1來讓每三個封包中的第一個標記為Gateway_1;利用NTH=2,1來讓後面兩個封包中的第一個標記為Gateway_2,第二個標記為Gateway_3

/ip firewall mangle 
add action=mark-packet chain=prerouting new-packet-mark=Gateway_1 nth=3,1 passthrough=no
add action=mark-packet chain=prerouting new-packet-mark=Gateway_2 nth=2,1 passthrough=no
add action=mark-packet chain=prerouting new-packet-mark=Gateway_3

Pros

  • 能完整的根據區網內的所有來源平均分配負載

Cons

  • 區網內的Server對外服務要注意路徑
  • 如果任何一條路徑斷了,其設定的路由標記將無作用,改由Default Route出去,增加Default Route的負載。

PCC (Per Connection Classifier)

有關PCC的詳細步驟,可以參考MikroTik PCC,如果想了解PCC運作原理,可以參考How PCC Works,簡單說就是把Source IP、Source Port、Destination IP、Destination Port取需要的整數相加後,再將其總和的個位數除以指定值,而得到的餘數來作決定。

主要是在防火牆標記這裡,根據來源/目標的位置與埠的組合運算,來各別指定給予連線標記。

譬如我們將Source IP與Source Port相加後,其總和的個位數除以3得到的餘數若為0,則該連線標記為Gateway_1;若為1,則該連線標記為Gateway_2;若為2,則該連線標記為Gateway_3

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

Pros

  • 因為判斷條件變化性多,當區網內設備夠多時,能以類似Random的方式動態平均分配負載

Cons

  • 因為是採用餘數制,區網內設備少時,有機會負載集中落在其中幾條,譬如10.0.0.3:443與10.0.0.6:80就落在同一條。
  • 如果任何一條路徑斷了,其設定的路由標記將無作用,改由Default Route出去,增加Default Route的負載。

如果Gateway是同一個怎麼辦?

假如你申請了兩條線路,而ISP給你的Gateway是同一個,那麼當你在設定Route時,可以透過「%」符號重複指定不同的Routing Mark給同一個Gateway,譬如Gateway都是168.95.98.254

/ip route
add gateway=168.95.98.254%WAN1 routing-mark=To_WAN1
add gateway=168.95.98.254%WAN2 routing-mark=To_WAN2

相關範例可以參考MikroTik Load balancing multiple same subnet links

--

--