今天把ALTQ給設了起來,感覺還蠻簡單的…
ALTQ是OpenBSD的PF上面作Packet Queueing和Prioritization的工具,簡單講就是作頻寬控制。FreeBSD5.3 Release 之後正式包進kernel裡面,今天設定起來之後感覺還蠻簡單的,下面是一些筆記:
-
把pf和ALTQ編進kernel裡面。pf可以用module載入,不過ALTQ一定得用編譯進去的方法才能用,目前沒有做成module。把下面的東西加進kernel config就可以了:
device pf
device pflog
device pfsync
options ALTQ
options ALTQ_CBQ # Class Bases Queueing
options ALTQ_RED # Random Early Drop
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler
options ALTQ_CDNR # Traffic conditioner
options ALTQ_PRIQ # Prioirity Queueing
- 編輯/etc/pf.conf。pf.conf裡面放的是pf的rule,要依照下面的順序放:
Macros
Tables
Options
Traffic Normalization
Queueing
Translation
Packet Filtering
不然pfctl在載入pf.conf時會跟你靠么。 - 接下來就是根據需要寫rule。一般來說這種頻寬控管的rule都很像,先把水管大小訂出來,然後再配合firewall的rule,決定哪些packet要走哪條水管。例如下面就訂了兩條水管:
altq on $extdev cbq bandwidth 3Mb queue {def_ext, www_limit}
queue def_ext cbq(default)
queue www_limit bandwidth 300Kb cbq(red)
在$extdev上面先定一條3Mb的水管,下面再分了兩條水管:def_ext、www_limit,www_limit限流300Kb,def_ext沒有限制。altq支援兩種queue scheduler:CBQ和PRIQ,CBQ可以定頻寬寬度,PRIQ則是定封包的優先權。queue下面還可以再分多個queue,這邊只分了兩個queue。 - 水管OK了,接下來就是決定哪些packet要丟到那個queue去,如果沒指定的話會走default queue:
pass in quick on $extdev inet proto tcp from any to $ext_ip port 80 flags S/SA keep state queue www_limit
pass in all keep state
pass out all keep state
這邊就是把其他人連到對外ip port 80的traffic丟到blog_limit這個queue裡面去。與一般firewall不太一樣的是pf是last match,所以擺rule的順序要注意,如果想要match到某個rule之後接下來的rule都不evaluate的話記得要加上quick(好繞口…) - 接下來就是叫pf重讀設定檔,然後就是測試啦~~
其實最重要的就是match的rule要寫對,寫不對的話(比如說方向搞錯、忘了last match)是怎麼都不會work的,今天就是這樣搞了好久 !^%$@^@%…
重要的文件除了man page之外,當然就是OpenBSD的PF User’s Guide囉,裡面還有很多例子可以看 🙂
1 則留言