搜尋此網誌

2011/05/17

詳談Tomato / TomatoUSB的QoS及QoS知識(一)

再談QoS知識
本文為Toastman_BKK 發表於TomatoUSB上的文章,他是針對Tomato寫的,並不是特別針對RT-N16專門安裝的Tomato / TomatoUSB,在某些狀況下,其指出的設定值是可以在RT-N16下放大的(因為RT-N16有128MB記憶體,和其它內建8~32MB記憶體的路由器比起來,是相當的大)


原文網址:http://tomatousb.org/tut:using-tomato-s-qos-system
原文參考的文章在此:http://www.linksysinfo.org/forums/showthread.php?t=60304

本中譯版為本人自譯,並不是逐句翻譯,本人並非專業人士,不保證譯成中文後為正確的原意;如有疑問,請自行參考原文;本文章非經作者同意,一律禁止轉載

文章中的「我」皆為「原作者」

翻譯自15 May 2011, 09:46 GMT+0800的版本

前言沒翻,太懶了,直接略過,意思大約是說非官方的Firmware大多是用Linux做的,Linux可實現QoS的管理,而Tomato中分將QoS分類為10種:Highest, High, Medium, Low, Lowest, A, B, C, D, E,並分別設定不同的QoS,本文以一個有數百人的區域網路來說,沒有QoS前,Ping值在250-450ms間,有了QoS後,Ping值在35-55間,其中包括了P2P,Mail,視訊,IPTV,即時通,,Skype,VOIP,檔案傳送,YouTube及你想得到的東西。而對大多數的人來說,能正常的瀏覽網頁是最重要的。作者另外提到:如果你連幾頁QoS的說明都懶得看,乾脆直接去看電視好了。




[1] 了解路由器中的QoS,以及它是如何運作

讓我們對剛使用Tomato的使用者,來解說一下QOS的系統:
Incoming vs Outgoing QoS
很多的QoS文章,讓人們感到困惑,尤其是對剛入門者來說,它如何使用,或是並沒有什麼樣的功能等等常搞不清楚。直接來說,就是它並不是「為了上傳的QoS,或是為了下載的QoS」

常見的用法是在上傳的頻寬中設定 QoS;很多人不知道它如何控制下載的頻寬,以致於在討論區上說:「QoS沒用」,「下載的設定和垃圾沒兩樣」等等。

如果QoS能管理下載頻寬的話,則它會比目前只設定上載的QoS更為有用。有不少人不想用QoS的原由是,它只能善加處理上傳的頻寬,如此一來,它並不是一個完全可用的東西,太多小白在討論區上寫類似的東西了,以致於更多的人認為它是一個事實。

那路由器中QoS如何運作,如果它只管理上傳的封包,那如何處理下載的網路流量? 其實很簡單。[在此我們只侷限於TCP的傳輸協定]

如果有上千人應你的要求,並依照你提供的地址,寄給你郵件或是包裹。在你還沒發出要求之前,他們並不認識你,不會寄給你任何東西。但是如果你發出你的地址給對方,並要求10封信和10個包裹時,對方就會寄出10封信和10個包裹。如果要求的數量有變,對方也會依相對的要求寄出。如果你一次收到太多的郵件,你會先停止送出要求或是回應,直到降到一個可處理的數量範圍。不請自來的郵件,則忽略掉,或是慢一點處理;如此寄送者會送少一點,或是直接放暫時一陣子。簡單的說,就是你經由停止送出請求,來減少收到的郵件。

如果你收到信件的來源,是經由不同的地方寄出的,那對那些不重要的郵件,可經由延遲送出要求的方式來調節。

如此的作法,並不能保證寄件者會照著作,但是你可以影響對方的行為,這就是我們想要的了!

你收到的郵件中,大部份的比例都是應你要求才寄給你。如果你送了一個要求,但是卻收到10份郵件,那就是1:10的比例。你已經可以控制到,可要求收到多少郵件;送出1000個要求可收到10000個回應--這已經超過你的郵務人員能處理的範圍,依經驗,你可以算出寄送比例,並依要收到多少郵件,送出想對比例的要求。**限定**送出的要求,則你的 郵務人員 才能處理收到的郵件,如果你不對送出的要求數量設限,則很快的收到的郵件量,將會因為數量太多,而失去控制。

如果太多的郵件送達,你可以拒收。因這些沒寄到的郵件,使得寄件者會送得慢些,或是就停止不送件。

這並不是一個完美的方式,但是路由器的QoS的運作方式,就是類似此種情況--你要依經驗,限制送出的要求數和收到的流量,但這樣子還不夠,我們還可以拒絕收到的封包,來讓送出端的資料送慢些。

問題是你不能百分百控制送到你PC上的流量,因為路由器永遠不會知道:在任一時間內,會有多少封包送達你的電腦? 用什麼樣的順序? 從哪台主機來的? 路由器可能記得你送出去的封包,並檢視有哪些是回應回來的,並做相對應的回應。QoS系統會藉由送出的封包,來影響收到的封包資料,就如同上方的收送郵件的例子一樣。

讓我們看看如何影響「送貨端」,假如我們決定某一個送貨端比其它點還重要,我們可選擇對它送出的優先權為第一,並把其它的請求慢一點送。如有上百個「送貨端」給你封包,你可以把它們的送出優先權定義為各種的class,並經由優先權高低來送出要求。

這就是路由器為主的QoS系統,而且也是它們當初在被開發時的設計方向,別單單只是控制資料上傳! 但是你不能只是像點選一個「我在做重要事情時,限制所有P2P的流量」這種選項,你要明確的告訴路由器設定。要做到此設定,就要了解如何經由維護上傳的資料,來控制下載的資料、class的優先權及收到封包的目的地。增加這些設定後,我們便有能力限制或是對上傳及下載的雙向頻寬,進行流量塑形。

最後,我們也要考慮UDP封包(更難控制),以及如何有效率的控制以UDP為主要資料流的應用程式(VOIP,多媒體等等)

依你的要求,可能要花數小時的時間,讓你的QoS系統可以運作。我的目標是讓你可以做到你想要的。




[2] 設定你的頻寬限制,以及對不同的應用程式定義規則

參考P2P的流量,看看QoS的頻寛限制(rate/limit)值,常是造成QoS不能正常運作的原因。

路由器的QoS系統會試著讓重要的封包會先送到ISP手上,再進行流量塑形,以確保較高優先權的資料不會被阻礙到。

從你電腦中送出的封包,會被依路由器上設定的class規則,一一進行檢視,並決定它的優先權,並放到外送的佇列中等候送到你的ISP,有其它的機制會用來管理頻寬,使得遠端送回來的資料能比較不重要的封包更早收到。

但是有人已經為了各別的環境,定義了一連串的QoS規則,那人就是你了。

如果你只有一台PC,你可能不需要QoS系統;如果你是P2P的使用者,想要利用到最大的頻寬,通常你會發現QoS是適得其反的。QoS最大的好處,是處理當網路有大量的連線,有非常多的使用者時,其中有一或多位使用者,造成其他人的網路連線不能工作時,QoS這時的功能就出來了。

我們在多人環境中,遇到的問題大多是P2P流量,因為它通常會吃掉所有的頻寬。因此,最多的討論都是有關P2P在QoS中如何設定流量控制。因為大多數的人想正常的瀏覽網頁,而P2P通常是造成看網頁變慢的原兇,所以我們通常給P2P較低的優先權。

你的ADSL頻寬大的話,你的系統會運作的較好,而且允許更多的P2P流量,更多的VOIP及線上遊戲能正常運作。這是由於二點原因:一是上下傳速度的改進,二是P2P程式較難把頻寬塞滿。也就是整體上來說,P2P流量變得較無關緊要。

如果你只有2-3台電腦,你從QoS得到的好處可能不多,如果你的網路環境更大,像我的一樣,有250-400個房間,600-1200使用者,QoS是一定需要的。如果沒有它的話,大家都不用做事了,只要一個P2P的使用者,就會讓整個網路癱瘓。QoS不論網路的大小,只要設定正確,不管使用者有多少,都是能運作的。但是你必需決定規則的複雜度,你的PC上有什麼應用程式在跑,無用的規則會影響頻寬利用率。

像我管理的這種較大的環境,你必需試著能處理任何連線,所以會有非常多的規則,我們想做的是儘可能管理到任何網路連線,確保它能運作,因為如果我們搞砸了,全部的使用者都不用玩了。這也代表它是一條險峻的學習曲線,並且保持開放的心境,及了解為何規則無法正常運作。不能運作的理由通常是規則中遺露了某些狀況。

我們路由器的QoS,只能管理上傳頻寬,但是經由「因果關係」,可以影響下載的資料流。最後,所以的下載流量大都會變成我們設定的QoS規則想要控制的樣子。QoS經由指定優先權和可用的流量大小限制,來讓經優先權調整過後的流量,真的如預想的方式流動。

因為UDP是一種無連線狀態控制的流量(connectionless state),我們的路由器主要控制的是TCP的封包,VOIP,IPTV等主要使用UDP的應用程式,並沒辦法控制太多,但是可經由減少TCP及其它的流量來避免網路擁塞。事實上,某些UDP流量會吃掉大多數的資源,而我們通常要避免它搞死路由器。有時這可以代表直接禁止某些UDP流量。

我們通常會允許瀏覽網頁及收email的速度快些,但是不管P2P的速度快慢,例如:如果有大量的流量進來,我們需要控制網路連線上下傳流量的最大的數量,這稱之為「capping」,「bandwidth limiting(頻寬限制)」,「traffic management(流量管理)」。這些也是由QoS所控制,它是QoS的一部份。

再一次記得:我們不是提到下載或是上傳的QoS,這些機制全是QoS的一部份。

是時候談到真的要談的部份了...

讓我們看一下為何大部份的使用者的QoS不能如期望中運作的原因,尤其是在大量P2P的環境下。Tomato中原始定義的QoS規則幾乎是沒有用的,但有是總比沒有好。讓我們改善它。

讓我們來看看瀏覽網頁很慢的原因,通常是因為有瓶頸----你的資料卡在佇列中某個地方,讓我們先假設路由器到你的ISP及遠端主機的網路夠快、夠穩定,我們要做的就是控制路由器的行為。

由二點通常是造成瓶頸的原因:

1) 你電腦送出的資料,已經經由QoS系統調整過,已經放在上傳的佇列中,並在一個慢速的連線中,等待送到ISP。假設上傳頻寬是500kbps。

2)遠端主機回應的封包,目前卡在ISP中等著送到你的路由器。假設有2Mbps的下載頻寬。


頭號瓶頸

我們的電腦送到路由器的速度,通常快過路由器送到ISP的速度。這造成了第一個瓶頸,然而,我們可以不理會送到路由器的速度,它們會自己搞定。但是現在有一個功能,會影響路由器送到ISP的情況,那就是QoS的運作。

讓我試著解釋一下:
上傳和下載的資料,都放在路由器記憶體切出來的佇列中,即所謂的「緩衝區」,緩衝區是用來暫時存放等一下要處理的資料。重要的是別讓緩衝區裝滿了。如果它滿了,它便不能收更多的資料,造成那些資料被丟棄。而丟棄的資料需要被重送,造成變慢。

你路由器中的傳送緩衝區裡面放的是等著送到ISP的資料,這是一個非常重要的功能,一定要有空間,可以在佇列的前端插入封包,如此它才可以第一個送出----即是QoS可以正常的排定封包的優先權。如果沒有空間可插入封包的話,QoS不能正常運作。

如果你的PC送資料到路由器的速度,比路由器送到ISP的速度慢的話,我們可以確定緩衝區一定有空間。這就是為何我建議你在QoS-Basic中設定「Max Outbound」的頻寬為「真正頻寬」的85%,或是更小的值。

我必須強調,你必需設定上傳頻寬,為最大上傳速度的85%,或是更小的值,這是一定要遵守的底線。這是不能磋商的!你必需在關掉QoS,網路沒其它頻寬使用的狀況下,於日夜間皆由線上的頻寬測速程式,測試連線速度。取得最低的連線速率,再設定為它的85%速度。如果設太高,QoS會沒有作用,在VOIP的環境下,要設一個更低的速值,如66%。

最大上傳頻寬設完後,如果上傳頻寬上限到了以後,路由器會丟棄多餘的封包,造成PC端會等候回應及過一段時間後重送封包。這就是在PC和路由器間的流量塑形。PC和路由器二者間會自行溝通,你不用做任何事情。

讓我們考慮一下QoS的運作。想像一下某一些要送到ISP,但是不重要的資料,已經存放在路由器的上傳緩衝區中等待傳送了,在它由PC送出去後,你開了瀏覽器上網,並且想要讓網頁瀏覽的封包有較高的優先權,我們要做的事情,就是瀏覽網頁的相關封包,直接放在佇列的最前端,讓它最先送出。當你對某個class設定優先順序較高時,就是代表對路由器下了某個class,比其它的class的優先順序為高。路由器便會依優先權詔低,調整佇列中封包的順序,優先權最高的排在最前端,最低的在最後面。這和其它的限制沒有關聯。

現在,假設我們定義了一個叫WWW的class為High,且沒有限制,讓我們想像路由器剛開機,然後我們打開了一個網頁連線。一個封包送到遠端主機要求連線----這是封包的資料量很小。主機回應確認收到後,連線階段開始於主機送給我們網頁內容及圖片等資料時。主機送給我們大量的資料,而我們只回應確認收到的封包或是要求重送的封包,這就可以得到一個收送資料比例的計算值。



第二號瓶頸:真是個大傢伙


對我們送出和收到的資料的關聯性,取決於用了什麼通訊協定及應用程式,但是它通常在1:10到1:20之間,如果在P2P的狀況下,可能達到1:50。所以一個不受限的500kbps上傳速度,可能收到5到25Mbps的下載資料----這和2Mbps下載頻寬比起來,差距很大。所以我們要的資料,很多都卡在ISP的佇列中。大部份的資料我們都收不到----它們都被ISP的路由器丟掉了。其它的流量也會卡在同一個佇列中,變成回應時間長得可怕。

如何避免這個瓶頸? 第一:你要限制送到遠端主機的資料量,如此一來,它不會送太多的回傳資料。你絕對無法控制其它的東西----你只能經由送給該主機的要求量,來影響它傳回的流量。你送出去的流量決定了收多少回應的流量回來。這是QoS能正常運作的關鍵,你只能從經驗中學習它。

讓我們回想一下比喻:


如果有上千人應你的要求,並依你提供的地址,寄給你郵件或是包裹。在你還沒發出要求之前,它們並不認識你,不會寄給你任何東西。但是如果你發出你的地址給對方,並要求10封信和10個包裹時,對方就會寄出10封信和10個包裹。要求信件量增加或是減少,或是別寄包裹,他們都會照作。如果你一次收到太多的郵件,你會先停止送出要求或是回應,直到降到一個可處理的範圍。不請自來的郵件,則忽略掉,或是慢一點處理。


你收到的郵件中,大部份的比例都是應你要求才寄給你。如果你送了一個要求,但是卻收到10份郵件,那就是1:10的比例。你已經控制多少要求可收到多少郵件;送出1000個要求可收到10000個回應--這已經超過你的郵差能處理的範圍,依經驗,你可以算出寄送比例,並依要收到多少郵件,送出想對比例的要求。**限定**送出的要求,則你的郵差才能處理收到的郵件,如果你不對送出的要求數量設限,則很快的收到的郵件量,將會失去控制。


所以,我們必需了解如何控制下載的流量,是可以經由我們送出的要求來影響它。經驗告訴我們某些應用程式的比例約為1:10是正常的,有些是1:50或是更高的比例(特別是P2P)

要檢視這一個比例值的影響,我們將使用P2P --  通常是造成麻煩的來源。我們將P2P定義為class D,設定10%(50kbps)及限制為50%(250K),然後開啟P2P程式,下載影片,Linux安裝程式或是其它東西。讓我們來看一下結果,上傳連線從50kbps開始,很快的上升到250Kbps(通常都是回應確認的封包),因為我們設定1:20或是更高的比例,我們可能會得到5Mbps或是更多的P2P下載資料,對我們2Mbps的下載頻寬來說,這實在是太多了。這些封包全留在ISP那,等我們的路由器收走,下載的頻寬變成過度飽和,其它的流量也卡住了。大多數的封包無法送達,在一段時間後,封包會被ISP的路由器直接丟棄。

對這些丟棄的封包,由於我們的PC沒有回送「確認收到」(ACK)的回應給主機,造成主機重送這些資料,並造成延遲,如果它持續的發生,會變得愈來愈慢,直到資料傳送量變小,不會塞到下載的頻寬。這可能要花一段相當長的時間來達到,但是在理論上,網路連線是可以穩定的。

經由觀察Tomato中的「realtime 或 24 hour」圖形,非常容易看出來下載頻寬是不是被塞爆了。如果塞爆了的話,高點的圖形有如平坦的一條線一般,你應該避免這種狀況發生。不然你的QoS就無法正常運作。

那麼,讓我們看看我們對這種狀況能做些什麼!

有一些不同的機制是我們可以使用的,能讓下載的速度變慢些。首先我要集中在最重要的部份,即使有數個P2P連線,也會有最佳的連線速度及回應時間。


降低某個class上傳頻寬的可使用量

我們把P2P class的上傳速度定為1%,並限制最大為 10%,看看發生了什麼事。遠端主機的下載速度變成約500kbps到1Mbps。這對一條2Mbps的連線來說是OK的,網頁瀏覽的連線依然相當的快。但這只是一個簡單的檢視而已,因為1:20的比例並不總是可用的,如果BT的種子可見度更高的話,你可能會有更高的P2P下載頻寬被佔用。雖然它可能還是在2Mbps的總下載頻寬內。然而,如果你把P2P class的最大上傳頻寬調整到20%,它可能還是能正常運作,或是會變成QoS功能失效,這要視傳回來的資料狀況----有多少種子、有多少開啟的連線,還有其它的因素都會影響下載速度。

至少20%的網頁瀏覽連線會開始變慢,或是變成沒有回應。你必需自己找到這個重要的限制值,並避免達到這個值。要確保下載頻寬不要被塞爆,不然QoS就會失去作用。我在後面會談一下調高P2P限制後的好處和壞處,我們將會秀一下如何用下載的限制,來允許這個設定,但是在目前的狀況下,先和我一起往下看。

回顧:設定你的上傳P2P頻寬大於15-20%的話,可能會塞爆你的下載流量,造成QoS停止動作。你必需決定允許較高的P2P活動,並且同時允許瀏覽網頁時還順暢。(等一下我們就可以知道如何用二種方法達成此作用)

讓我們把限制設成20%並正向的看待它:它應該還可運作,但是對P2P應該用程式來說,其實已經碰釘子了。

思考一下發生了什麼事,例如,你的P2P程式需要上傳一大堆檔案來得到權限,你的PC上傳了很多資料,很快的吃掉100K的頻寬,但是這個class和回應收到資料的封包(ACK)是共用的,這一些封包在路由器中,沒有持別的優先權,也就是在佇列中沒特別的優先權,所以回應可能慢了。現在你的下載將會變慢,而且達不到普通的下載速度----有可能停掉或是幾乎停止,這時你可能會覺得QoS可能出了什麼問題。但是QoS仍舊正常的運作中,所以你了解到這是P2P的運作模式和規則設定的問題。

你的上傳已經主導了連線狀況,是你沒有想到的。你允許做種來控制你的連線,但是你想做的是控制下載連線。請記得處理P2P時,要決定你的目標,在ADSL連線中,做種並不是非常實際的,而下載卻是大多數人想做的事。



針對class的下載TCP頻寬設限


更好的方式,是針對P2P的class,於Tomato中設定下載的頻寬,以限制下載的資料量。它是如何運作的? 路由器中的連線表格會記錄P2P的上傳封包記錄,然後會在下載的封包中,找尋相對應的TCP封包,然後路由器會把這些封包做加總計算,算出下載的速度,因此可以對它做限制。例如所以我們可以把下載的連線頻寬設定為2Mbps以下,如果超過這個限制值,路由器會丟掉封包,使得發送端重送----再次重申,它可使下載連線穩定。Tomato的QoS / Limiter只是使用一般TCP的連線控制來針對class做流量塑形(TCP/IP的流量控制,請自行Google)。

這就是為何在QoS/Basic設定中,要設定最大的實際下載限制的原因。它企圖用來在連線被塞爆前,降低連線的連度。這就是為通常建議設定的值要比實際的值為低,通常是85%或更低。如果頻寬被塞爆了之後就來不及了,你的QoS會變得沒有作用。

現在是談一談Tomato中下載設限制的時機。

請注意我們下載中設定的最大值並不是一個硬性的限定值。在Tomato中沒有全域的限定值,這一個值只是用來計算不同class間的頻寬使用程度。我們可以只設定每個class的可用最大值,但是你很快就會了解到每個class的頻寬加總會超過總頻寬! 簡單來說,就是Tomato的下載頻寬管理上,是有缺陷的。

因為這個原因,如果你的網路很繁忙的話,實際上你會發現並沒辦法限制下載的頻寬在設定的範圍。在重度網路頻寬使用下,總和頻寬可能會超過真正的可用頻寬,也就是各別class的頻寬總和,大於真正頻寬的總和,但是如果我們設定一個太小的線下載頻寬,Tomato又沒辦法全用到它。Tomato的QoS功能,還沒有完成!!

當一個連結在忙碌於穩定它自己的情況時,新的WWW/Mail/MSN/P2P連線一在開啟中,其它的連線可能不預期的結束,整個穩定程度一直在變! 你會發現P2P這部份非常難以控制。在某一段期間,網路延遲正常,但是最好的網路延遲的設定,要由你決定。

如果你要QoS運作正常,且網路延遲正常,則把整體上限值設為66%。

下方的圖是一條1.5Mbps ADSL線路在不同的負載下的網路延遲狀況,可以清楚的看到66%是一個分界點。




由上圖,我們加了一些資訊,你可以看到ping值在1Mbps時開始上升,而在1.2後變得相當糟,1.3之後更不好。


圖片由Jared Valentine製作

在設定QoS時,不要100%依賴下載限制(incoming limit)。這個設定,只在你上傳部份的其它設定設好後,如果仍有擁塞的狀況下才使用。如果你設定了下載限制,就很難看出你的QoS設定的結果是如何,因為下載限制會丟棄某些封包,造成看不出來上載設定的結果。基本上來說,把下載限制設成999999,就如同關閉的狀態一樣,這樣子你才能看出你的QoS分佈狀態,以利調整參數,當QoS規則定好了以後,把下載限制打開。

class限制的100%和NONE是不同的,100%等於你設的下載限制,NONE則是忽略下載限制。

對於尋求最佳回應時間及速度的class,把class的下載限制設高些,設為NONE代表不設限(例如對網頁瀏覽等)。如果為了減低回應時間,設為50%則會相當的快,66%還不錯,80%在實際上還是可用的情況。80%以上的話,回應就會開始變慢。我使用80%的限制,在大多數的情況下,大部份的使用者都滿意這個結果。

也就是,你得犧牲頻寬,來獲得較短的網路延遲。

相較於其它東西,網頁瀏覽通常是瞬間的流量,我通常設定它的class限制為NONE,這樣子它會試著使用全部的頻寬。


對TCP和UDP的連線數設限


如果你的路由器因為太多的P2P連線而當掉,試著限制每個使用者可開啟的連線數量。

這裡列出一些有用的Script:把這些Script放在Administration/Scripts/Firewall下的文字輸入欄。在加其它規則前先使用這功能檢查。你可以經由telnet到路由器上,經由此指令,列出iptable的規則:「iptables -L」(-vnL 列出詳細)或是「iptables -t nar -vnL」。如果你使用的是較新版的Tomato,你也可以經System的command line輸入欄輸入。(另外一個好用的指令是「iptables -t mangle -vnL」)

解釋一下;例如Linux的防火牆通常是使用INPUT及FORWARD chains,FORWARD chain中定義的是送到WAN(網際網路)的限制。它就是存放從內部網路上傳到網際網路限制的地方。INPUT chain限制從網際網路送到每個用戶端的規則。沒有這個限制,路由器還是可能被P2P連線塞滿。

通常建議把限制設在這二個chain上,但是如果發生DOS或是SMTP木馬攻擊,路由器通常會馬上重開,沒有留下記錄。

phuque99在Linksysinfo.org討論區,有發表更多的討論文章,依照他的建議,下列這些Scripts可以放在PREROUTING chain,這些script會先被執行。這樣子路由器就不會重開,並且保持運作。

我建議的如下(譯註:參數和IP需要自行調整):

#Limit TCP connections per user / 對每個使用者的TCP連線數設限(譯註:參數和IP需要自行調整)
iptables -t nat -I PREROUTING -p tcp —syn -m iprange —src-range 192.168.1.50-192.168.1.250 -m connlimit —connlimit-above 150 -j DROP

#Limit all *other* connections per user including UDP / 對每個使用者的其它總連線數設限,其中包含UDP
iptables -t nat -I PREROUTING -p ! tcp -m iprange —src-range 192.168.1.50-192.168.1.250 -m connlimit —connlimit-above 100 -j DROP

#Limit outgoing SMTP simultaneous connections / 對SMTP的上傳連線數設限
iptables -t nat -I PREROUTING -p tcp —dport 25 -m connlimit —connlimit-above 5 -j DROP

下一個script是用來預防病毒快速的開啟上千的連線,吃掉我們的頻寬。我不喜歡這個東西,因為我已經做了很多的預防措施。請小心的使用它。

iptables -t nat -I PREROUTING -p udp -m limit —limit 20/s —limit-burst 30 -j ACCEPT

注意:如果你設定的限制是5,通常你會覺得它好像沒有作用。你會看到多於限制的連線數,通常是30-100。有一些連線,可能是逾時後等待處理的舊連線。請注意這些通常是TEREDO或是其它IPv6的相關連線 (Windows Vista和7),在內定上是開啟的,你可以經由下列指令關掉它:

netsh
interface
teredo
set state disabled


連接跟蹤(Conntrack)逾時設定

如果你的路由器變得不穩定,例如隨機性的卡住,或是重開機,則通常是因為連線太多造成的,它造成連接跟蹤表滿了,並且吃掉了路由器的記憶體。這通常是素行不良的應用程式造成的(通常是P2P用戶端),它會在短短幾秒內開啟上千的連線,而且大多是UDP。路由器通常不會將這些突然出現的大量連線記錄下來,因為這時它已經記憶體不足造成當機,根本來不及寫進log。

顯然的,Firmware中有缺陷,這種狀況不應該發生。在我們修正它之前,我們必需採取相對的傷害控制措施。設定TCP及UDP逾時時間是必要的。

設定太高的連線數會造成較糟的結果(比如8192),事實上這一個連線數通常是達不到。大多在連接跟蹤(conntrack)網頁內顯示的連線,都是舊有的,等待逾時時間到後要清除的連線。把限制設低一點,例如2000到3000,可以給路由器在當掉之前,有更多的呼吸空間。

(譯註:RT-N16號稱可30萬連線,這邊我設成40960都沒連問題,最高的一次連線曾達到9000多個,記憶體當時還相當足夠)

下列的設定已被認為可以避免某些情況下的連線風暴(connection storm),並且不會造成太多的影響:

TCP
None 100
Established 1200
Syn Sent 20
Syn Received 20
FIN Wait 20
Time Wait 20
Close 20
Close Wait 20
Last Ack 20
Listen 120

UDP
Unreplied 10 (對VOIP來說,25通常是需要的,不然就調成10)
Assured 10 (某些VOIP的使用者來說,可能要調到300來避免發生連線問題。用較低的數值會較穩定)。

Generic
10 (二邊皆是)

2009年11月新增...

Teddy Bear現在使用2.6的Linex Kernel來編譯Tomato。「NONE」及「LISTEN」的設定已經拿掉了,現在有新的二個設定:「GENERIC」及「ICMP」。ICMP就如同字面說示,GENERIC是用來設定所有TCP/UDP連線中,沒有它們單價個別設定的內定預設值。


範例

QoS設定頁









P.S. 花了十多個小時把它譯成中文,依參考文章,發現有更多的資料,會不會第二篇中譯,我自己也不知道,畢竟自己看的話,直接看原文就好了。


追加註記:
如果Firmware更新多次之後,nvram可能有不足的狀況,這時要清除nvram並重新設定,以下是Toastman(本文原作者)於2013年1月18日回覆使用者詢問時,給的設定值(於Tool\system選單下的文字輸入欄輸入這一行 <<注意:下面這一大串是一整行,也是Toastman在2013年一月時的路由器設定值>>)

nvram set qos_orules="0<<-1<d<53<0<<0:10<<0<DNS>0<<-1<d<37<0<<0:10<<0<Time>0<<17<d<123<0<<0:10<<0<NTP>0<<-1<d<3455<0<<0:10<<0<RSVP>0<<-1<d<9<0<<0:50<<4<SCTP, Discard>0<<-1<x<135,2101,2103,2105<0<<<<4<RPC (Microsoft)>0<<17<d<3544<0<<<<-1<Teredo Tunnel>0<<6<x<22,2222<0<<<<3<SSH>0<<6<d<23,992<0<<<<3<Telnet>0<<6<s<80,5938,8080,2222<0<<<<3<Remote Access>0<<-1<x<3389<0<<<<3<Remote Assistance>0<<-1<x<6970:7170,8554<0<<<<2<Quicktime/RealAudio>0<<-1<d<1220,7070<0<<<<2<Quicktime/RealAudio>0<<-1<x<554,5004,5005<0<<<<2<RTP, RTSP>0<<-1<x<1755<0<<<<2<MMS (Microsoft)>0<<-1<d<3478,3479,5060:5063<0<<<<1<SIP, Sipgate Stun Services>0<<-1<s<53,88,3074<0<<<<1<Xbox Live>0<<6<d<1718:1720<0<<<<1<H323>0<<-1<d<11031,11235:11335,11999,2300:2400,6073,28800:29100,47624<0<<<<1<Various Games>0<<-1<d<1493,1502,1503,1542,1863,1963,3389,5061,5190:5193,7001<0<<<<6<MSGR1 - Windows Live>0<<-1<d<1071:1074,1455,1638,1644,5000:5010,5050,5100,5101,5150,8000:8002<0<<<<6<MSGR2 - Yahoo>0<<-1<d<194,1720,1730:1732,5220:5223,5298,6660:6669,22555<0<<<<6<MSGR3 - Additional>0<<-1<d<19294:19310<0<<<<6<Google+ & Voice>0<<6<d<6005,6006<0<<<<6<Camfrog>0<<-1<x<6571,6891:6901<0<<<<6<WLM File/Webcam>0<<-1<a<<0<skypetoskype<<<1<Skype to Skype>0<<-1<a<<0<skypeout<<<-1<Skype Phone (deprecated)>0<<-1<a<<0<youtube-2012<<<2<YouTube 2012 (Youtube)>0<<-1<a<<0<httpvideo<<<2<HTTP Video (Youtube)>0<<-1<a<<0<flash<<<2<Flash Video (Youtube)>0<<-1<a<<0<rtp<<<2<RTP>0<<-1<a<<0<rtmp<<<2<RTMP>0<<-2<a<<0<rtmpt<<<2<RTMPT (RTMP over HTTP)>0<<-1<a<<0<shoutcast<<<2<Shoutcast>0<<-1<a<<0<irc<<<6<IRC>0<<6<d<80,443,8080<0<<0:512<<4<HTTP, HTTPS, HTTP Proxy>0<<6<d<80,443,8080<0<<512:<<7<HTTP, SSL File Transfers>0<<6<d<20,21,989,990<0<<<<7<FTP>0<<6<d<119,563<0<<<<7<NNTP News & Downloads>0<<6<d<25,587,465,2525<0<<<<5<SMTP, Submission Mail>0<<6<d<110,995<0<<<<5<POP3 Mail>0<<6<d<143,220,585,993<0<<<<5<IMAP Mail>0<<17<d<1:65535<0<<<<9<P2P (uTP, UDP)"



有關如何備份nvram及重新設定的方式,可參考Toastman的原文回覆:
有空再譯 (?)

3 則留言:

Simba 提到...

請問一下,我的NSA有掛MAIL SERVER,我想請問一下我的MAIL SERVER在TOMATO QOS裡面的設定對不對。

TCP
目的通訊埠 25.110
最進階

我目前測試過,信就是無法重SERVER收到電腦的OUTLOOK裡,請問如何設定才對??

謝謝!!

Andyca Chiou 提到...

抱歉,沒想到有人看這文章XD
我沒設定過,不過通常如不是設成DMZ,就是要用Port Forwarding把25, 110轉到你的NAS上,QoS的設定只是讓你的MAIL server連線品質較好而已,在Tomato上沒打洞的話,外面的連線是進不來的。
由於連線一直開著,用Port Forwarding安全性較差

shibby 提到...

這篇更讓我學習了QOS,感謝作者的用心!