linux_xp
2005-08-06, 03:44 AM
如果不設fifo的話~那要怎麼設才好呢....
FIFO 是網卡的預設「佇列規則」
封包"先進先出"的意思,就是完全沒有 QoS
在 Linux 下,每個網卡介面都有「佇列規則」
可以想像成是類似高速公路閘道管制的東西
閘道管制一般時候,是不會啟用的
但如果假日,高速公路塞車
閘道管制就會開始亮燈,管制車流量,以避免全塞住不能動
網路的 QoS 管頻寬制,原理就類似高速公路
Linux 下的 QoS
主要有三大項目 「佇列規則」「類別」「過濾器」
像警車在高速公路上,可以暢行無阻,這是因為有高優先權
佇列規則(高速公路):區分警用車輛,一般車輛,兩個類別
類別(警用車輛):最高優先權,可使用所有頻寬
過濾器(識別方法):車上閃燈喔喔叫的,就是警用車輛
佇列規則(網路):區分 web,e-mail,dns,p2p....等等類別
類別(服務種類):優先權等級,最高可使用/保證最少 多少頻寬
過濾器(服務種類):依照 port,依照 uid,依照 layer-7
這是舉例啦,原理就類似這樣子....
----------------------------------------------------------------
Coyote Linux 就我所知,它的 QoS 並不容易設定
老實說我也看不懂那要怎麼設定
Coyote 的 QoS ,預設是沒有開啟的
需要使用者自行寫入規則,才能運作
我是使用 Linux (Fedora) 做 NAT + QoS 的
要用 tc 和 iptables 兩個指令
tc 負責定義「佇列規則」「類別」
iptables 負責給封包貼標籤,再交給 fw「過濾器」去歸類
整個 shell script ,看起來就像這樣子:
#!/bin/sh
# 清除 eth0 所有佇列規則
tc qdisc del dev eth0 root 2>/dev/null
# 定義最頂層的佇列規則
tc qdisc add dev eth0 root handle 10: htb default 700
# 定義根部的 "10:1" 類別
tc class add dev eth0 parent 10: classid 10:1 htb rate 64kbps ceil 64kbps
# 定義第二層類別
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 48kbps ceil 48kbps
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 16kbps ceil 32kbps
# 定義葉類別 (葉類別具有 prio 優先權等級,數字愈低優先權愈高)
tc class add dev eth0 parent 10:10 classid 10:100 htb rate 16kbps ceil 48kbps prio 3
tc class add dev eth0 parent 10:10 classid 10:200 htb rate 8kbps ceil 32kbps prio 1
tc class add dev eth0 parent 10:10 classid 10:300 htb rate 2kbps ceil 8kbps prio 3
tc class add dev eth0 parent 10:10 classid 10:400 htb rate 2kbps ceil 8kbps prio 3
tc class add dev eth0 parent 10:10 classid 10:500 htb rate 2kbps ceil 32kbps prio 0
tc class add dev eth0 parent 10:20 classid 10:600 htb rate 8kbps ceil 32kbps prio 0
tc class add dev eth0 parent 10:20 classid 10:700 htb rate 8kbps ceil 16kbps prio 2
# 定義各葉類別佇列規則
tc qdisc add dev eth0 parent 10:100 handle 101: pfifo
tc qdisc add dev eth0 parent 10:200 handle 102: pfifo
tc qdisc add dev eth0 parent 10:300 handle 103: pfifo
tc qdisc add dev eth0 parent 10:400 handle 104: pfifo
tc qdisc add dev eth0 parent 10:500 handle 105: pfifo
tc qdisc add dev eth0 parent 10:600 handle 106: pfifo
tc qdisc add dev eth0 parent 10:700 handle 107: pfifo
# 設定過濾器
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 100 fw classid 10:100
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 200 fw classid 10:200
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 300 fw classid 10:300
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 400 fw classid 10:400
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 500 fw classid 10:500
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 600 fw classid 10:600
# tc filter add dev eth0 parent 10: protocol ip prio 100 handle 700 fw classid 10:700
# 給封包貼標籤,以使用於 QoS
# 本機服務封包
iptables -t mangle -A OUTPUT -m owner --uid-owner apache -j MARK --set-mark 100
iptables -t mangle -A OUTPUT -m owner --uid-owner squid -j MARK --set-mark 200
iptables -t mangle -A OUTPUT -m owner --uid-owner mail -j MARK --set-mark 300
iptables -t mangle -A OUTPUT -m owner --uid-owner named -j MARK --set-mark 400
iptables -t mangle -A OUTPUT -m owner --uid-owner sshd -j MARK --set-mark 500
# 來自區網,會過 NAT 的封包
iptables -t mangle -A PREROUTING -i bond0 -s 192.168.1.1 -j MARK --set-mark 600
這些指令要解釋起來,需花很多時間
所以這邊就不多做解釋了
市面上有講解 Linux QoS 的中文書籍,若有興趣可以參考
其實 Linux QoS 設定上,指令並不會說非常難,難的是那個 QoS 觀念
Coyote Linux 可以從額外寫入防火牆規則,進行設定
先把 Coyoe 內建的 QoS 腳本完全關閉
用自定義規則,來實現 QoS
:)
FIFO 是網卡的預設「佇列規則」
封包"先進先出"的意思,就是完全沒有 QoS
在 Linux 下,每個網卡介面都有「佇列規則」
可以想像成是類似高速公路閘道管制的東西
閘道管制一般時候,是不會啟用的
但如果假日,高速公路塞車
閘道管制就會開始亮燈,管制車流量,以避免全塞住不能動
網路的 QoS 管頻寬制,原理就類似高速公路
Linux 下的 QoS
主要有三大項目 「佇列規則」「類別」「過濾器」
像警車在高速公路上,可以暢行無阻,這是因為有高優先權
佇列規則(高速公路):區分警用車輛,一般車輛,兩個類別
類別(警用車輛):最高優先權,可使用所有頻寬
過濾器(識別方法):車上閃燈喔喔叫的,就是警用車輛
佇列規則(網路):區分 web,e-mail,dns,p2p....等等類別
類別(服務種類):優先權等級,最高可使用/保證最少 多少頻寬
過濾器(服務種類):依照 port,依照 uid,依照 layer-7
這是舉例啦,原理就類似這樣子....
----------------------------------------------------------------
Coyote Linux 就我所知,它的 QoS 並不容易設定
老實說我也看不懂那要怎麼設定
Coyote 的 QoS ,預設是沒有開啟的
需要使用者自行寫入規則,才能運作
我是使用 Linux (Fedora) 做 NAT + QoS 的
要用 tc 和 iptables 兩個指令
tc 負責定義「佇列規則」「類別」
iptables 負責給封包貼標籤,再交給 fw「過濾器」去歸類
整個 shell script ,看起來就像這樣子:
#!/bin/sh
# 清除 eth0 所有佇列規則
tc qdisc del dev eth0 root 2>/dev/null
# 定義最頂層的佇列規則
tc qdisc add dev eth0 root handle 10: htb default 700
# 定義根部的 "10:1" 類別
tc class add dev eth0 parent 10: classid 10:1 htb rate 64kbps ceil 64kbps
# 定義第二層類別
tc class add dev eth0 parent 10:1 classid 10:10 htb rate 48kbps ceil 48kbps
tc class add dev eth0 parent 10:1 classid 10:20 htb rate 16kbps ceil 32kbps
# 定義葉類別 (葉類別具有 prio 優先權等級,數字愈低優先權愈高)
tc class add dev eth0 parent 10:10 classid 10:100 htb rate 16kbps ceil 48kbps prio 3
tc class add dev eth0 parent 10:10 classid 10:200 htb rate 8kbps ceil 32kbps prio 1
tc class add dev eth0 parent 10:10 classid 10:300 htb rate 2kbps ceil 8kbps prio 3
tc class add dev eth0 parent 10:10 classid 10:400 htb rate 2kbps ceil 8kbps prio 3
tc class add dev eth0 parent 10:10 classid 10:500 htb rate 2kbps ceil 32kbps prio 0
tc class add dev eth0 parent 10:20 classid 10:600 htb rate 8kbps ceil 32kbps prio 0
tc class add dev eth0 parent 10:20 classid 10:700 htb rate 8kbps ceil 16kbps prio 2
# 定義各葉類別佇列規則
tc qdisc add dev eth0 parent 10:100 handle 101: pfifo
tc qdisc add dev eth0 parent 10:200 handle 102: pfifo
tc qdisc add dev eth0 parent 10:300 handle 103: pfifo
tc qdisc add dev eth0 parent 10:400 handle 104: pfifo
tc qdisc add dev eth0 parent 10:500 handle 105: pfifo
tc qdisc add dev eth0 parent 10:600 handle 106: pfifo
tc qdisc add dev eth0 parent 10:700 handle 107: pfifo
# 設定過濾器
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 100 fw classid 10:100
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 200 fw classid 10:200
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 300 fw classid 10:300
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 400 fw classid 10:400
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 500 fw classid 10:500
tc filter add dev eth0 parent 10: protocol ip prio 100 handle 600 fw classid 10:600
# tc filter add dev eth0 parent 10: protocol ip prio 100 handle 700 fw classid 10:700
# 給封包貼標籤,以使用於 QoS
# 本機服務封包
iptables -t mangle -A OUTPUT -m owner --uid-owner apache -j MARK --set-mark 100
iptables -t mangle -A OUTPUT -m owner --uid-owner squid -j MARK --set-mark 200
iptables -t mangle -A OUTPUT -m owner --uid-owner mail -j MARK --set-mark 300
iptables -t mangle -A OUTPUT -m owner --uid-owner named -j MARK --set-mark 400
iptables -t mangle -A OUTPUT -m owner --uid-owner sshd -j MARK --set-mark 500
# 來自區網,會過 NAT 的封包
iptables -t mangle -A PREROUTING -i bond0 -s 192.168.1.1 -j MARK --set-mark 600
這些指令要解釋起來,需花很多時間
所以這邊就不多做解釋了
市面上有講解 Linux QoS 的中文書籍,若有興趣可以參考
其實 Linux QoS 設定上,指令並不會說非常難,難的是那個 QoS 觀念
Coyote Linux 可以從額外寫入防火牆規則,進行設定
先把 Coyoe 內建的 QoS 腳本完全關閉
用自定義規則,來實現 QoS
:)