ALTQ on FreeBSD

今天把ALTQ給設了起來,感覺還蠻簡單的…

ALTQ是OpenBSDPF上面作Packet Queueing和Prioritization的工具,簡單講就是作頻寬控制。FreeBSD5.3 Release 之後正式包進kernel裡面,今天設定起來之後感覺還蠻簡單的,下面是一些筆記:

  1. 把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
  2. 編輯/etc/pf.conf。pf.conf裡面放的是pf的rule,要依照下面的順序放:

    Macros
    Tables
    Options
    Traffic Normalization
    Queueing
    Translation
    Packet Filtering

    不然pfctl在載入pf.conf時會跟你靠么。
  3. 接下來就是根據需要寫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。
  4. 水管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(好繞口…)
  5. 接下來就是叫pf重讀設定檔,然後就是測試啦~~

其實最重要的就是match的rule要寫對,寫不對的話(比如說方向搞錯、忘了last match)是怎麼都不會work的,今天就是這樣搞了好久 !^%$@^@%…

重要的文件除了man page之外,當然就是OpenBSD的PF User’s Guide囉,裡面還有很多例子可以看 🙂

1 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *