博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

系统※网络技术实验室

System & Databses & Networking & Security & Services
evegl.cublog.cn
如何用IPtables限制BT、电驴等网络流量

今年4月,看到一则报道说尽管某宽带公司现有技术可以容纳的网络用户容量为400600万用户,可是目前,在容纳了45万用户的情况下,网络已经拥挤不堪,时常出现断网情况,一到上网高峰,网速就会急剧下降。

为何网络会如此拥挤不堪?这是因为自从出现诸如电驴、KazaaBTP2P软件之后,海量的数据文件(如大容量文件交换、视频文件下载等)逐渐占据了大部分的网络带宽。P2P这一新应用给用户带来了前所未有的方便和丰富的资源,但同时也引发了网络带宽和安全问题。

如何在发挥P2P强大功能的情况下对其进行一些必要的限制呢?本文将介绍在Linux中如何利用netfilter/iptables实现对P2P应用流量的限制。

升级内核

由于在公开发布的Linux内核文件中,有关iptables的各种参数里没有关于P2P属性的参数,所以必须通过升级Linux内核和iptables来打上这个补丁,使其支持P2P属性设置。

在具体操作之前,先要了解一下升级内核补丁需要的一些相关软件:linux-2.4.20-8.tar.gzpatch-o-matic-20040609.tar.bz2iptables-1.2.8.tar.bz2iptables-p2p-0.3.0a.tar.gzipp2p-0.5c.tar.gz

这里的测试环境为Red Hat 9.0,内核为2.4.20-8。由于2.4.*是一个稳定的内核,因此不能把当前开发的一些新功能提交到主内核中去,而只能首先在patch-o-matic中测试,然后打补丁到内核中。在CVS中可以找到最新的patch-o-matic—Patch-o-matic-20040609.tar.bz2

有了内核支持后,还需要iptables支持,其中iptables-p2p-0.3.0a.tar.gznetfilter/iptables组织开发的专门支持P2Piptables扩展软件包;ipp2p-0.5c.tar.gzEicke Friedrich开发的一个支持P2Piptables扩展包。这两个扩展包各有特色,后面将会分别介绍。

装载模块

首先在/usr/src下解压软件包:
#bzip2 -d patch-o-matic-20040609.tar.bz2

生成patch-o-matic-20040609.tar.out

#tar xvf patch-o-matic-20040609.tar.out

生成补丁目录patch-o-matic-20040609Red Hat 9.0中默认的内核目录为/usr/src/linux-2.4。进入补丁目录/usr/src/patch-o-matic-20040609,由于支持P2P协议控制选项需要CONNMARK模块,该模块在extra子目录下,因此需要运行如下命令来升级内核补丁。

#KERNEL_DIR=/usr/src/linux-2.4 ./runme extra

运行该命令后会出现一个模块选择界面,界面有两个区域,一个给出相关的模块名、模块功能、用法和语法实例;另一个给出各种选项,如N/y/b/r.../q/?,其中第一个为大写字母,表示缺省选项,n表示下一个模块,y表示确定,b表示上一个模块,q表示退出。

首先应该确定当前的模块是否需要,不需要就按“N”键后回车,继续显示下一个模块的相关信息。当出现需要的模块时,按“Y”键确认,同时应该将里面的相关语法实例抄录下来以备用。选择完所有需要的模块后,按“Q”键退出。

编译内核

进入内核文件所在目录/usr/src/linux-2.4,开始编译内核:

#make mrproper
#make xconfig
(或#make menuconfig

注意,在配置选项中必须选择Networking options→IP:Netfilter Configuration→Connection mark tracking supportCONNMARK target support两个选项。确保关键文件在正确位置:

#make dep

编译大内核:

 

 



#make bzImage

编译选择的模块:

#make modules

将编译后的模块转移到系统标准位置:

#make modules_install

让系统自动修改启动配置文件grub.conf

#make install

重新启动系统,选择Red Hat Linux2.4.20-8custom)选项,则启动了新编译的内核。

升级iptables

安装iptables-1.2.8

首先解压iptables-1.2.8.tar.bz2文件:

#bzip2 -d iptables-1.2.8.tar.bz2
#tar xvf iptables-1.2.8.tar.out

编译iptables-1.2.8

#make KERNEL_DIR=/usr/src/linux-2.4
#make install KERNEL_DIR=/usr/src/linux-2.4
#make install-devel

拷贝可执行文件到相应目录:

#cp iptables iptables-save iptables-restore /sbin

安装iptables-p2p软件
首先解压iptables-p2p-0.3.0a.tar.gz

#tar zxvf iptables-p2p-0.3.0a.tar.gz
#cd iptables-p2p-0.3.0a

拷贝iptables-1.2.8的头文件到适当的目录:

#cp -a /usr/src/iptables-1.2.8/include/* /usr/include

运行“make”编译iptables-p2p,并拷贝相关文件到相应的目录:

#make
#cp kernel/ipt_p2p.o /lib/modules/2.4.20-8custom/kernel/net/ipv4/netfilter/
#cp iptables/libipt_p2p.so /lib/iptables/

安装ipp2p软件

首先修改Makefile文件中的源目录、内核目录和netfilter版本号,将以下内容:

IKERNEL = -I/usr/src/linux/include
IUSER = -I/usr/src/iptables-1.2.7a/include
NETFILTER_VERSION = \"1.2.7a\"

改为:

IKERNEL = -I/usr/src/linux-2.4/include
IUSER = -I/usr/src/iptables-1.2.8/include
NETFILTER_VERSION = \"1.2.8\"


编译软件,并拷贝库文件到相应的目录:

#make
#cp libipt_ipp2p.so /lib/iptables

装入模块:

#insmod ipt_ipp2p

应用和检测P2P限制功能

iptables-p2p
的应用

1
iptables-p2p目前支持如下协议:

FastTrackKaZaaGrokster......

eDonkeyeDonkeyeMule......

Direct Connect

Gnutellaregular clients and Shareaza's gnutella 2

BitTorrent

OpenFTgiFT

需要安装CONNMARK模块,通过CONNMARK模块的标记包来使用iptables-p2p

2
.通过-help参数获取帮助:


#iptables -m p2p -help
……
P2P match v0.3.0a options:
--p2p-protocol [!] protocol[,...]
--p2p ...
match application-layer protocol
(匹配的应用层协议)
Valid p2p protocols:
P2P支持的有效协议如下:)
fasttrack
gnutella
edonkey
dc
bittorrent
openft

iptables-p2p
模块通过-m p2p参数来实现对所有已知P2P连接请求的识别。注意,-m p2p只能识别P2P类型的连接请求,不能识别所有的P2P包,可以通过--p2p-protocol子参数来识别P2P的各种已知协议类型。

3
.应用实例

#iptables -A FORWARD -m p2p -j DROP

阻塞网络上所有的P2P连接请求。

#iptables -A FORWARD -m p2p --p2p-protocol fasttrack,bittorrent -j DROP

阻塞网络上fasttrackbittorrent协议连接请求。

在实际使用过程中必须和CONNMARK目标结合起来,然后通过tc过滤才能真正对所有P2P包进行限制。更多的信息可以参考example/limit-p2p.sh的实例脚本。

ipp2p
的应用

1
ipp2p目前支持如下Linux内核和iptables版本:

Linux-Kernels 2.62.6.3

Linux-Kernels 2.42.4.182.4.192.4.202.4.212.4.222.4.23

iptableswww.netfilter.org1.2.7a1.2.81.2.9

2
.获取ipp2p帮助

# iptables -m ipp2p --help
……
IPP2P v0.5c options:
--ipp2p Grab all known p2p packets
(抓所有已知的P2P包)
--ipp2p-data Grab all known p2p data packets
(抓所有已知P2P数据包)
--edk Grab all known eDonkey/eMule/Overnet packets
(抓所有已知的eDonkey/eMule/Overnet类型的包)
--edk-data Grab all eDonkey/eMule/Overnet data packets
(抓所有已知的eDonkey/eMule/Overnet数据包)
--dc Grab all known Direct Connect packets
(抓所有已知的直接连接包)
--dc-data Grab all Direct Connect data packets
(抓所有已知的直接连接数据包)
--kazaa Grab all KaZaA packets
(抓所有KaZaA包)
--kazaa-data Grab all KaZaA data packets
(抓所有KaZaA数据包)
--gnu Grab all Gnutella packets
(抓所有Gnutella包)
--gnu-data Grab all Gnutella data packets
(抓所有Gnutella数据包)
--bit Grab all BitTorrent packets (beta - handle with care)
(抓所有BitTorrent包)
--apple Grab all AppleJuice packets (beta - handle with care)
(抓所有AppleJuice包)
--soul SoulSeek (beta - handle with care)
SoulSeek类型的包)
……

3
.应用实例

ipp2p
只能识别P2P连接请求,而不能识别所有P2P包,因此也必须和CONNMARK目标结合在一起使用,目前只支持TCP协议标示。下面来看一个实例。

#iptables -A PREROUTING -t mangle -p tcp -j CONNMARK --restore-mark

上面代码表明从CONNMARK目标中恢复标记。
#iptables -A PREROUTING -t mangle -p tcp -m mark ! --mark 0 -j ACCEPT

上面代码表明接收所有非0的标记包。
#iptables -A PREROUTING -t mangle -p tcp -m ipp2p --ipp2p -j MARK --set-mark 1

上面代码表明将ipp2p连接标记为1”

#iptables -A PREROUTING -t mangle -p tcp -m mark --mark 1 -j CONNMARK --save-mark

上面代码表明保存所有标记为1”的包到CONNMARK目标中。

通过上面设置得到的结果是,每一个标示为P2P连接的包被标记成1”,然后再通过tc过滤,执行下面的操作:
#tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 1 fw classid 1:11
#tc filter add dev eth1 parent 2:0 protocol ip prio 4 handle 1 fw classid 2:11

使用HTB和过滤,将所有标记为1”的包放到每一个设备类中,通过对这些设备类的限制来达到对P2P连接带宽的限制。

更多的信息可以参考http://rnvs.informatik.uni-leipzig.de/ipp2p/

应用效果

笔者在单位防火墙上应用了iptables-p2pipp2p配置,对P2PFastTrack协议进行限制后,用贪婪BTABC)进行测试,取得了理想的效果,能有效地限制P2P通信。

 


此帖于 2005-10-21 21:17 zhuomingliang 编辑.

 

 

 

 

【推荐】在2.6内核下不编译内核给iptables添加模块


阅读:19966 时间:2005-8-14 0:13:03 来源:www.chinaunix.net
看了platinum兄弟写的在2.4内核下给iptables添加模块,想在2.6的内核下也试试,经过一天半的努力,并参考platinum兄弟的文章,
终于成功,写下来跟CU的兄弟们分享,我的系统为fedora2+linux-2.6.5-1.358

1,
安装kernel源码
[root@jiecho]# yum install kernel-source

2,
下载iptables-1.3.3.tar.bz2patch-o-matic-ng-20050810.tar.bz2并解包,为了方便,我们都放在/usr/src,
并把kerneliptables做符号链接.
[root@jiecho]# cd /usr/src
[root@jiecho]# wget ftp://ftp.be.netfilter.org/pub/netf...s-1.3.3.tar.bz2
[root@jiecho]# wget ftp://ftp.be.netfilter.org/pub/netf...0050810.tar.bz2
[root@jiecho]# tar -jxvf iptables-1.3.3.tar.bz2
[root@jiecho]# tar -jxvf patch-o-matic-ng-20050810.tar.bz2
[root@jiecho]# ln -s linux-2.6.5-1.358 linux
[root@jiecho]# ln -s iptables-1.3.3 iptables

3,
netfilter打补丁,选择你要的模块,为了测试我就选择了ipp2ptime
[root@jiecho]# cd /usr/src/linux
[root@jiecho]# make mrproper
[root@jiecho]# make menuconfig
什么不做,保存退出,然后把Makefile改一下
[root@jiecho]# vi Makefile
EXTRAVERSION = -1.358custom更改为EXTRAVERSION = -1.358
保持跟uname -a 的版本一致(可详细参考platinum兄弟的文章)
[root@jiecho]# cd /usr/src/patch-o-matic-ng-20050810
[root@jiecho]# ./runme ipp2p
[root@jiecho]# ./runme time
因为事先做好了符号链接,等问你kerneliptables的位置的时候直接回车就行,
提示你是否添加ipp2ptime模块是就y确定,至此,netfilter的补丁打完了,如果你需要别的模块可以根据需要加上.
××××(要重新编译iptables包)
4,
编译kernelmodules
[root@jiecho]# cd /usr/src/linux
[root@jiecho]# make menuconfig
Device Drivers->Networking support->Networking options->Network packet filtering (replaces ipchains)
->IP: Netfilter Configuration
中把下面的两项M选中.
TIME match support
IPP2P match support
然后保存退出
4,
编译安装模块
下面就是最重要的步骤了,因为我们的原则是节省时间,不重新编译内核,而只编译其中的模块,
这点2.4的内核跟2.6的内核有所不同,郁闷了我一整天,2.4内核的模块是以*.o形式的,2.6内核是以*.ko形式的,
这有个改变的方法,参考:http://blog.chinaunix.net/article.p...742&blogId=2662

代码:

 

[root@jiecho]# make modules

 HOSTCC  scripts/basic/fixdep

 HOSTCC  scripts/basic/split-include

 HOSTCC  scripts/basic/docproc

 HOSTCC  scripts/conmakehash

 HOSTCC  scripts/kallsyms

 CC      scripts/empty.o

 HOSTCC  scripts/mk_elfconfig

 MKELF   scripts/elfconfig.h

 HOSTCC  scripts/file2alias.o

 HOSTCC  scripts/modpost.o

 HOSTCC  scripts/sumversion.o

 HOSTLD  scripts/modpost

 HOSTCC  scripts/pnmtologo

 HOSTCC  scripts/bin2c


到这里就可以ctrl+c中止了,因为我们不是要编译所有的模块,这样太浪费时间,而仅仅是netfilter的模块,
但是如果你直接执行make modules SUBDIRS=net/ipv4/netfilter就会出错,这就是2.42.6的区别,
我们先生成了scripts目录下的一系列需要的文件后就可以make modules SUBDIRS=net/ipv4/netfilter,
并用modpost等等把*.o文件生成为*.ko文件.
[root@jiecho]# make modules SUBDIRS=net/ipv4/netfilter
编译完成netfilter的模块后拷贝编译完成的模块
[root@jiecho]# cp /usr/src/linux/net/ipv4/netfilter/ipt_ipp2p.ko /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/
[root@jiecho]# cp /usr/src/linux/net/ipv4/netfilter/ipt_time.ko /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/
[root@jiecho]# chmod +x /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/ipt_ipp2p.ko
[root@jiecho]# chmod +x /lib/modules/2.6.5-1.358/kernel/net/ipv4/netfilter/ipt_time.ko
[root@jiecho]# depmod -a
5,
编译iptables
[root@jiecho]# cd /usr/src/iptables
参照INSTALL文件我们进行编译安装
[root@jiecho]# make KERNEL_DIR=/usr/src/linux
会有错误编译不过
/usr/src/linux/include/linux/config.h:6:2: [root@jiecho]#error including kernel header in userspace; use the glibc headers instead!
google了半天也没有找到是什么原因,就自己动手解决
[root@jiecho]# vi /usr/src/linux/include/linux/config.h
把下面的三行注释掉
//#ifndef __KERNEL__
//#error including kernel header in userspace; use the glibc headers instead!
//#endif

然后重新编译安装
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux
完成安装以后测试一下

代码:

 

[root@jiecho]# iptables -V

[root@jiecho]# modprobe ipt_time

[root@jiecho]# modprobe ipt_ipp2p

[root@jiecho]# lsmod

ipt_time                2432  0

ipt_ipp2p               7552  0

ipt_REJECT              4736  1

ipt_state               1536  1

ip_conntrack           24968  1 ipt_state

iptable_filter          2048  1

ip_tables              13440  5 ipt_time,ipt_ipp2p,ipt_REJECT,ipt_state,iptable_filter

battery                 6924  0

ipv6                  184288  10

3c59x                  30376  0

binfmt_misc             7176  1

nls_utf8                1536  4

ntfs                   81516  4

dm_mod                 33184  0

uhci_hcd               23708  0

button                  4504  0

asus_acpi               8472  0

ac                      3340  0

ext3                  102376  4

jbd                    40216  1 ext3


测试iptables
[root@jiecho]# iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
[root@jiecho]# iptables -A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri
[root@jiecho]# iptalbes -L

 

__________________
虚心 +反省

 

 

 

Beyond Linux From Scratch: 版本 20030629

后退

18. 基本网络程序

前进


ncftp-3.1.5

介绍ncftp

下载地址 (HTTP):        
下载地址(FTP):        ftp://ftp.ncftp.com/ncftp/ncftp-3.1.5-src.tar.bz2
版本:                       3.1.5
包的大小:                   392 KB
占用的空间:                 4.8 MB

ncftp包包含一个强大的,富有弹性的FTP协议接口。它被用来替代和补充原来的 ftp程序。

安装ncftp

有两种方法安装ncftp. 第一种,也是最佳的方法,就是把常用的功能编到共享目录里,然后编译和连接程序,把共享库连接指向它。第二种方法把所有的功能指向可以执行的二进制static代码。这将使其他的程序无法连接到代码库,使用代码。你来选择适合你的方法。注意第二种方法 不创建 一个整个的静态连接执行文件,只有libncftp部分被静态连接。编译和使用共享库是 Clarified Artistic License 所允许的,然而开发使用共享库的程序需要遵守另外一个协议。

用第一种最佳的方法, 运行下面的命令:

./configure --prefix=/usr &&
cd libncftp &&
make shared &&
make soinstall &&
cd .. &&
make &&
make install

利用第二种方法(libncftp功能静态连接) 执行下面的命令:

./configure --prefix=/usr &&
make &&
make install

命令解释

cd libncftp && 
make shared && 
make soinstall

这些命令编译动态链接库 libncftp,这个库将被主程序链接。

配置ncftp

配置文件

~/.ncftp/*; 特别的 ~/.ncftp/prefs_v3

配置信息

ncftp的大多数配置可以在程序中完成,程序会生成设置文件。一个例外是 ~/.ncftp/prefs_v3,其中很多选项需要在那里完成。

yes-i-know-about-NcFTPd=yes:这将禁止显示NcFTP服务器的splash广告。

prefs_v3 file中还有许多其他的选项,很多是不需要加以说明的。

内容

ncftp软件包包含 ncftp, ncftpbatch, ncftpbookmarks, ncftpget, ncftpls, ncftpput and ncftpspooler.

描述

ncftp

一个Ftp浏览程序。

ncftpbatch

Individual batch FTP job processor

ncftpbookmarks

NcFTP书签编辑器

ncftpget

Internet scripts文件传输程序

ncftpls

Internet scripts文件传输程序

ncftpput

Internet scripts文件传输程序

ncftpspooler

全局批处理 FTP 工作守护进程。


后退

起点

前进

基本网络程序

上一级

OpenSSH-3.6.1p1 client

 

 


使用TC实现基于linux的流量管理




参考文献:tc weizhishu www.chinalinuxpub.com
Linux Advanced Routing & Traffic Control HOWTO by Bert Hubert
http://www.chinalinuxpub.com/vbbfor...&threadid=18601
请认真阅读上面的文章,掌握好相应的概念。
Red Hat Linux 7.3
内核 2.4.18 以上。
局域网的网络拓扑:


在服务器的eth0 帮定了外部地址 eth0192.168.1.3
eth1
帮定了内部地址 eth1:1 172.17.1.1
eth1:2 172.18.1.1
eth1:3 172.19.1.1

现在要实现的功能就是整个出口限制在512kbit(上传流量) , 172.17网段的下载流量下载到512Kbit ,172.18 网段限制在128kbit172.19的网段限制到 3Mbit
方法如下:
首先帮定相应的地址:(不细述)
实现路由设定,使用iptables实现。

# iptables –A input -F
# iptables -A output -F
# iptables -A forward -F
#echo 1 > /proc/sys/net/ipv4/ip_forward
#
允许转发
# iptables -A input –j accept
# iptables -A output -j accept
# iptables -A forward -j accept
# iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -j MASQUERADE
# iptables -t nat -A POSTROUTING -s 172.19.0.0/16 -j MASQUERADE

#进行IP地址伪装,使得内部的主机的数据包能通过服务器与外界联系。
进行流量管理

tc qdisc add dev eth0 root tbf rate 512k lantency 50ms burst 1540

#在网卡eth0上使用tbfTokenBucket Filter)过滤队列,将出口限制在512kbit,延迟50ms,突发数据1540rate指定的数值就是限制的带宽。
继续在eth1做限制。

#tc qdisc add dev eth1 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8

#创建队列,指明网卡为100M网卡,这个跟流量限制无关,用于计算使用。

tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 5Mbit weight 6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

创建根分类,带宽限制在5Mbit,并且不允许借用别的带宽。
Prio
后面的参数为优先级,指定数据包处理的顺序。

tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 512kbit weight 5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

在跟类底下,创建分类13 限制带宽为512kbit,不允许借用带宽,用于172.17网段。

tc class add dev eth1 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 128kbit weight 5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

在跟类底下,创建分类14 限制带宽为128kbit,不允许借用带宽,用于172.18网段。

tc class add dev eth1 parent 1:1 classid 1:5 cbq bandwidth 100Mbit rate 3Mbit weight 10Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

在跟类底下,创建分类15 限制带宽为3Mbit,不允许借用带宽,用于172.19网段。

tc qdisc add dev eth1 parent 1:3 handle 30: sfq
tc qdisc add dev eth1 parent 1:4 handle 40: sfq
tc qdisc add dev eth1 parent 1:5 handle 50: sfq

在每个分类底下,创建队列,使用sfqStochastic Fareness Queueing)随即公平队列。

tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.17.0.0/16 flowid 1:3
tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.18.0.0/16 flowid 1:4
tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip dst 172.19.0.0/16 flowid 1:5

使用u32过滤器,对目的地址进行分类,对应已经创建的队列。
通过以上方式实现了简单的流量控制,限制出口的上传流量以及内口的下载流量。
测试从 172.17.1.2 进行下载 限制的是 512kbit ,下载速率为 64-65kB
172.18.1.2
进行下载 限制的是 128kbit,下载速率为 13-16.3kB
172.19.1.2
进行下载 限制的是 3Mbit,下载速率达到 180-500kB
注:不匹配任何规则的数据包,将已root 设定的规则发送。
发现3M带宽的限制误差比较大。
以上的测试都是基于单机的,没有测试满负载的情况。
以上的文章是匆忙之中写出来的,TC过滤器涉及到的东西极多,有很多中方法可以实现,基于ip地址或者基于端口都可以实现。

希望各位多多讨论,多多完善。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TC(HTB)+iptables作流量控制


:admin 发表时间2005-5-12 20:56:27

TC(HTB)+iptables作流量控制
[ 繁体中文/BIG5 ] [ 简体中文/GB ]


 UNIX中文宝库    http://www.douzhe.com

20050403   作者:   转自:    点击: 358

一、环境和要求:
线路:ADSL2M/512K
eth0:10.0.0.136,外网口
eth1:192.168.1.1,内网口

业务需求:保证正常的网页浏览,FTPSMTPPOP3,对其它的所有应用加以限制,以免影响正常业务的使用。

1、让交互数据包保持较低的延迟时间,也就是说上载或下载文件不会打扰SSH/telnet等。
2、上载或下载期间有合理的速率用于网页浏览,即使http属于一种大量数据传输,也不应受其它传输影响太大
3、对FTP-data限速,不会占用所有带宽
4、对SMTPpop3限速
5、对未分类的进行限制,以免影响
6、保证上载不会影响下载,上载数据流会影响下载的速率,这是相当普遍的现象。
7、对每个IP的下载速率进行限制
8、取得空闲带宽的优先级别如:交互数据,FTP-data,smtp,pop3;网页浏览,其它业务优先级别最低


二、方法:

1(eth0)使用HTB分成五类:如下图
+---------+
| root 1: |
+---------+
|
+--------------------------------+
| class 1:1 |
+--------------------------------+
| | | | | |
+----+ +----+ +----+ +----+ +----+
|1:11| |1:12| |1:13| |1:14| |1:15|
+----+ +----+ +----+ +----+ +----+

classid 1:11

1)这个类优先权最高。拥有最低的延迟并最先取得空闲带宽,因此要设置这个类的峰值速率。
sshtelnetdnsquake3irc,ftp控制,smtp命令和带有SYN标记的数据包都应属于这一类。

2)为了保证上行数据流不会伤害下行流,我们还要把ACK数据包排在队列前面。这就是当发生大批量数据流的时

候,双向传输均受到严重影响的原因。因为下行数据的ACK必须同上行流进行竞争,并在处理过程中被延迟。

3)限制上载速率:把上载速率限制在比可用带宽稍小一些的位置上,于是你的MODEM中就不会形成队列了。

4)排除了下行队列(除了偶尔的突发),保证交互数据包永远排在上行队列的最前面。

classid 1:12:大批量传输的类。主要用来处理浏览网页的数据包,目标端口80,8080,443,8443的包。

classid 1:13:此类是拥用最大吞吐TOS位的数据包。用于处理目的地址为xxxxFTP-data

classid

1:14:这里是邮件(SMTPpop3)相关和TOS要求最小成本的数据流。用于处理目的地址为xxxxsmtp,pop3服务

classid 1:15:最后是经过NAT进行大批量传输的机器,以保证他们不会妨碍正常服务。

2(eth0)限制下载速率:。丢掉那些太快到来的数据包,不让他们导致TCP/IP的速率低于我们期望的速率。因

为我们不希望轻易地丢弃数据包,所以我们要配置“burst”来容纳突发传输。

3(eth1)限制下载速率:对每一个IP限制最高下载速率



三、
1、队列处理

#脚本:用384kbps作为峰值速率,调整CEIL为上行速率的75%
#Set the following values to somewhat lesss than your actual download and uplink speed.
DOWNLINK=2000
UPLINK=384

#清空已有的队列,并把出错消息清空
#clean existing down and uplink qdiscs,put the errors to /dev/null
tc qdisc del dev eth0 root    2> /dev/null > /dev/null
tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null
tc qdisc del dev eth1 root    2> /dev/null > /dev/null

########################################uplink###########################################

#建立HTB父类,默认数据由115这个类通走
#install root HTB,point default traffic to 1:15:
tc qdisc add dev eth0 root handle 1: htb default 15

#设定uplink的最大速率。
#shape everything at $UPLINK speed -this prevents huge queues in your DSL modem which destroy

latency:
# main class
tc class add dev eth0 parent 1:  classid 1:1  htb rate ${UPLINK}kbit ceil ${UPLINK}kbit

#分类,111为最高优先级别,stmp,pop3,ftp-data次之,网页浏览再次之。并对每个类限制了最高速率。
#high prio class 1:11:
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 128kbit ceil 128kbit prio 0
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 128kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 32kbit ceil ${UPLINK}kbit prio 1
tc class add dev eth0 parent 1:1 classid 1:14 htb rate 32kbit ceil ${UPLINK}kbit prio 1
#bulk & default class 1:15 -gets slightly less traffic,and a lower priority:
tc class add dev eth0 parent 1:1 classid 1:15 htb rate 16kbit ceil ${UPLINK}kbit prio 3


可以在类下面再附加上另一个队列规定,以保证带宽的公平使用:
#bost get Stochastic Fairness:
tc qdisc add dev eth0 parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev eth0 parent 1:13 handle 13: sfq perturb 10
tc qdisc add dev eth0 parent 1:14 handle 14: sfq perturb 10
tc qdisc add dev eth0 parent 1:15 handle 15: sfq perturb 10


2、分类:
上面的队列处理中等于把所有发出的数据包都送给了1:15
(tc qdisc add dev eth0 root handle 1: htb default 15)
现在应该需要告诉机器那些数据包走哪条路。设置过滤器以便用iptables对数据包进行分类。
可以通过RETURN方法避免遍历所有的规则。
#TOS Mininum Delay (ssh,telnet) in 1:11:
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
#80,8080,443 in 1:12
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
#ftp-data in 1:13
tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
#smtp,pop3 in 1:14
tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:14
#
tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:15

这样数据包会有一个特定的FWMARK标记值(hanlde x fw),表明它应该送给哪个类( classid x)
后面要给数据包打标记。


3、丢掉那些太快到来的数据包,不让他们导致TCP/IP的速率低于我们期望的速率。因为我们不希望轻易地丢弃数据包,所以我们要配置“burst”来容纳突发传输。,
########################################DOWNLINK###########################################
# install the ingress qdisc on the ingress
tc qdisc add dev eth0 handle ffff: ingress
# DROP everything that's coming in too fast:
tc filter add dev eth0 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1


4、对内网的IP速率进行限制
tc qdisc add dev eth1 root handle 2: htb  
tc class add dev eth1 parent 2: classid 2:1 htb rate 128kbit ceil ${DOWNLINK}kbit
tc qdisc add dev eth1 parent 2:1 sfq
tc filter add dev eth1 parent 2:0 protocol ip prio 4 u32 match ip dst 192.168.1.0/24 flowid 2:1


四、现在对数据进得mark
1、首先启用ip转发,做NAT转换,并设定默认iptable策略:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth0 -j SNAT --to-source

10.0.0.136

2、设置TOS的处理:
最小延迟的归第一类
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN

这里是邮件(SMTPpop3?)相关和TOS要求最小成本的数据流。
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN

最后是路由器后面经过NAT进行大批量传输的机器。以保证他们不会妨碍正常服务。
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x5
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN


3、给数据包打标记
1
提高tcp初始连接(也就是带有SYN的数据包)的优先权是非常明智的:
# tag all incoming SYN packets through eth0 as mark value
iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

ftp控制放第1,因为一般是小包,  
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN

然后提高ssh数据包的优先权:
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN

DNS放第一类,
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN



2:用于放置大批量传输的类。用来处理浏览网页的数据包,目标端口80的包。
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 0x2  
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 0x2  
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN


3ftp-data放在第3,要求最大吞吐.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN

4
邮件(SMTPpop3)相关和TOS要求最小成本的数据流。
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN

5:前面没有打过标记的数据包将交给1:15处理:
iptables -t mangle -A PREROUTING -j MARK --set-mark 0x5


4、最后应该在OUTPUT链中再重复一遍上面的设置,也就是说把命令中的–A PREROUTING改成-A OUTPUT

iptables -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j RETURN

iptables -t mangle -A OUTPUT -m tos --tos Minimize-Cost -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -m tos --tos Minimize-Cost -j RETURN

iptables -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j MARK --set-mark 0x5
iptables -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 22 -j RETURN

iptables -t mangle -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
iptables -t mangle -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 80 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 443 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 443 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 443 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8080 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8080 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8080 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp-data -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp-data -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 25 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 25 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 110 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 110 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 110 -j RETURN

iptables -t mangle -A OUTPUT -j MARK --set-mark 0x3

5iptables策略

iptables -A INPUT -p ALL -i eth1 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p ALL -i lo -j ACCEPT
iptables -A INPUT -p ALL -d 10.0.0.136 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p ALL -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -p ALL -s 192.168.1.1 -j ACCEPT
iptables -A OUTPUT -p ALL -s 10.0.0.136 -j ACCEPT

#因为我上面做了squid代理,所以把80的数据都转发给squid处理
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128


附完整脚本:

代码:

#!/bin/bash
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth0 -j SNAT --to-source 10.0.0.136

# start filters
# TOS Minimum Delay (ssh, NOT scp) in 1:11:
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN

iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN

iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x5
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 22 -j RETURN

iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
iptables -t mangle -I PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 0x2  
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 0x2  
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN


iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 0x4
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN

iptables -t mangle -A PREROUTING -j MARK --set-mark 0x5



iptables -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -m tos --tos Minimize-Delay -j RETURN

iptables -t mangle -A OUTPUT -m tos --tos Minimize-Cost -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -m tos --tos Minimize-Cost -j RETURN

iptables -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j MARK --set-mark 0x5
iptables -t mangle -A OUTPUT -m tos --tos Maximize-Throughput -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 22 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 22 -j RETURN

iptables -t mangle -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
iptables -t mangle -I OUTPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p udp -m udp --dport 53 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 80 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 443 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 443 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 443 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8080 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8080 -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8080 -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport ftp-data -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp-data -j MARK --set-mark 0x3
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport ftp-data -j RETURN

iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 25 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 25 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 110 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 110 -j MARK --set-mark 0x4
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 110 -j RETURN
iptables -t mangle -A OUTPUT -j MARK --set-mark 0x3


iptables -A INPUT -p ALL -i eth1 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p ALL -i lo -j ACCEPT
iptables -A INPUT -p ALL -d 10.0.0.136 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p ALL -s 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -p ALL -s 192.168.1.1 -j ACCEPT
iptables -A OUTPUT -p ALL -s 10.0.0.136 -j ACCEPT

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128


#Set the following values to somewhat lesss than your actual download and uplink speed.
DOWNLINK=1600
UPLINK=384

#clean existing down and uplink qdiscs,put the errors to /var/log/htb_log
tc qdisc del dev eth0 root    2> /dev/null > /dev/null
tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null
tc qdisc del dev eth1 root    2> /dev/null > /dev/null

########################################uplink###########################################

#install root HTB,point default traffic to 1:15:
tc qdisc add dev eth0 root handle 1: htb default 15 r2q 1
#shape everythin at $UPLINK speed -this prevents huge queues in your DSL modem which destroy

latency:
# main class
tc class add dev eth0 parent 1:  classid 1:1  htb rate ${UPLINK}kbit ceil ${UPLINK}kbit
#high prio class 1:11:
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 128kbit ceil 128kbit prio 0
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 128kbit ceil ${UPLINK}kbit prio 2
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 32kbit ceil ${UPLINK}kbit prio 1
tc class add dev eth0 parent 1:1 classid 1:14 htb rate 32kbit ceil ${UPLINK}kbit prio 1
#bulk & default class 1:15 -gets slightly less traffic,and a lower priority:
tc class add dev eth0 parent 1:1 classid 1:15 htb rate 16kbit ceil ${UPLINK}kbit prio 3

#bost get Stochastic Fairness:
tc qdisc add dev eth0 parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev eth0 parent 1:13 handle 13: sfq perturb 10
tc qdisc add dev eth0 parent 1:14 handle 14: sfq perturb 10
tc qdisc add dev eth0 parent 1:15 handle 15: sfq perturb 10

#TOS Mininum Delay (ssh,telnet) in 1:11:
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:13
tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:14
tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:15

# install the ingress qdisc on the ingress
tc qdisc add dev eth0 handle ffff: ingress
# DROP everything that's coming in too fast:
tc filter add dev eth0 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 15k drop flowid :1


tc qdisc add dev eth1 root handle 2: htb  
tc class add dev eth1 parent 2: classid 2:1 htb rate 128kbit ceil ${DOWNLINK}kbit
tc qdisc add dev eth1 parent 2:1 sfq
tc filter add dev eth1 parent 2:0 protocol ip prio 4 u32 match ip dst 192.168.1.0/24 flowid 2:1




六、查看状态:
tc -s -d qdisc show dev eth0
tc -s -d class show dev eth0

可以看到1:11,115都有了一定流量,然后,你可以试试收发邮件和FTP-data1:13,1:14也会有一定流量的。

 

 

 

查看完整版本 : FC4上给iptables打补丁的具体步骤(原创)


murong

06-02-09, 09:05

=======================================================================================================

1.
安装FC4的时候把把编辑工具选上

=======================================================================================================

2.
http://www.kernel.org/pub/linux/kernel/v2.6/下载linux-2.6.11.1.tar.bz2内核
http://ftp.netfilter.org/pub/iptables/下载iptables-1.3.3.tar.bz2
http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/下载patch-o-matic-ng-20060206.tar.bz2

cd /usr/src
wget http://www.kernel.org/pub/linux/ ... ux-2.6.11.1.tar.bz2
wget http://ftp.netfilter.org/pub/iptables/iptables-1.3.3.tar.bz2
wget http://ftp.netfilter.org/pub/pat ... ng-20060206.tar.bz2

=======================================================================================================

3.
解压他们

cd /usr/src
tar -jxvf linux-2.6.11.1.tar.bz2 && tar -jxvf iptables-1.3.3.tar.bz2 && tar -jxvf patch-o-matic-ng-20060206.tar.bz2

=======================================================================================================

4.
先删除(因为原来的内核代码有问题)

rm -rf /usr/src/kernels/2.6.11-1.1369_FC4-i686
mv /usr/src/linux-2.6.11.1 /usr/src/2.6.11-1.1369_FC4-i686

=======================================================================================================

5.
删除无用的*.o*.ko修改Makefile,建立软连接

cd /usr/src
ln -s /usr/src/kernels/2.6.11-1.1369_FC4-i686 linux
cd /usr/src/linux
uname -r
make mrproper
make menuconfig (
什么都不做,保存退出)

修改Makefile文件

vi Makefile
______________________________
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 11
EXTRAVERSION = -1

修改成

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 11
EXTRAVERSION = -1.1369_FC4
______________________________

=======================================================================================================

6.
给内核打补丁

cd /usr/src/patch-o-matic-ng-20060206

KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme comment
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme connlimit
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme iprange
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme geoip
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme nth
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme ipp2p
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme quota
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme time(
好像也有点问题)
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme string(
有问题)

也可以用
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme base
KERNEL_DIR=/usr/src/linux-2.4 IPTABLES_DIR=/usr/src/iptables-1.3.3 ./runme extra
建议不要把所有的模块都打上,只选择你有用的模块

=======================================================================================================

7.
编辑模块

cd /usr/src/linux
make menuconfig
选择 Code maturity level options --->
Prompt for development and/or incomplete code/drivers

Select only drivers expected to compile cleanly

在这里选择你要用的模块:

Device Drivers --->Networking support --->Networking options --->
Network packet filtering (replaces ipchains) --->IP: Netfilter Configuration --->

编辑完,保存退出

make modules_prepare
make M=net/ipv4/netfilter
cp /usr/src/linux/net/ipv4/netfilter/*.ko /lib/modules/2.6.11-1.1369_FC4/kernel/net/ipv4/netfilter
depmod -a

=======================================================================================================

8.
安装iptables-1.3.3

cd /usr/src/iptables
export KERNEL_DIR=/usr/src/linux
export IPTABLES_DIR=/usr/src/iptables-1.3.3
make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install

=======================================================================================================

9.
所有的工作都完成了,现在开始你的测试了

iptables -V
iptables -m
模块名字 --help

=======================================================================================================

10.
更新ipp2p模块,使他支持更多的协议

http://www.ipp2p.org/downloads/下载ipp2p-0.8.1_rc1.tar.gz

cd /usr/src
wget http://www.ipp2p.org/downloads/ipp2p-0.8.1_rc1.tar.gz
tar -zxvf ipp2p-0.8.1_rc1.tar.gz
cd /usr/src/ipp2p-0.8.1_rc1

修改Makefile文件,应该在第36
vi Makefile
_____________________________________________

IPTABLES_SRC = /usr/src/iptables-1.2.9
改为
IPTABLES_SRC = /usr/src/iptables-1.3.3
_________________________________________

make
cp /usr/src/ipp2p-0.8.1_rc1/libipt_ipp2p.so /lib/iptables
depmod -a

iptables -m ipp2p --help
已经为0.8.1_rc1
iptables -A FORWARD -m ipp2p --ipp2p -j DROP
iptables -t mangle -m ipp2p --ipp2p -j MARK --set-mark 1

发表于: 2006-12-22,修改于: 2006-12-22 12:54,已浏览491次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:0.02039