家裡五六台電腦,可是大家都窮學生,ADSL當然是合牽的。共用的網路自然會遇到頻寬的問題,恰好期末前讀到信大的文章介紹了shaperd,考完就花了點時間,果然很好上手,來這分享給其他還沒接觸到的朋友知道一下。
shaperd是一個調節流量的程式,正確的來說,他調節的是頻寬。他將ip_queue中的封包解讀,判斷哪些封包要用什麼樣的方式管制。
因為自2.4起用的都是iptables,所以我就不講2.2的部份。shaperd搭配2.4 kernel的時候,需要使用ip_queue(ipq)這個模組,記得先載入。搭配2.2kernel用的是divert socket。ipq、iptables與divert socket的設定不是本文的重點,文中不多做說明。
設定檔的寫法稍後再提,首先是啟動方式。先啟動shaperd,以Debian為例是/etc/init.d/shaperd start,然後在iptables裡把「要調節流量的封包」傳給queue。例如「調節從內部機器192.168.1.1透過nat傳給外部機器1.2.3.4的流量」
iptables -A FORWARD -s 192.168.1.1/32 -d 1.2.3.4/32 -j QUEUE
要注意的是,forward給queue的封包,都會被shaperd監控,而若是在設定檔裡沒有對這些封包訂定監控規則,封包就會被丟棄。
其次是探討設定檔
shaperd中將要管理的資料分成群組,每個群組可以有自已的規則。
首先是log level,定義記錄檔的詳細程度,參數不另說明。
接下來是packet forwarding,kernel 2.2請用divert,2.4用ipq。
daemon,是否要用daemon模式 (yes/no)。
pidfile,記錄pid的檔案位址。
接下來定義群組,群組要用class包起來,語法是
class 群組名稱 {
裡面放群組的定義
}
定義的部份
封包規則,以ipv4 classifier開始(我不確定有沒有ipv6 XD),後面接規則關鍵字, 可用的有proto(協定 tcp/udp/icmp)、s/dport(來源/目的埠號)、s/daddr(來源/目的位址)、inp/out_if(來源/目的介面)、 prio(優先順序,數字越大越優先)一個群組可以有好幾個規則
bandwidth,流速限制,單位可以是mbyte/s mbit/s kbyte/s kbit/s byte/s bit/s
queue limits,佇列大小,分成byte和packet兩部分,byte主要是給divert packet用的,packet則是主要給ipqueue用的,若設為0則代表沒有限制。byte部分的單位可以是mbyte、mb、kbyte、kb、byte、bytes。packets則會受到/proc/net/ip_queue的限制,若queue中的封包數量超過/proc/net/ip_queue的設定就會出問題
borrow from,後面接群組名稱,指定多個時以,分隔,若指定的群組有多餘頻寬時,可以借來使用
例如
log level = info
packet forwarding = ipq
class test {
# 調節從192.168.1.1的port 20傳到5.6.7.8的port 30的tcp封包
ipv4 classifier prio=0 proto=tcp saddr=192.168.1.1 daddr=5.6.7.8/32 sport=20 dport=30
# icmp封包優先傳送
ipv4 classifier prio=1 proto=icmp saddr=192.168.1.1
# 頻寬100k bytes
bandwidth = 100.0 kbyte/s
# 佇列大小100個packet
queue limits = 0 kb 100 packets
# 必要時可以看看test2群組有沒有頻寬能借
borrow from test2
}
class test2 {
# 從192.168.1.1到1.2.3.4的所有tcp封包
ipv4 classifier proto=tcp daddr=1.2.3.4 saddr=192.168.1.1
bandwidth = 10 kbyte/s
queue limit = 0 kb 100 packets
}
配套的iptables規則
-A FORWARD -s 192.168.1.1/32 -p tcp -j QUEUE
-A FORWARD -s 192.168.1.1/32 -p icmp -j QUEUE
請注意,因為我們將所有從192.168.1.1到外部網路的tcp和icmp封包都交給shaperd處理了,而shaperd卻只定義了5.6.7.8和1.2.3.4的規則,而shaperd會丟棄不被任何群組監控的封包,所以這樣的設定會害你連不上moto