自由分校蔡宜恩 

相信大家一定都有過網路用到一半,忽然的LAG,全因為旁邊的同學朋友或隔壁房的弟弟正在大力的使用P2P下載歌曲或電影之類的。或是正跟情人用SKYPE情話綿綿時,忽然出現通話一直斷斷續續的,只因正好在看線上影片。

就這樣,網路頻寬的搶食大作戰從古老的數據機時代到現在的光纖世代,一直在我們的日常生活中上演著,這一直是網路使用者一個不想面對的痛。如果想解決這個問題,最快的方式就是找一台具有頻寬管理QoSROUTER來幫忙,但是,一台好的ROUTER少說也要好幾千,難道沒有更省錢的方法嗎?

答案是有的,那就是使用LINUXTC來做控管,撘配一台沒在使用的舊電腦及防火牆程式IPTABLES就是一台強大又省錢的頻寬管理器了。下面的範例就是一部份利用tc 來做上傳頻寬控管的語法,下載的語法亦是相同的。

 

語法範例:

(擷取自http://www.ubuntu-tw.org/modules/newbb/reply.php?forum=11&topic_id=34598

#!/bin/sh
#

# WAN = eth0  <---
這是在LINUX中對外通訊的網路設備代號,ADSL的話應為 pppX
# LAN = eth1   <---這是在LINUX中對內通訊的網路設備代號

# 清除 eth0 (WAN) 所有佇列規則 (初始化)
tc qdisc del dev eth0 root 2>/dev/null

# 定義最頂層(根)佇列規則,並指定 default 類別編號

tc qdisc add dev eth0 root handle 10: htb default 80

#
定義第一層的 10:1 類別 (總頻寬)
tc class add dev eth0 parent 10: classid 10:1 htb rate 64kbps ceil 64kbps

# 定義第二層葉類別

# rate 保證頻寬,ceil 最大頻寬,prio 優先權

#prio 數值越小優先權越高哦
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 6kbps ceil 26kbps prio 0
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 1kbps ceil 6kbps prio 4
tc class add dev eth0 parent 10:1 classid 10:30 htb rate 16kbps ceil 36kbps prio 3
tc class add dev eth0 parent 10:1 classid 10:40 htb rate 8kbps ceil 28kbps prio 2
tc class add dev eth0 parent 10:1 classid 10:50 htb rate 2kbps ceil 22kbps prio 1
tc class add dev eth0 parent 10:1 classid 10:60 htb rate 2kbps ceil 22kbps prio 2
tc class add dev eth0 parent 10:1 classid 10:70 htb rate 1kbps ceil 21kbps prio 1
tc class add dev eth0 parent 10:1 classid 10:80 htb rate 8kbps ceil 28kbps prio 1

#
定義各葉類別的佇列規則

# parent 類別編號,handle 葉類別佇列規則編號
tc qdisc add dev eth0 parent 10:10 handle 101: pfifo
tc qdisc add dev eth0 parent 10:20 handle 102: pfifo
tc qdisc add dev eth0 parent 10:30 handle 103: pfifo
tc qdisc add dev eth0 parent 10:40 handle 104: pfifo
tc qdisc add dev eth0 parent 10:50 handle 105: pfifo
tc qdisc add dev eth0 parent 10:60 handle 106: pfifo
tc qdisc add dev eth0 parent 10:70 handle 107: pfifo
tc qdisc add dev eth0 parent 10:80 handle 108: pfifo

#
設定過濾器

tc filter add dev eth0 parent 10: protocol ip prio 100 handle 10 fw classid 10:10
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 20 fw classid 10:20
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 30 fw classid 10:30
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 40 fw classid 10:40
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 50 fw classid 10:50
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 60 fw classid 10:60
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 70 fw classid 10:70

以上就是tc部份的script語法,但是光這樣是還沒辦法做到控管的,還要再加入下列的iptables 語法來對要控管的port做貼標籤的動作


#mark 主要是應對tc部分的 classid,以利控管

# uploads
#
設定上傳方面,先利用 iptables 給封包貼標籤,再交由 fw 過濾器進行過濾

iptables -t mangle -I PREROUTING -s 192.168.0.253 -p tcp --sport 22 -j MARK --set-mark 70
iptables -t mangle -I PREROUTING -s 192.168.0.253 -p tcp --sport 25 -j MARK --set-mark 60
iptables -t mangle -I PREROUTING -s 192.168.0.253 -p tcp --sport 53 -j MARK --set-mark 50
iptables -t mangle -I PREROUTING -s 192.168.0.253 -p ucp --sport 53 -j MARK --set-mark 50
iptables -t mangle -I PREROUTING -s 192.168.0.253 -p tcp --dport 80 -j MARK --set-mark 40
iptables -t mangle -I PREROUTING -s 192.168.0.253 -p tcp --sport 80 -j MARK --set-mark 30
iptables -t mangle -I PREROUTING -s 192.168.0.253 -p tcp --sport 19000 -j MARK --set-mark 20
iptables -t mangle -I PREROUTING -s 192.168.0.253 -p ucp --sport 19000 -j MARK --set-mark 20
iptables -t mangle -I PREROUTING -s 192.168.0.1 -j MARK --set-mark 10

 這樣就完成基本設定了,接下來只要把這兩部份鍵入script檔加入執行權限就可以進行頻寬的控管了。但是或許會有人說,我又不會使用LINUX,那我要怎麼使用這方法呢?當然還是有辦法的,目前已有很多LINUX高手把它做成一套簡化過的系統來使用了,像網路上滿有名的CoyoteEndianIPCopSmoothWallEFWm0m0wallpfSenscBrazilFW等都具有QoS的能力的,相同的,只要再搭配一台沒在使用的舊電腦就是功能強大的頻寬管理機器了。

更多更精采的文章,請至第39期電子報

, , , ,

lccnetvip 發表在 痞客邦 PIXNET 留言(0) 人氣()