首页 » 技术讨论 » 正文

[转帖]實作RouterOS的HTB(RouterOS v5.x)

[前言]
Quality of Service,QoS是讓網路順暢的重要課題,也是小弟最感興趣的。
現在普遍大家的頻寬越來越大,但如果沒有妥善的規劃頻寬,還是可能會讓自己的網路塞車、不順。
比如說現在明明您正在使用視訊,但卻是P2P用掉大部分的頻寬,結果可想而知。
電腦不會這麼聰明知道什麼服務對您來說是重要的,什麼是可以等的,甚至什麼是可有可無的。
這一切都必須先跟電腦約法三章,先約定好頻寬使用的原則,這就是所謂QoS的概念了。
實現QoS手段很多,常見的有”頻寬管理”、”優先權管理”、”擁塞控制管理”、”流量策略與整型”等。

本篇要介紹的是RouterO中S的HTB(Hierarchical Token Bucket)。
HTB可以讓使用者簡單的建立一個優先順序的隊列,各種服務在隊列中有不同的優先權,進而達成QoS。
在RouterOS中其實有另一個簡單的Simple Queues(請看pctine的分享)可以使用。
但Simple Queues是對整個IP或網段做頻寬管理,沒有辦法做到HTB以封包來做管理。
所以如果要很精細的控管網路各流量優先順序的話,HTB的Queues Tree是唯一的選擇了。

[基礎認知]
在進一步的介紹HTB實作前,我們必須先瞭解資料如何進出我們的RouterOS。
瞭解Packet Flow這對於學習ROS的Firewall與mangle等很重要。

1

1.”Download”
當資料下載的時候,WAN端就是來源端,LAN就是目的端。
資料會從RouterOS的WAN interface進入,而從LAN interface離開。
換句話說 in-interface就是WAN,out-interface就是LAN。

WAN使用的是Public IP,LAN端使用的是Private IP。
所以要將資料由WAN送到LAN的某機器時,還必須將外部IP轉換為內部IP。
這轉換就是所謂的Destination Network Address Translation,DNAT。

2.”Upload”
當資料上傳的時候,LAN端就是來源端,WAN就是目的端。
資料會從RouterOS的LAN interface進入,而從WAN interface離開。
換句話說 in-interface就是LAN,out-interface就是WAN。

同樣的,這時必須要將內部IP轉為外部IP。
這轉換就是所謂的Source Network Address Translation,SNAT。

3.另外在建立連線的時候還必須有port的對接,以我們瀏覽網頁來說。
我們會連到網頁伺服器的80port,同時自己的電腦會開啟一個大於1024號的port。
網頁伺服器的IP就是來源IP(Src.Arrdess),80 port就是來源port(Src.Port)。
我們自己電腦的IP就是目的IP(Dst.Address),我們開啟的port就是目的port(Dst.port)。
這來源IP,來源port與目的IP,目的port,合起來建立了一條連線(Socket pair)!

以下是mikrotik原廠的說明圖。(原廠的說明)

Router OS V5.x

2
[標記,Mangle]
我們必須將封包先做標記(Mark),然後再依照這些標記來做後續處理。
所以封包是否標記正確,會直接導致後面QoS的成敗。
小弟努力找了很久的資料,網路資料關於ROS標記的細節並沒有很詳細的說明,大都是直接操作而已。
在標記封包時,我們主要會使用到五種chain:prerouting、forward、postrouting、input、output。
以下是小弟自己的結論,我就簡單講了。

1.prerouting:用來標記下載的封包,但無法以內部IP為範圍來標記。因為prerouting是在
DNAT(外部IP轉內部IP)之前。在使用prerouting時記得搭配in-interface來使用。

2.postrouting:用來標記上傳的封包,在使用postrouting時要搭配out-interface使用。

3.forward:用來標記內部特定IP的封包使用,尤其是用在標記內部特定IP下載封包。
在標記封包時,最常使用的就是forward了,因為搭配interface與Port就可以輕易的標示出上下載。
這裡有篇文章簡單的說明了Forward的使用:ros標記細節解讀(ros mangle),大家參考一下。
不過小弟個人不太常用forward,總覺得似乎用forward比較不精確,這有空再來實驗看看。

4.input:直接進入ROS而不是進入LAN主機的封包,這個比較少用。

5.output:直接由ROS發出,而不是由LAN主機發出的封包,比如如果您有用ROS的DNS代理功能。
區網的電腦就不會直接向WAN做DNS的請求,而是向ROS請求,然後ROS再向WAN請求。
這時DNS封包就是直接由ROS發出,所以標記DNS封包時要使用output這條鍊。

6.所以如果您是單純的向WAN端的Server上下傳資料,標記的方法如下:
A.標記下載:prerouting+Src.Port+in-interface=”您的WAN接口”。
或:forward+Dst.Address(要標記某範圍IP才需要)+Src.port+in-interface=”您的WAN接口”。
B.標記上傳:postrouting+Dst.Port+out-interface=”您的WAN接口”。
或:forward+Src.Address(要標記某範圍IP才需要)+Dst.port+out-interface=”您的WAN接口”。
如果是要標記自己LAN的Server封包,則又略有不同,容後再敘。

[Winbox操作]
以下以標記瀏覽網頁的封包(tcp 80port)為例。
開啟Winbox登入ROS,選擇IP–>Firewall–>Mangle–>新增規則。
雖然有網友說不需要先標記連結再標記封包,但我們還是按部就班來,先標連結再標封包。

1.先來標記”下載”連結。

由下圖可以知道,下載的封包是從我們WAN進入,從LAN離開。
所以標記下載時in-interface要選WAN或者out-interface要選LAN。

3
因為沒有標記特定網段的需求,所以chain選prerouting。
如果要標記某個網段下載的話,就選forward,然後把網段地址打在Dst.Address.
Protocol選tcp,因為是去瀏覽網頁,所以資料會從遠端來源的80port送過來,所以選Src.Port=80。
FTTH是小弟的PPPoE撥號介面,所以in-interface選擇您的PPPoE介面。

4
2.Action選擇標記連結,連結名稱自己取。
Passthrough要打勾,表示這標記後續還要再處理,所以要把這封包繼續往下傳。

5
3.再新增一個Mangle規則,chain跟剛才一致。
Connection Mark是我們要標記的連結,所以選剛剛的那個連結名稱。

6
4.Action選擇標記封包,封包名稱自己取。
因為到這裡就算標記完成,所以Passthrough不要打勾!

7
5.再來網頁標記上傳,如果未來沒有特別要保障網頁上傳的話,其實可以不用標記。
chain選擇postrouting,與prerouting不同的是,這裡如果要標特定網段是可以
在Src.Address輸入要標記的範圍。

8
6.以下步驟跟剛剛一樣,另外不要忘記還要再新增一個規則來標記封包。

9
7.如果標記正確的話,應該可以在Statistics統計的頁面看到流量。
但有流量不要高興的太早,還是必須自己再多方驗證看看這流量是否正確。
有時我們前面標記參數設錯的話,我們可能標示到的不是我們想要的封包。

10
8.大家可以反覆上面的步驟,將自己重要的封包都標記出來。
這些重要的封包都取好名字以後,等下要它們排隊就簡單了^^
在Queues tree的規則裡,封包是以mark package的名字來識別,
而不是用mark connection的名字,所以標記完連結,務必要記得標記封包!

11
9.在標記封包的時候有一個好用的頁面可以輔助我們,在Firewall的”Connections”頁面。
可以自訂很多條件來過濾(Filter)觀察所有的連線,從這裡可以檢查自己的標記是否正確?

12
[區網內部Server的標記方法]
對小弟來說標記server的封包才是最重要的,因為小弟自己有很多服務必須保障。
比如說NAS必須提供影片,IPCam必須提供監視畫面,網路電視盒可以讓我在外面看第四台….

當我們向WAN的Server連線時,對方預設的連接Port是固定的,但我們的連接port是隨機的。
但當我們自己擔任Server時,我們預設的連接Port是固定的,對方的連接Port是隨機的。
下圖為以自己區網的網頁伺服器為例,預設的連接Port固定為80。
所以在標記的時候要稍微換個方式。

13
Server要標記連結的話,跟前面Client標記方法不同,詳如下:
1.標記下載:prerouting+Dst.Port+in-interface=”您的WAN接口”。
或:forward+Dst.Address=”server IP”+Dst.port+in-interface=”您的WAN接口”。
2.標記上傳:postrouting+Src.Address=”Server IP”+Src.Port+out-interface=”您的WAN接口”。
或:forward+Src.Address=”Server IP”+Src.port+out-interface=”您的WAN接口”。

本文共 2 个回复

  • 西米 2016/07/22 16:38

    那如果是多线的话,这个wan口如何定义呢(比如三条ADSL做了PCC)

  • 111 2016/01/31 22:16

    很正,比书上的较详细多了!支持~

回复 西米 取消