|
IMQ 是中介隊列設(shè)備的簡稱,是一個虛擬的網(wǎng)卡設(shè)備,與物理網(wǎng)卡不同的是,通過它可以進行全局的流量整形,不需要一個網(wǎng)卡一個網(wǎng)卡地限速。這對有多個ISP接入的情況特別方便。配合 Iptables,可以非常方便地進行上傳和下載限速。
一、網(wǎng)絡(luò)環(huán)境簡介
目的站點 (Internet) IP: 218.x.x.x (用 TARGET_IP 表示)
路由器 (Router) eth1_外網(wǎng)IP: 221.x.x.x (用INET_IP表示) eth0_內(nèi)網(wǎng)IP: 192.168.0.1 (用 GW_IP 表示)
內(nèi)網(wǎng)客戶機 (PC) IP: 192.168.0.2 (用 LAN_IP 表示)
二、數(shù)據(jù)包流程分析
要明白怎么控制流量,在什么地方控制,首先得弄清楚數(shù)據(jù)包從進網(wǎng)卡到出網(wǎng)卡這個過程中,內(nèi)核對數(shù)據(jù)包做了哪些操作,具體可以看這里的圖示: http://www.//kptd/
下面就客戶機上傳下載時,數(shù)據(jù)包的流程走向進行一些分析
下載流程 ======== PC 向 Internet 發(fā)起數(shù)據(jù)下載請求 Internet 回應(yīng)相應(yīng)數(shù)據(jù) 數(shù)據(jù)包通過 eth1 流入 Router [src: TARGET_IP, dst: INET_IP] Router 重寫目的地址(DNAT) [src:TARGET_IP, dst: LAN_IP] <==================== 流量控制點 ==========================> 轉(zhuǎn)發(fā)到局域網(wǎng)網(wǎng)卡 eth0 通過 eth0 流出 Router, 進入局域網(wǎng) PC 接收到數(shù)據(jù)
顯然,要控制 PC 的下載速率,在 DNAT 之后可以做到
小結(jié): 下載控制, 控制外網(wǎng)向客戶機發(fā)送數(shù)據(jù)的速率 (在 DNAT之后, iptables 的 POSTROUTING 鏈)
上傳流程 ======== Internet 向 PC 發(fā)起數(shù)據(jù)上傳請求 PC 回應(yīng)相應(yīng)數(shù)據(jù) 數(shù)據(jù)包通過 eth0 流入 Router [src: LAN_IP, dst: TARGET_IP] <================== 流量控制點 =======================> Router 重寫源標地址(SNAT) [src:INET_IP, dst: TARGET_IP] 轉(zhuǎn)發(fā)到廣域網(wǎng)網(wǎng)卡 eth1 通過 eth1 流出 Router, 進入 Internet Internet 接收到數(shù)據(jù)
顯然,要控制 PC 的上傳速率,在 SNAT 之前可以做到
小結(jié): 上傳控制, 控制客戶機向外網(wǎng)發(fā)送數(shù)據(jù)的速率 (在 SNAT之前, iptables 的 PREROUTING 鏈)
三、讓Linux支持 IMQ
Linux 內(nèi)核以及 Iptables 并不直接支持 IMQ, 需要打補丁才行.
我用的是 linux-2.6.18, iptables-1.3.6,可以從 http://www./ 或 http://www./jdg-qos-script/ 下載到
打補丁的過程就不多說了....
內(nèi)核支持 IMQ 后,通過 ip link show 可以看到有 imq0 這樣的設(shè)備 (有多少個取決于你編譯內(nèi)核時的配置,默認有2個)
四、配合 Iptables 限速
假設(shè) imq0 用于下載限速,imq1 用于上傳限速, 先設(shè)置好 imq 設(shè)備的隊列規(guī)定、過濾器之類的,如同真實網(wǎng)卡一樣
IMQ 規(guī)則定義好后,只需在 iptables 的 mangle 鏈中加入2條規(guī)則即可:
#### 下載限速, 出口 eth0 iptables -t mangle -A POSTROUTING -o eth0 -j IMQ --todev 0
#### 上傳限速,入口 eth0 iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 1
五、單機限速
下載限速: 判斷數(shù)據(jù)包的目的 IP 上傳限速: 判斷數(shù)據(jù)包的來源 IP
提示: 由于上傳限速流控點是在 SNAT 之前,那是數(shù)據(jù)包里面還含有局域網(wǎng)IP的信息,故可以直接根據(jù)IP源信息來定位,無需再通過 iptables 做 MARK.
TC 例子:
### 限制 192.168.0.2 下載 100K,最大 120K tc class add dev imq0 parent 1:1 classid 1:10 htb \ rate 100kbps ceil 120kbps burst 10kb prio 2
tc qdisc add dev imq0 parent 1:10 handle 10 sfq perturb 10
tc filter add dev imq0 protocol ip parent 1:0 prio 100 u32 \ match ip dst 192.168.0.2 classid 1:10
### 限制 192.168.0.2 上傳 40K,最大 50K tc class add dev imq1 parent 1:1 classid 1:10 htb \ rate 40kbps ceil 50kbps burst 10kb prio 2
tc qdisc add dev imq1 parent 1:10 handle 10 sfq perturb 10
tc filter add dev imq1 protocol ip parent 1:0 pr
|