• 2

[分享]實作RouterOS的HTB(上篇)

[感謝]
感謝在小弟學習RouterOS的過程中,給予協助的pctine、jokkson、YAWPYNG、npc等前輩。
也希望RouterOS的眾家高手可以繼續不吝分享心得,以下分享若有謬誤,還請包含與指正。

[系列文章]
[分享]實作RouterOS的HTB(上篇)
[分享]實作RouterOS的HTB(中篇)
[分享]實作RouterOS的HTB(中下篇)

[前言]
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等很重要。

[分享]實作RouterOS的HTB(上篇)

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原廠的說明圖。(原廠的說明)
[分享]實作RouterOS的HTB(上篇)

[標記,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。
[分享]實作RouterOS的HTB(上篇)

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

2.Action選擇標記連結,連結名稱自己取。
Passthrough要打勾,表示這標記後續還要再處理,所以要把這封包繼續往下傳。
[分享]實作RouterOS的HTB(上篇)

3.再新增一個Mangle規則,chain跟剛才一致。
Connection Mark是我們要標記的連結,所以選剛剛的那個連結名稱。
[分享]實作RouterOS的HTB(上篇)

4.Action選擇標記封包,封包名稱自己取。
因為到這裡就算標記完成,所以Passthrough不要打勾!
[分享]實作RouterOS的HTB(上篇)

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

6.以下步驟跟剛剛一樣,另外不要忘記還要再新增一個規則來標記封包。
[分享]實作RouterOS的HTB(上篇)

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

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

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

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

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

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接口"。

這篇分享到這裡好像已經太長了,所以其他的就留到下篇吧。
2013-03-20 22:24 發佈
文章關鍵字 RouterOS HTB

derliang wrote:
[感謝]感謝在小弟學...(恕刪)


QoS 這塊太難了, 小弟難碰都不太敢碰, 交給大哥你了!
FB: Pctine
請問樓主,您用的RouterOS版本是5.x嗎? 如果是的話,可否幫我看看CPU的loading如何嗎?

之前買過一台RB750,想來跑Transparent QoS,當時還在4.17版的樣子,5.0剛出,但是同樣的設定檔與流量,CPU的負載在5.0會就是比4.17高出很多,用消去法把設定一條條拿掉還是找不出原因~~

後來因為其他因素,最後機器一直閒置到現在

RouterOS不錯,只是真的難上手啊

valsily wrote:
請問樓主,您用的RouterOS版本是5.x嗎? 如果是的話,可否幫我看看CPU的loading如何嗎?...(恕刪)


您好:我讓系統記錄一陣子CPU loading的記錄,明天再來分享。
不過我發現一個問題想先請教大家。

小弟設置好了HTB 隊列後,雖然將icmp的優先權設為1,但實際上在網路流量loading較重的時
對外的ping值還是會飆高,不知道還有那邊沒有設定好。
irsjx2vxo3ne3k84dr1dz4,r4pe8bez3/4ne3bq4bew2j92gea jx4hq me-2d8 e3hy4hi2ty k84!

pctine wrote:
QoS 這塊太難了, 小弟難碰都不太敢碰, 交給大哥你了!


老大:您別鬧了,小弟還指望您來研究一下ROS為人津津樂道的QoS部分勒。
我測了一陣子以後,對於ROS的HTB部分還是有很多的疑惑,尤其是在mangle的部分。
我看您老ROS也摸的差不多了,一起來撩下去吧。
irsjx2vxo3ne3k84dr1dz4,r4pe8bez3/4ne3bq4bew2j92gea jx4hq me-2d8 e3hy4hi2ty k84!

derliang wrote:
小弟設置好了HTB 隊列後,雖然將icmp的優先權設為1,但實際上在網路流量loading較重的時
對外的ping值還是會飆高,不知道還有那邊沒有設定好。...(恕刪)


小弟的猜測: 就像救護車, 它的優先權較高, 但碰到塞車時, 不表示它還是可以開到時速 100.
FB: Pctine
irsjx2vxo3ne3k84dr1dz4,r4pe8bez3/4ne3bq4bew2j92gea jx4hq me-2d8 e3hy4hi2ty k84!

pctine wrote:
小弟的猜測: 就像救護車, 它的優先權較高, 但碰到塞車時, 不表示它還是可以開到時速 100.


這交通警察不夠力喔^^
救護車來了,交通警察應該把塞車的車子都趕跑:)
irsjx2vxo3ne3k84dr1dz4,r4pe8bez3/4ne3bq4bew2j92gea jx4hq me-2d8 e3hy4hi2ty k84!
想請教derliang版友
關於P2P標示封包的設定

以下是我的設定
add action=mark-connection chain=postrouting comment="P2P Upload" \
dst-address=0.0.0.0/0 new-connection-mark=P2P_upload out-interface=WAN \
p2p=all-p2p
add action=mark-packet chain=postrouting connection-mark=P2P_upload \
dst-address=0.0.0.0/0 new-packet-mark=p2p_up out-interface=WAN \
passthrough=no
關於以上紅字部份的out-interface 是要選擇插WAN線的介面?還是在PPP設定的PPP Client?

另外我使用以上的設定在Statistics看流量,都沒動靜,不知道是哪裡有錯呢?
請指點一二 感謝啦

guoshuchang wrote:
關於以上紅字部份的out-interface 是要選擇插WAN線的介面?還是在PPP設定的PPP Client?


out-interface要選PPP的名稱。
例如我的PPPoE取名FTTH,那麼就要設定為out-interface=FTTH。

guoshuchang wrote:
另外我使用以上的設定在Statistics看流量,都沒動靜,不知道是哪裡有錯呢?


建議拿掉dst-address=0.0.0.0/0。
另外您用ROS內建的連線種類來標記p2p,這效果可能不是很好。
一來現在的P2P不一定都是用內建的port在跑,二來可能封包有加密,這也會造成標記失敗。
但您可以先試試看這樣標記出來的流量跟你實際P2P的流量是否吻合。
irsjx2vxo3ne3k84dr1dz4,r4pe8bez3/4ne3bq4bew2j92gea jx4hq me-2d8 e3hy4hi2ty k84!
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?