[分享]利用imq建立一個具有多介面流量管制功能的防火牆主機

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

[分享]利用imq建立一個具有多介面流量管制功能的防火牆主機

文章cjc » 週一 3月 15, 2004 8:57 am

為何要作
因為與鄰居大頭,dennis一起拉了一條adsl,一共分割為3個子網路
為了讓網路不塞車,所以做了個這樣的東西
後來公司內部dmz及lan也需要頻寬管理,所以也拿去用了

什麼是imq
The intermediate queueing device
直接翻譯是"中間排序裝置"
也就是讓封包排序的地方
#真正的翻譯名詞我也不清楚,請知道的人說一下吧

為何需要imq
在tc建立類別時root是建立在各介面上
所以在多介面平衡的環境下
必須要使用imq來作為中繼

環境概略如下
ATUR-----eth0 | linux box | eth1,eth2,eth3....
#我實在不會用文字畫圖,請見諒

硬體需求
只跑nat
pentuium-200
64M

有跑dmz
cpu最好是Celeron-400以上
ram64m以上
PS.系統效能不足時會出現嚴重延遲的情形

我使用的軟體環境
OS Debian3.0r2
kernel-2.4.18
iptables 1.2.6a
iproute2
(曾經測試過的os還有RH-7.3,RH-8,RH-9)

另外所需的Patch請由以下連結下載
http://trash.net/~kaber/imq/imq-2.4.18.diff-combo-6
http://trash.net/~kaber/imq/libipt_IMQ-1.2.6a.tar.gz

其中因為2.4.18尚未支援htb所以想用HTB還需要HTB3
http://luxik.cdi.cz/~devik/qos/htb/v3/htb3.6-020525.tgz
ps.若你習慣用cbq一樣也是可以動作的


1.Patch iptables
找到你的iptables目錄一般是在/lib/iptables 或 /usr/lib/iptables
# tar xvzf libipt_IMQ-1.2.6a.tar.gz -C /lib/iptables

# tar xvzf libipt_IMQ-1.2.6a.tar.gz -C /usr/lib/iptables

2.編譯核心
先Patch kernel
命令如下
# patch -p1 <../imq-2.4.18.diff-combo-6

更改Makefile: /usr/src/linux-2.4/Makefile: EXTRAVERSION = -2.4.18_imq
make mrproper
make menuconfig

會出現以下3個選項:
Networking options ---> IP: Netfilter Configuration --->IMQ target support
Networking options ---> IPv6: Netfilter Configuration --->IMQ target support
Network device support --->IMQ (intermediate queueing device) support
把他們選起來,用模組即可

make dep modules bzImage modules_install

再依你使用的boot loder是grub或lilo作修改

完成後再以所產生的kernel開機
如果編譯核心及修改bootloder步驟有問題請參考
http://www.study-area.org/linux/system/linux_kernel.htm
http://linux.vbird.org/linux_basic/0540kernel.php
http://www.study-area.org/study.old/lin ... x_conf.htm
http://linux.vbird.org/linux_basic/0510osloader.php

#若你選擇HTB請將系統原有的tc以tarball裡的替換

3.設定防火牆的script
可以使用網中人大大的範例
http://www.study-area.org/linux/servers/linux_nat.htm

4.設定tc的script
以下是我的script
是用cbq
#!/bin/bash
modprobe imq numdevs=1

#下例為下傳:宣告佇列戒律
tc qdisc add dev imq0 root handle 20: cbq bandwidth 512Kbit avpkt 1000

#宣告頂層的類別為: 20:0
tc class add dev imq0 parent 20:0 classid 20:1 cbq bandwidth 512Kbit rate \
512Kbit allot 1514 weight 3Kbit prio 8 maxburst 20 avpkt 1000

#宣告客戶類別,及其頻寬大小
# cjc家下傳頻寬
tc class add dev imq0 parent 20:1 classid 20:100 cbq bandwidth 512Kbit rate \
80Kbit allot 1514 weight 3Kbit prio 5 maxburst 20 avpkt 1000 bounded
# 大頭家下傳頻寬
tc class add dev imq0 parent 20:1 classid 20:200 cbq bandwidth 512Kbit rate \
80Kbit allot 1514 weight 3Kbit prio 5 maxburst 20 avpkt 1000 bounded
# dennis家下傳頻寬
tc class add dev imq0 parent 20:1 classid 20:300 cbq bandwidth 512Kbit rate \
80Kbit allot 1514 weight 3Kbit prio 5 maxburst 20 avpkt 1000 bounded

# 宣告管理佇列
tc qdisc add dev imq0 parent 20:100 sfq quantum 1514b perturb 15
tc qdisc add dev imq0 parent 20:200 sfq quantum 1514b perturb 15
tc qdisc add dev imq0 parent 20:300 sfq quantum 1514b perturb 15

# 向核心解釋什麼樣的封包屬於什麼樣別:
tc filter add dev imq0 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.0.0/32 flowid 20:300
tc filter add dev imq0 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.1.0/32 flowid 20:300
tc filter add dev imq0 parent 20:0 protocol ip prio 100 u32 match ip dst 192.168.2.0/32 flowid 20:300

iptables -t mangle -A POSTROUTING -p tcp -j IMQ

ip link set imq0 up

聽說HTB效率比較好,所以公司的我改用HTB
分配384k給dmz(192.168.0.0/255.255.255.0)內的電腦
128k給lan(192.168.0.0/255.255.255.0的電腦
可以互相借用頻寬,並做上下載管理(雙向512)

#!/bin/bash
#download
modprobe imq numdevs=1
tc qdisc add dev imq0 handle 1: root htb default 2
tc class add dev imq0 parent 1: classid 1:1 htb rate 512kbit ceil 512kbit
tc class add dev imq0 parent 1:1 classid 1:10 htb rate 384kbit ceil 512kbit
tc class add dev imq0 parent 1:1 classid 1:11 htb rate 128kbit ceil 512kbit
tc filter add dev imq0 protocol ip pref 1 parent 1: handle 1 fw classid 1:10
tc filter add dev imq0 protocol ip pref 2 parent 1: handle 2 fw classid 1:11
tc filter add dev imq0 parent 1: protocol ip prio 100 u32 match ip dst 192.168.0.0/24 flowid 1:10
tc filter add dev imq0 parent 1: protocol ip prio 100 u32 match ip dst 192.168.1.0/24 flowid 1:11
iptables -t mangle -A PREROUTING -i eth0 -j IMQ
iptables -A FORWARD -t mangle -i eth0 -p tcp -j IMQ
ip link set imq0 up
#upload
tc qdisc add dev eth0 handle 2: root htb default 2
tc class add dev eth0 parent 2: classid 2:1 htb rate 512kbit
tc class add dev eth0 parent 2:1 classid 2:10 htb rate 384kbit ceil 512kbit
tc class add dev eth0 parent 2:1 classid 2:20 htb rate 128kbit ceil 512kbit
tc filter add dev eth0 protocol ip pref 1 parent 2: handle 1 fw classid 2:10
tc filter add dev eth0 protocol ip pref 2 parent 2: handle 2 fw classid 2:20
iptables -I PREROUTING -t mangle -s 192.168.0.0/24 -j MARK --set-mark 1
iptables -I PREROUTING -t mangle -s 192.168.1.0/24 -j MARK --set-mark 2


我的設定並沒有最佳化
各位如果有更好的設定
請一同分享
如果發現我有寫錯的地方也請指正
cjc
:-D
cjc
可愛的小學生
可愛的小學生
 
文章: 20
註冊時間: 週五 12月 05, 2003 10:38 pm
來自: taipei

回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客