自动封杀非法连接FTP的IP(fuckgo)

发表于:2007-07-04来源:作者:点击数: 标签:
[color=Red:93e67e9959]作者:白金网名:platinum(china unix )超超白金(白金论坛) 欢迎转载,转载请保留上述信息 ===========================================================================[/color:93e67e9959] 由于提供了FTP下载而又限制了线程,

[color=Red:93e67e9959]作者:白金 网名:platinum(chinaunix) 超超白金(白金论坛)  
欢迎转载,转载请保留上述信息  
=========================================================================== [/color:93e67e9959]

由于提供了FTP下载而又限制了线程,所以总发现有人不断用多线程进行尝试,这样会大大增加服务器的负荷,这种事[b:93e67e9959][color=Red:93e67e9959]“损人不利己”![/color:93e67e9959][/b:93e67e9959]

为了惩罚这种人,决定写个SHELL,在crond里每1分钟运行一次,自动统计非法线程的IP和线程数量,然后自动将他的IP地址写到iptables里,来惩罚一下他们!

在此,非常感谢“零二年的夏天”!他给了我很大的帮助!!!

这下可以惩罚一下那些贪得无厌的人了……

vi /usr/local/sbin/fuckgo
[code:1:93e67e9959]
#! /bin/bash
fuck_who()
{
        netstat -an|grep "210.51.184.197:21"|grep -v LISTEN|grep -v ESTABLISHED|awk '{print $5;}'|awk -F'=' '{print $1;}'|sort|uniq -c|awk '{print $1"="$2;}'
}

for _un in $(fuck_who)
do
        if [ $(echo $_un|awk  -F'=' '{print $1;}') -gt 10 ]
        then
                iptables -I INPUT -s $(echo $_un|gawk -F'=' '{print $2;}') -p tcp --dport 21 -j DROP
        fi
done
[/code:1:93e67e9959]

vi /etc/crontab
添加
[code:1:93e67e9959]
00-59/1 * * * * root /usr/local/sbin/fuckgo
[/code:1:93e67e9959]
/etc/rc.d/init.d/crond restart

具体效果可以参看
[img:93e67e9959]http://platinum.3322.org/mrtg/proftpd-day.png[/img:93e67e9959]

[color=blue:93e67e9959][b:93e67e9959]蓝色[/b:93e67e9959][/color:93e67e9959]是总连接数,[color=orange:93e67e9959][b:93e67e9959]橙色[/b:93e67e9959][/color:93e67e9959]是有效连接数
当[color=blue:93e67e9959][b:93e67e9959]蓝色[/b:93e67e9959][/color:93e67e9959]超过[color=orange:93e67e9959][b:93e67e9959]橙色[/b:93e67e9959][/color:93e67e9959]很多时,证明有人在[color=red:93e67e9959][b:93e67e9959]贪得无厌[/b:93e67e9959][/color:93e67e9959]地进行多线程尝试

从图上可以看出,[color=blue:93e67e9959][b:93e67e9959]蓝色[/b:93e67e9959][/color:93e67e9959]瞬间值很高,但转瞬而逝,不会持续很久,因为那个人的IP已经进入了iptables“黑名单”

 platinum 回复于:2004-11-07 09:47:58
为了避免误杀(因为有很多是动态IP地址),用crond每小时执行一下[color=red:84fbfbd6c7]fuckclean[/color:84fbfbd6c7],来清除一天来被封杀过的IP

当然,如果该IP违规,[color=red:84fbfbd6c7]fuckgo[/color:84fbfbd6c7]会以每1分钟一次的频率扫描,发现之后再次封杀,再次解开就只能等第二个小时到来的时候了

vi /usr/local/sbin/fuckclean(呵呵,这回是我自己写了)
[code:1:84fbfbd6c7]
#! /bin/bash
clean_who()
{
        iptables -nL|grep "DROP"|grep "dpt:21"|awk '{print $4;}'
}

for _un in $(clean_who)
do
        iptables -D INPUT -s $_un -p tcp --dport 21 -j DROP
done
[/code:1:84fbfbd6c7]

 hgkrt 回复于:2004-11-07 10:01:27
强呀,太需要这个啦...

感觉配合HTTP下载更是需要的..

 platinum 回复于:2004-11-07 10:05:05
HTTP可能不行,HTTP是短连接,除了下载、读取网页,其他时间都是TIME_OUT,而非ESTABLISHED

 hgkrt 回复于:2004-11-07 10:08:04
对了,请教老兄一个问题

Linux下FTP下载如何按用户限制线程??

兄弟用啥服务器端呢??介绍一下经验吧...

 platinum 回复于:2004-11-07 10:13:11
我用的是proftpd,用的是“MaxClientsPerHost  3”的方法限制

 jeffreyli 回复于:2004-11-07 10:53:38
利害,,,,先收藏,,,

 hgkrt 回复于:2004-11-07 11:40:12
如果使用动态IP建立的站点,该如何监测呢??

难道要每换一个IP,自己重新修改文件??

 双眼皮的猪 回复于:2004-11-07 13:09:32
为什么要用crond一分钟执行一次?
在脚本里sleep 60可以吗?

 cnriver 回复于:2004-11-07 13:26:30
iptables -I INPUT -s $(echo $_un|gawk -F'=' '{print $2;}') -p tcp --dport 21 -j DROP 
好像没有掩码? (比如 - s 210.10.10.10/32)

而且连接一多,这种过滤多,影响服务器性能

adsl等动态ip,会存在一些问题。有些刚上网的用户不能正常ftp连接。

 tma 回复于:2004-11-07 21:03:47


 platinum 回复于:2004-11-07 22:31:21
[quote:2ffe1899cf="cnriver"]iptables -I INPUT -s $(echo $_un|gawk -F'=' '{print $2;}') -p tcp --dport 21 -j DROP 
好像没有掩码? (比如 - s 210.10.10.10/32)

而且连接一多,这种过滤多,影响服务器性能。

adsl等动态ip,会存在?.........[/quote:2ffe1899cf]
1、对host进行操作,不用32位的掩码
2、是的,大量的iptables会降低服务器性能,但与原先大量无效连接的不断重试比,简直微乎其微

 platinum 回复于:2004-11-07 22:31:54
[quote:920aafc6be="双眼皮的猪"]为什么要用crond一分钟执行一次?
在脚本里sleep 60可以吗?[/quote:920aafc6be]
我对SHELL不在行 :mrgreen:

 双眼皮的猪 回复于:2004-11-07 23:27:14
[quote:839afb2d83="platinum"]
我对SHELL不在行 :mrgreen:[/quote:839afb2d83]
只需要sleep一下嘛,去找夏天,人家是零二年的夏天,你说人家2002的夏天,这不是一回事嘛,呵呵...人家说不定是1902年的夏天哪...

 rootding 回复于:2004-11-07 23:46:19
还是给自己添麻烦!

 platinum 回复于:2004-11-08 08:43:43
[quote:7b6f743bae="双眼皮的猪"]
只需要sleep一下嘛,去找夏天,人家是零二年的夏天,你说人家2002的夏天,这不是一回事嘛,呵呵...人家说不定是1902年的夏天哪...[/quote:7b6f743bae]
谢谢猪猪,我再改改 :mrgreen: 
“夏天”已经改了 :em06:

 platinum 回复于:2004-11-08 08:45:10
[quote:dc796233fe="rootding"]还是给自己添麻烦![/quote:dc796233fe]
给自己添什么麻烦?都是自动完成的
经过测试,效果非常明显,负载降低了很多,有机会你也可以试一下

 tianci3982730 回复于:2004-11-08 09:03:44
不如用c写个守护进程来完成哦

 studyboy 回复于:2004-11-08 14:49:51
我用的失netman的脚本

用来控制http和socks5

 rrrr03 回复于:2004-11-09 15:33:45
牛呀,高人一堆堆的,,,

 lyxmoo 回复于:2004-11-09 17:53:15
不如这么样简单 :

iptables -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

 eagerlinuxer 回复于:2004-11-09 19:44:17
给2 个建义:
1、“  if [ $(echo $_un|awk  -F'=' '{print $1;}') -gt 9 ] ” 最好把9改成10,因为大多数ftp客户端都会把默认线程数设成8或10。
2、 ”/usr/local/sbin/fuckclean“脚本最好半小时执行一次,这样误挡的机会及恢复时间会少很多。

我管了公司几台vsftp服务器
一般我把每线程的最大下载速率设成:
anon_max_rate=50000      (也就是50KByte/s,因为好多客户端的下载工具都是用IE,所以把每线程的下载量设大了,这样一般的ADSL的IE下载用户也不会感到太慢)

我把每IP的最大连接数设成2:
max_per_ip=2     (这样每ip的最大下载速度就是100KByte/s,这是为了让更多的用户能连进来)

这样我的vsftpd就会挡掉大多数用户的多线程连接,因为一个IP的最大连接只有2 :)。但我测了一下,1.4G2CPU/2GMEM的机器,在流量是50Mbit/s的情况下,系统资源占用在5%以下,还是可以接受的。

不过我觉得这个想法不错,也许其它的一些地方也可以用上。

 platinum 回复于:2004-11-09 21:12:33
agerlinuxer兄说的有道理:)

fuckclean也需要改正,因为我发现iptables -vL的时候,他会解析出域名,比如有的就是adsl-249-213-51-62-xxxxx.com,而不是一个具体的IP地址

所以我打算改成统计非法IP的数量,然后用for和iptables -D INPUT 1去控制

 eagerlinuxer 回复于:2004-11-09 23:51:05
呵呵,用iptalbes -nL不就不会去解析域名了吗?

 platinum 回复于:2004-11-10 09:11:46
再次谢谢eagerlinuxer,把这个忘记了!

现在改成这个了,2楼的也去修改一下
[code:1:af8f90447c]
#! /bin/bash
clean_who()
{
        iptables -nL|grep "DROP"|grep "dpt:21"|awk '{print $4;}'
}

for _un in $(clean_who)
do
        iptables -D INPUT -s $_un -p tcp --dport 21 -j DROP
done
[/code:1:af8f90447c]

 haohaoo 回复于:2004-11-11 02:42:44
好像没有解封的呀,最好能多久就解封,因为IP很多动态的

 czyf2001 回复于:2004-11-11 09:00:17
请问:如何得到登录用户的ip啊?
系统中存在一个通用的用户和密码,通过终端登录工具(keax , Exceed)登录到服务器端,我怎么样才能得到他们的ip呢?
并且他们的操作都应该有个日志保存文件吧?
先问第一个,如何得到他们的ip啊?
谢谢!

 zjqyb 回复于:2004-11-18 09:51:32
通过代理的还是封不掉

 platinum 回复于:2004-11-20 03:11:44
[quote:5f8f06958e="haohaoo"]好像没有解封的呀,最好能多久就解封,因为IP很多动态的[/quote:5f8f06958e]
现在改成了1小时一次接封

 platinum 回复于:2004-11-20 03:12:20
[quote:ad52eed4de="czyf2001"]请问:如何得到登录用户的ip啊?
系统中存在一个通用的用户和密码,通过终端登录工具(keax , Exceed)登录到服务器端,我怎么样才能得到他们的ip呢?
并且他们的操作都应该有个日志保存文件吧?
先问第一个,如?.........[/quote:ad52eed4de]
netstat啊

 platinum 回复于:2004-11-20 03:13:14
[quote:d23b624clearcase/" target="_blank" >cc5="zjqyb"]通过代理的还是封不掉[/quote:d23b624cc5]
有多少封多少,不管是不是代理
真IP封真IP
私网IP封私网IP
代理IP封代理IP

 ibmsoft 回复于:2004-11-23 15:33:07
定!

 天下有雪 回复于:2004-11-23 20:22:41
好东西,收藏了,先。

原文转自:http://www.ltesting.net