preload
六月 12


過程有點繁複, 記下來以免以後忘記.

(1) 安裝CentOS 5.2
(2) 升級到5.3. 此時kernel 版本為2.6.18-128.1.10.el5

(3) 下載Kernel source
#cd /usr/local/src
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.gz

(4) 下載iptable source
#wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.3.8.tar.bz2

(5) 下載』l7-filter kernel version』 package (netfilter-layer7-vX.Y.tar.gz)
到 http://sourceforge.net/project/showfiles.php?group_id=80085
去下載 netfilter-layer7-v2.21.tar.gz
#tar -zxvf netfilter-layer7-v2.21.tar.gz

(6) 下載』Protocol definitions』 package (l7-protocols-YYYY-MM-DD.tar.gz)
到 http://sourceforge.net/project/showfiles.php?group_id=80085
去下載 l7-protocols-2009-05-28.tar.gz
#tar -zxvf l7-protocols-2009-05-28.tar.gz

(7) Patch kernel
#cd /usr/src/kernels
#tar -zxvf /usr/local/src/linux-2.6.18.tar.gz
#mv linux-2.6.18 linux-2.6.18-l7_fileter
#cd linux-2.6.18-l7_filter
#patch -p1 < /usr/local/src/netfilter-layer7-v2.21/for_older_kernels/kernel-2.6.18-2.6.19-layer7-2.9.patch

(8) copy & setup kernel configure
#cp ../2.6.18-128.1.10.el5-i686/.config .
#make menuconfig

參照下面的設定(不同版本的kernel, 設定的位置不盡然相同):
"Prompt for development and/or incomplete code/drivers"
圖一
config1
圖二
config11

『Layer 7 match support』
圖一
config2
圖二
config21
圖三
config22
圖四
config23
圖五
config24

(9) Compile kernel
#ln -s linux-2.6.18-l7_fileter linux
#cd linux
#make
#make modules
#make modules_install
#make install

(10) 重新開機, 並使用新的kernel

(11) Compile new iptable(不同版本的iptables 及kernel, 修改方式也不同, 以下只列出iptable 1.3.8 和kernel 2.6.18 的操作方式)
#tar -jxvf iptables-1.3.8.tar.bz2
#cd iptables-1.3.8
#patch -p1 < ../netfilter-layer7-v2.21/iptables-1.3-for-kernel-pre2.6.20-layer7-2.21.patch
#chmod +x extensions/.layer7-test
#make KERNEL_DIR=/usr/src/kernels/linux-2.6.18-l7_filter
#mv /sbin/iptables /sbin/iptables.old
#make install KERNEL_DIR=/usr/src/kernels/linux-2.6.18-l7_filter

(12)安裝通訊定議檔
#cd l7-protocols-2009-05-28
#make install

以上, 算是安裝完畢.
接下來呢,就是要利用Traffic Control, 以及iptables, 來做想要的service 控管啦.
使用範例請參考參考Coyote Linux 頻寬管制 (QoS) 設定教學
我的Traffic Control 設定範例如下:
#cat traffic_control.sh


#!/bin/bash
#
# Traffic Control script

EXTIF=eth0   #對外的網路介面
INIF=eth1     #對內的網路介面

#
#Note: 這裡用的單位bps 是指Byte per second.
#

#
# QoS 上傳方面 ($EXTIF 為網路輸出介面, 即"eth0"或"eth1")

if [ ! -z $EXTIF ]; then
   # 清除 $EXTIF 所有佇列規則
   tc qdisc del dev $EXTIF root 2>/dev/null

   # 定義最頂層(根)佇列規則,並指定 default 類別編號
   tc qdisc add dev $EXTIF root handle 10: htb default 70

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

   # 定義第二層葉類別
   # rate 保證頻寬,ceil 最大頻寬,prio 優先權
   tc class add dev $EXTIF parent 10:1 classid 10:10 htb rate 2kbps  ceil 4kbps  prio 2
   tc class add dev $EXTIF parent 10:1 classid 10:20 htb rate 2kbps  ceil 4kbps  prio 2
   tc class add dev $EXTIF parent 10:1 classid 10:30 htb rate 32kbps ceil 40kbps prio 3
   tc class add dev $EXTIF parent 10:1 classid 10:40 htb rate 8kbps  ceil 16kbps prio 0
   tc class add dev $EXTIF parent 10:1 classid 10:50 htb rate 4kbps  ceil 12kbps prio 1
   tc class add dev $EXTIF parent 10:1 classid 10:60 htb rate 4kbps  ceil 32kbps prio 1
   tc class add dev $EXTIF parent 10:1 classid 10:70 htb rate 4kbps  ceil 32kbps prio 1  #預設頻寬

   # 定義各葉類別的佇列規則
   # parent 類別編號,handle 葉類別佇列規則編號
   # 由於採用 fw 過濾器,所以此處使用 pfifo 的佇列規則即可
   tc qdisc add dev $EXTIF parent 10:10 handle 101: pfifo
   tc qdisc add dev $EXTIF parent 10:20 handle 102: pfifo
   tc qdisc add dev $EXTIF parent 10:30 handle 103: pfifo
   tc qdisc add dev $EXTIF parent 10:40 handle 104: pfifo
   tc qdisc add dev $EXTIF parent 10:50 handle 105: pfifo
   tc qdisc add dev $EXTIF parent 10:60 handle 106: pfifo
   tc qdisc add dev $EXTIF parent 10:70 handle 107: pfifo

   # 設定過濾器
   # 指定貼有 10 標籤 (handle) 的封包,歸類到 10:10 類別,以此類推
   tc filter add dev $EXTIF parent 10: protocol ip prio 100 handle 10 fw classid 10:10
   tc filter add dev $EXTIF parent 10: protocol ip prio 100 handle 20 fw classid 10:20
   tc filter add dev $EXTIF parent 10: protocol ip prio 100 handle 30 fw classid 10:30
   tc filter add dev $EXTIF parent 10: protocol ip prio 100 handle 40 fw classid 10:40
   tc filter add dev $EXTIF parent 10: protocol ip prio 100 handle 50 fw classid 10:50
   tc filter add dev $EXTIF parent 10: protocol ip prio 100 handle 60 fw classid 10:60
   tc filter add dev $EXTIF parent 10: protocol ip prio 100 handle 70 fw classid 10:70
fi

# QoS 下載方面 ($INIF 為網路輸出介面, 即"eth0"或"eth1")
#

if [ ! -z $INIF ]; then
   # 清除 $INIF 所有佇列規則
   tc qdisc del dev $INIF root 2>/dev/null

   # 定義最頂層(根)佇列規則,並指定 default 類別編號
   tc qdisc add dev $INIF root handle 10: htb default 70

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

   # 定義第二層葉類別
   # rate 保證頻寬,ceil 最大頻寬,prio 優先權
   tc class add dev $INIF parent 10:1 classid 10:10 htb rate 2kbps ceil 32kbps prio 2
   tc class add dev $INIF parent 10:1 classid 10:20 htb rate 2kbps ceil 32kbps prio 2
   tc class add dev $INIF parent 10:1 classid 10:30 htb rate 32kbps ceil 212kbps prio 3
   tc class add dev $INIF parent 10:1 classid 10:40 htb rate 16kbps ceil 196kbps prio 0
   tc class add dev $INIF parent 10:1 classid 10:50 htb rate 8kbps ceil 188kbps prio 1
   tc class add dev $INIF parent 10:1 classid 10:60 htb rate 8kbps ceil 188kbps prio 1
   tc class add dev $INIF parent 10:1 classid 10:70 htb rate 8kbps ceil 188kbps prio 1

   # 定義各葉類別的佇列規則
   # parent 類別編號,handle 葉類別佇列規則編號
   tc qdisc add dev $INIF parent 10:10 handle 101: pfifo
   tc qdisc add dev $INIF parent 10:20 handle 102: pfifo
   tc qdisc add dev $INIF parent 10:30 handle 103: pfifo
   tc qdisc add dev $INIF parent 10:40 handle 104: pfifo
   tc qdisc add dev $INIF parent 10:50 handle 105: pfifo
   tc qdisc add dev $INIF parent 10:60 handle 106: pfifo
   tc qdisc add dev $INIF parent 10:70 handle 107: pfifo

   # 設定過濾器
   tc filter add dev $INIF parent 10: protocol ip prio 100 handle 10 fw  classid 10:10
   tc filter add dev $INIF parent 10: protocol ip prio 100 handle 20 fw  classid 10:20
   tc filter add dev $INIF parent 10: protocol ip prio 100 handle 30 fw  classid 10:30
   tc filter add dev $INIF parent 10: protocol ip prio 100 handle 40 fw  classid 10:40
   tc filter add dev $INIF parent 10: protocol ip prio 100 handle 50 fw  classid 10:50
   tc filter add dev $INIF parent 10: protocol ip prio 100 handle 60 fw  classid 10:60
   tc filter add dev $INIF parent 10: protocol ip prio 100 handle 70 fw  classid 10:70
fi

而iptables設定範例如下:


#限制imap的頻寬
iptables -t mangle -A POSTROUTING -m layer7 --l7proto imap -j MARK --set-mark 30

#阻擋ftp
iptables -t mangle -A INPUT  -m layer7 --l7proto ftp -j DROP
iptables -t mangle -A OUTPUT -m layer7 --l7proto ftp -j DROP

對於iptables 的設定, 並沒有像原網站那樣容易.
例如ftp, 其data port 並沒有固定, 若要限制頻寬, 還得增加額外設定, 目前還在研究中.

參考相關資料:
L7-filter Kernel Version HOWTO
Coyote Linux 頻寬管制 (QoS) 設定教學
L7-filter 安裝實錄
关于iptables的一些高级运用

Comments are closed.