让APACHE防止多线程下载

面是[email protected]写的一些关于mod_limitipconn.c的文档,可以参考一下:

[作者: [email protected] ]

mod_limitipconn.c是一个非官方的apache模块,可以用来作为WEB文件的下载限制
,但是它是使用ExtendedStatus On形式,工作在应用层。当同一个IP的连接到达
限制的时候,apache对get请求发送:

HTTP/1.1 503 Service Temporarily Unavailable

从而使用户不能下载,但并不能阻止这种攻击,仍旧允许连接的。不过这个东东对
网管来说还是很有用的,特别是下载站的网管。简单介绍一下安装(动态模块方式
安装,假设你的apache已经装在/usr/local/apache目录下):

下载:http://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz

# tar xzf mod_limitipconn-0.04.tar.gz
# cd mod_limitipconn-0.04
# vi Makefile

把第一行的:

APXS = apxs

改为

APXS = /usr/local/apache/bin/apxs

然后:

# make
# make install

修改apache配置文件:

# vi /usr/local/apache/conf/httpd.conf

ExtendedStatus On ###make install时这句前面的#没有去掉,一定要去掉

###make install已经加了下面两句,确认存在就行了
LoadModule limitipconn_module libexec/mod_limitipconn.so
AddModule mod_limitipconn.c

###下面就是对web目录下的文件下载限制


MaxConnPerIP 3 ###限制web根目录同一个IP只能同时开3进程下载

# 还有其它选项,如:
# NoIPLimit image/*
# OnlyIPLimit audio/mpeg video
# 可以设置多个Location



重启apache,用多线程的下载工具下载时,大于3个线程,其余的将得到信息:

HTTP/1.1 503 Service Temporarily Unavailable

或者根据User_Agent判断,把已知的多线程工具都给deny 掉
in httpd.conf
.....
BrowserMatch "NetAnt" badguy
BrowserMatch "GetRight" badguy
BrowserMatch "JetCar" badguy
BrowserMatch "Mass Downloader" badguy
BrowserMatch "ReGet" badguy
BrowserMatch "DLExpert" badguy
BrowserMatch "FlashGet" badguy
BrowserMatch "Offline Explorer" badguy
BrowserMatch "Teleport" badguy
...........

order deny,allow
deny from env=badguy
allow from all


注意httpd里面应该有 mod_setenvif模块。


正题:最近我发现服务器上有几个下载文件,有人没玩没了的开多线程下载,于是想要限制一下,于是就有下面的说明。

由于MaxClients只限制总的连接数,所以为了保证服务器不被少数的ip拖死,比如爬虫,就需要限制单个ip的并发连接数
一般使用mod_limitipconn和mod_bandwidth两个模块
一个控制连接数一个控制带宽,具体在apache1.x下,需要mod_limitipconn和mod_bandwidth俩模块配合才能实现,而在apache2下,只需要libapache2-mod-cband就完成以上两个模块的功能,cband模块主页:http://cband.linux.pl/

以上三个软件我都有在服务器上实际运行过,根据我的经验看,cband肯定比mod_limitipconn和mod_bandwidth两个模块配合使用更强,因为cband既可以对单个ip用户进行限制,还可以对某个虚拟主机限制或者不限制,还可以用直观的图形分析,还有流量控制,还有一定周期的流量自动清空,cool!

但是cband现在貌似还有不少bug,比如debian6上apt方式安装的apache,通过编译后的cband,加载到apache中运行会有错误,

具体的错误是:

apache2: Syntax error on line 204 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/cband.load: Cannot load /usr/lib/apache2/modules/mod_cband.so into server: /usr/lib/apache2/modules/mod_cband.so: undefined symbol: truncf
Action 'configtest' failed.
The Apache error log may have more information.
 failed!

网上说的解决办法不管用,但是在debian5上同样方式安装就是可以成功的。

所以以下我的环境分别是:

debian 5 上安装cband

debian 6上安装mod_limitipconn和mod_bandwidth

先看cband的安装配置

apt-get install apache2-prefork-dev     //实际是安装apxs
wget http://cband.linux.pl/download/mod-cband-0.9.7.5.tgz
tar xzvf mod-cband-0.9.7.5.tgz
cd mod-cband-0.9.7.5
./configure   //如果还是找不到apxs请这样./configure --with-apxs=/usr/bin/apxs2    //指定一下 apxs的路径,否则可能会出错
make
make install 返回如下结果,没有关系
chmod 644 /usr/lib/apache2/modules/mod_cband.so
apxs:Error: Activation failed for custom /etc/apache2/httpd.conf file..
apxs:Error: At least one `LoadModule' directive already has to exist..
make: *** [install] Error 1

你看看,你看看,出现这么大的错误,但是不影响我们使用,下面手动加载进去就可以了。


在/etc/apache2/mods-available新建一个cband.load
内容如下:
LoadModule cband_module /usr/lib/apache2/modules/mod_cband.so

保存
然后输入a2enmod
输入cband即可启用该模块
重启apache
/etc/init.d/apache2 restart
现在已经生效了,接下来就是配置
在httpd.conf中加入下面这段,表示全局可以通过http://www.blogguy.cn/cband-status或者http://www.blogguy.cn/cband-status-me查看当前的cband状态
#cband配置
<IfModule mod_cband.c>
<Location /cband-status>
SetHandler cband-status
</Location>
<Location /cband-status-me>
SetHandler cband-status-me
</Location>
</IfModule>

转载请注明来源是www.blogguy.cn 超级鄙视去版权的所谓高手

接下来的配置就要到虚拟主机的配置文件中了
 CBandRemoteSpeed 50kb/s 8 6    单个用户最大速度50kbps,每秒最多8个请求,同时发起连接不超过6个。

其他的配置说明不是很对我有需要,我也不是很熟悉,先就省略吧,自己去看说明文件。

截图看看

<img border="0" alt="" 大小:="" 80.69="" k"="" src="http://www.blogguy.cn/attachments/date_201104/thumb_4016facdc7af715a3038adad378e5900.jpg" _xhe_src="http://www.blogguy.cn/attachments/date_201104/thumb_4016facdc7af715a3038adad378e5900.jpg" width="550" height="342">

好了,接下来整整mod_limitipconn和mod_bandwidth

先来limitipconn
wget http://dominia.org/djao/limit/mod_limitipconn-0.23.tar.bz2
tar xjvf mod_limitipconn-0.23.tar.bz2
cd mod_limitipconn-0.23
make install     出现错误apxs -c    mod_limitipconn.c
         make: apxs: Command not found
         make: *** [mod_limitipconn.so] Error 127
修改目录下的Makefile文件
APXS=apxs改成APXS=apxs2因为apache2-prefork-dev安装的路径是/usr/bin/apxs2而不是apxs在,这个问题我在网上看到很多。先确定自己安装apxs  没有安装的apt-get install apache2-prefork-dev先安装
重新运行
make install
chmod 644 /usr/lib/apache2/modules/mod_limitipconn.so
[preparing module `limitipconn' in /etc/apache2/mods-available/limitipconn.load]
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "zh_CN:zh",
        LC_ALL = (unset),
        LANG = "us_EN"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Enabling module limitipconn.
Run '/etc/init.d/apache2 restart' to activate new configuration!

好了
/etc/init.d/apache2 restart
修改/etc/apache2/httpd.conf
增加mod_limitipconn控制
<IfModule mod_limitipconn.c>
  <Location />
   MaxConnPerIP 10  //设置比较大,就是为了客户访问没有问题,真正想攻击者对10个并发连接数也没有太大办法吧www.blogguy.cn
   NoIPLimit image/*
  </Location>
</IfModule>
服务器上搞一个大文件,用迅雷拖一下就知道是不是生效。
如果超出并发连接数会出现下面的错误
Service Temporarily Unavailable

The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Apache/2.2.16 (Debian) Server at www.blogguy.cn Port 80

 

接下来是mod_bandwidth
这个有一个libapache2-mod-bw
apt-get install libapache2-mod-bw安装就可以了


The following NEW packages will be installed:
  libapache2-mod-bw
0 upgraded, 1 newly installed, 0 to remove and 5 not upgraded.
Need to get 21.4 kB of archives.
After this operation, 115 kB of additional disk space will be used.
Get:1 http://ftp.debian.org/debian/ squeeze/main libapache2-mod-bw i386 0.91-1 [21.4 kB]
Fetched 21.4 kB in 4s (4344 B/s)
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = "zh_CN:zh",
        LC_ALL = (unset),
        LANG = "us_EN"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
Selecting previously deselected package libapache2-mod-bw.
(Reading database ... 27546 files and directories currently installed.)
Unpacking libapache2-mod-bw (from .../libapache2-mod-bw_0.91-1_i386.deb) ...
Setting up libapache2-mod-bw (0.91-1) ...
Reloading web server config: apache2.


重启服务器
/etc/init.d/apache2 restart
#限制全局的速度www.blogguy.cn原创,转载请注明来源www.blogguy.cn
<IfModule mod_bw.c>
 BandWidthModule On   //开关
# ForceBandWidthModule On  //默认就是开启的,表示捕获所有请求,如果要过滤部分请求,则需要手工指定过滤器
#FORCEBANDWIDTHMODULE OFF
#ADD OUTPUTFILTERBYTYPE BW-MOD TEXT/HTML TEXT/PLAIN
 BandWidth all 81920  //所有ip来源限制到80k的速度
#MinBandWidth all 5120 
</IfModule>

具体的设置跟虚拟主机的设置,就不用多说了,根据你自己的需要调整,没有一了百了的办法,你的应用类型是最关键的。

如果你没有必要限制用户的连接数,强烈建议你不要限制。

最后说说怎么修改下面这个错误信息

Service Temporarily Unavailable

The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Apache/2.2.16 (Debian) Server at www.blogguy.cn Port 80

在连接数已经满了的情况下,会出现Service Temporarily Unavailable错误  难看,能不能弄成自己定义的文件的呢?
当然可以,跟404的错误自定义是一样的,不过这个错误是503
在全局文件或者虚拟主机配置文件上添加
#ErrorDocument 503 "连接数已满"      这是直接显示文件
#ErrorDocument 503 "/missing.html"    显示文件

做过404跳转的朋友肯定知道了,不用多说了。

转载请注明来源www.blogguy.cn

原文地址:http://www.blogguy.cn/show-803-1.html


你可能感兴趣的:(让APACHE防止多线程下载)