服务端Too many open files解决方案
转自:http://zhumeng8337797.blog.163.com/blog/static/1007689142012428104618670/
cat /proc/sys/fs/file-nr今天发现运行好好的J2EE项目突然访问很慢,查看了一下日志报web.xml(Too many open files),google了一下发现时文件句柄数目不够所致。
查看下一系统当前最大文件句柄数ulimit -n 得出为1024。对应一般应用1024够用了,但是对于像mysql、java等单进程处理大量请求的应用来说就有点捉襟见肘了。如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何查看当前打开了多少文件句柄。执行:lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more 。得出如下结果
- 697 30635
- 155 14719
- 95 2763
- 73 2747
- 70 20029
- 70 18005
- 69 24950
- 69 24512
- 69 24493
- 69 24491
- 69 23274
- 69 18353
- 68 24510
- 68 24445
- 68 23411
- 68 23409
- 68 23405
- 68 23367
这里我只截取了部分输出信息。其中第一行是打开的文件句柄数,第二行是进程号。执行ps -ef | grep 进程号 可查看进程的详细信息。
通过执行ulimit -HSn 4096 增大文件句柄数。这时候再执行ulimit -n发现已经变成4096了。
修改文件句柄数对所有用户都起作用
修改/etc/security/limits.conf,在文件末加上
* soft nofile 4096
* hard nofile 4096
前段时间帮助公司解决了一次tomcat环境服务器的异常,今天有时间过来总结一下。
问题的表现:
tomcat服务在重启之后,短时间内会承受大量访问,由于这个时候缓存还没建立,每次访问都将消耗一定资源(数据库连接或者文件IO),并发量在2000左右的时候tomcat服务开始抛出大量Too Many Open Files的异常,主要是文件IO一块的异常,数据库连接池配置恰当就不会抛异常。
问题分析:
这是一个典型的文件句柄耗尽的异常,在linux里头“一切皆文件”,所以虽然提示“文件”打开太多,其实也有可能是socket打开太多或者设备打开太多。
文件句柄是用来干嘛的?
- 句柄当做一个人的名字,并"可以通过名字(句柄),实现对句子的引用和访问",感觉这种比喻好象贴近,但问题是可能有许多人叫同一个名字,但句柄所以有意义正因为它具有唯一性,所以这种比喻也有问题,如果换个说法,说句柄是表示你的进程与外界的i/o连接,把它当作是一个连接的名字是不是更恰当些? 文件句柄是一个十六位长度的二进制代码(Windows95后为32位无符号整数),代表一个已被打开文件的通道号,借助于这个句柄,你的应用程序即可使用这个相应的句柄对文件进行随意存取操作,说白了文件句柄其实是一串代表着特殊含义的号码; 当然其实系统是用句柄与一些资源联系起来的,当由系统管理,动态分配给你应用程序的某些资源的代号,你就可以使用句柄访问相应的资源了,尤其在Windows系统中,有很多东东都使用句柄,如窗口,socket。
简单看来程序通过句柄获得资源的引用,来进行资源的打开和关闭的操作。
为什么会出现文件句柄耗尽的情况?
主要是因为linux在文件句柄的数目上有两个级别的限制。
一个是系统级别的总数限制,
一个是针对用户的限制。
默认情况下每个用户所能使用的句柄数是1024。一般情况下1024也够用了,但是在大容量的系统上,特别是会频繁使用网络通信和文件IO的系统上,1024很快就被耗光了。所以首先我们要调整这个值。修改方法如下:
- 1. ulimit -a 查看当前用户的文件句柄限制
-
- 2. 用户级别的句柄数限制修改。
- 修改 /etc/security/limits.conf 增加下面的代码:
- 用户名(或者用*表示所有用户) soft nofile 65535
- 用户名 hard nofile 65535
- 有两种限制,一种是soft软限制,在数目超过软限制的时候系统会给出warning警告,但是达到hard硬限制的时候系统将拒绝或者异常了。
- 修改之后可能需要重启shell生效。
-
- 3. 系统级别的句柄数限制修改。
- sysctl -w fs.file-max 65536
- 或者
- echo "65536" > /proc/sys/fs/file-max
- 两者作用是相同的,前者改内核参数,后者直接作用于内核参数在虚拟文件系统(procfs, psuedo file system)上对应的文件而已。
- 可以用下面的命令查看新的限制
- sysctl -a | grep fs.file-max
- 或者
- cat /proc/sys/fs/file-max
- 修改内核参数
- /etc/sysctl.conf
- echo "fs.file-max=65536" >> /etc/sysctl.conf
- sysctl -p
- 查看系统总限制 命令:cat /proc/sys/fs/file-max
- 查看整个系统目前使用的文件句柄数量命令:cat /proc/sys/fs/file-nr
- 查看某个进程开了哪些句柄 :lsof -p pid
- 某个进程开了几个句柄 :lsof -p pid |wc -l
- 也可以看到某个目录 /文件被什么进程占用了,显示已打开该目录或文件的所有进程信息 :lsof path/filename
具体这个值应该设置成多少?
优先级(Open File Descriptors):
soft limit < hard limit < kernel < 实现最大file descriptor数采用的数据结构所导致的限制
其实这个值倒是没有具体限制,但是分配的值如果太大反而会影响系统性能,所以要根据具体应用调配权衡。
问题的解决方案:
首先当然是修改linux句柄数限制到一个合适的值。
然后就是应用本身的一个调整。有这么几种情况:
1.数据库连接池的优化。必须要使用连接池,否则句柄没耗光数据库就崩了。。。
2.抓取资源的时候有可能会用到HttpClient,尽量也应该使用连接池来控制连接数。
关于HttpClient的连接池配置可以查看我另外一文:http://blog.csdn.net/shootyou/archive/2011/05/12/6415248.aspx
3.连接池设置的把握,建立连接超时时间,读取超时时间,连接数目,等待时间,等都需要配置到一个合适的值,否则发挥不出连接池的性能。
一个负载比较重的discuz论坛服务器,1小时在线一万多,有时访问时无法显示。 我用另一台同网段的机器作测试,大概20次中会有1、2次超时 wget http://bbs.xxx.com --17:06:08-- http://bbs.xxx.com/ 正在解析主机 bbs.xxx.com... 221.13.18.b Connecting to bbs.xxx.com|221.13.18.b|:80... 失败:连接超时。 重试中。 在bbs上用tcpdump监控 正常时可以接收到 ...... 17:27:55.746530 IP 221.13.18.a.39495 > 221.13.18.b.http: . ack 193785 win 353 17:27:55.746923 IP 221.13.18.a.39495 > 221.13.18.b.http: . ack 196705 win 353 17:27:55.747276 IP 221.13.18.a.39495 > 221.13.18.b.http: F 128:128(0) ack 197467 win 353 17:27:55.747284 IP 221.13.18.b.http > 221.130.185.a.39495: . ack 129 win 12 如果wget失败就监控不到信息,问下怎么回事? 检察了net.ipv4.tcp_max_syn_backlog 应该足够了 系统信息 ====================================== centos 5.2 64bit nginx+php+mysql nginx 4个进程 php 96个进程 Linux bora 2.6.18-128.el5 #1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux sysctl内核 net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.ipv4.tcp_max_tw_buckets = 5000 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 196608 262144 393216 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 120 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_syncookies = 1 优化文件句柄 vi /etc/security/limits.conf * soft nofile 51200 * hard nofile 51200 vi /etc/rc.local ulimit -SHn 51200 =================== Active connections: 2419 server accepts handled requests 73668795 73668795 232420556 Reading: 11 Writing: 28 Waiting: 2380 bbs在线会员 - 总计 13433 人在线 top - 13:29:01 up 33 days, 22:53, 2 users, load average: 1.22, 1.60, Tasks: 265 total, 1 running, 264 sleeping, 0 stopped, 0 zombie Cpu(s): 9.3%us, 1.4%sy, 0.0%ni, 88.2%id, 0.5%wa, 0.0%hi, 0.6%si, Mem: 8168412k total, 6691148k used, 1477264k free, 917728k buffe Swap: 4096532k total, 228k used, 4096304k free, 3841696k cache netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 4845 SYN_SENT 1 FIN_WAIT1 185 ESTABLISHED 2698 FIN_WAIT2 381 SYN_RECV 162 CLOSING 5 LAST_ACK 137 netstat -n |wc -l 8441 cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max 65536 cat /proc/sys/fs/file-nr 4590 0 765985 |
该文件与 file-max 相关,它有三个值:
* 已分配文件句柄的数目
* 已使用文件句柄的数目
* 文件句柄的最大数目
该文件是只读的,仅用于显示信息。
典型的,提供大量静态文件访问的web服务器,缓存服务器(如squid), 均要注意这个问题
网上的教程,大约只是简单说明了如何设置ulimit和file-max, 但并没有说清楚这两者之间的差别,让人一头雾水
1. file-max的含义
man proc,可得到file-max的描述:
/proc/sys/fs/file-max
This file defines a system-wide limit on the number of open files for all processes. (See
also setrlimit(2), which can be used by a process to set the per-process limit,
RLIMIT_NOFILE, on the number of files it may open.) If you get lots of error messages
about running out of file handles, try increasing this value:
即file-max是设置 系统所有进程一共可以打开的文件数量 。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,是应该增加这个值。
也就是说,这项参数是系统级别的。
echo 6553560 > /proc/sys/fs/file-max
或修改 /etc/sysctl.conf, 加入
fs.file-max = 6553560 重启生效
2. ulimit的
Provides control over the resources available to the shell and to processes started by it, on systems that allow such control.
即设置当前shell以及由它启动的进程的资源限制。
显然,对服务器来说,file-max, ulimit都需要设置,否则就可能出现文件描述符用尽的问题,为了让机器在重启之后仍然有效,强烈建立作以下配置,以确保file-max, ulimit的值正确无误:
1. 修改/etc/sysctl.conf, 加入
fs.file-max = 6553560
2.系统默认的ulimit对文件打开数量的限制是1024,修改/etc/security/limits.conf并加入以下配置,永久生效
* soft nofile 65535
* hard nofile 65535
修改完之后,重启即可生效
一、查看最大打开文件数
1、查看系统及最大打开文件数
- [root@localhost ~]# cat /proc/sys/fs/file-max
- 65535
2、查看当前用户最大打开文件数
- # ulimit -Hn //查看硬限制
- # ulimit -Sn //查看软限制
二、设置最大打开文件数
1、系统及的设置
- # vi /etc/sysctl.conf
增加:
- fs.file-max = 100000
立即生效:
- # sysctl -p
2、用户级设置
- vi /etc/security/limits.conf
设置如下:
- httpd soft nofile 4096
- httpd hard nofile 10240
httpd是用户,可以使用通配符*表示所有用户。
要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
查看 /etc/pam.d/login 文件中有:
- session required /lib/security/pam_limits.so
使用如下命令立即生效:
- # su - httpd
- $ ulimit -Hn 10240
- $ ulimit -Sn 4096
- 1、查看进程:ps -ef|grep [java、tomcat、weblogic]
- 2、查看某端口TCP连接占用数:netstat -pnt | grep :6666 |wc -l
- 3、查看某端口TCP连接占用信息:lsof -i :6666
- 4、查看TCP连接状态以及数量:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- 5、查看所有进程占用的文件句柄数:lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more
- 6、查看某进程所属服务:ps -aef|grep 24204
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
这种错误就是503.看到这种错误,第一想法就是BAIDU了.找到了一些解决方法!各家都有各自的意见和解决办法!
首现谈谈网站的环境和配置.
1、服务器WIN2003,
2、TOMCAT5.5和APACHE2.2
3、数据库是MSSQL2000
差不多就这样了!
看到这个办法,在服务器上测试,输入 http://localhost:8080/index.do 可以运行,但是输入 http://locahost/index.do 不行,出现503错误,怀疑中,怀疑1:TOMCAT和APAHCE通信出错.
我的TOMCAT和APACHE的通信配置如下:
在APACHE
1、下载mod_jk-apache-2.2.4.so,把它放在APACHE目录下的modules下
2、配置APACHE,
LoadModule jk_module modules/mod_jk-apache-2.2.4.so
JkWorkersFile "E:/Tomcat 5.5/conf/workers.properties"
JkLogFile "E:/Tomcat 5.5/mod_jk2.log"
JkLogLevel info
3、在TOMCAT下的conf目录建立workers.properties文件,在文件中添加内
ThreadsPerChild 100
MaxRequestsPerChild 1000
MaxMemFree 16
ThreadLimit 100
ThreadStackSize 8192
KeepAliveTimeout 2
MaxKeepAliveRequests 10
Win32DisableAcceptEx
认真看了一下,和在网上看了一些配置,差不多和我这个差不多,但是没有出错,本地测试也没有出错.
看看APACHE出错的日志文件(error.log)其中出现了:
[warn] (OS 64)指定的网络名不再可用. : winnt_accept: Asynchronous AcceptEx failed.和
[warn] (OS 10038)在一个非套接字上尝试了一个操作. : setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed.
是APACHE配置还有问题:在网上找了一下,好多人出现这个问题:大多数都是这样解决的,我也开始尝试.在APACHE中加入如下:
ThreadsPerChild 100
MaxRequestsPerChild 1000
MaxMemFree 16
ThreadLimit 100
ThreadStackSize 8192
KeepAliveTimeout 2
MaxKeepAliveRequests 10
Win32DisableAcceptEx
重启TOMCAT和APACHE,可以用了,还认为解决了,但是过了一些时间,又出现503错误了,看来不是通信有错误,只要重启TOMCAT就好了,又查看APACHE日志文件,没有出现错误!此时又产生了一个怀疑,怀疑2:难道是TOMCAT和数据库的连接有问题.
我网站开发的框架是(STRUTS和HIBERNATE和SPRING)
难道是连接池的原因:
以前是用DBCP配置的,在网上有人说这个有时候会出错,换了C3P0测试,问题依旧,
我在WEB.XML中配置了OpenSessionInViewFilter
OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
singleSession
true
OpenSessionInViewFilter
/*
难道是这个问题,找了一下,发现也有人出现这种情况引起了503错误.解决办法:在web.xml中加入如下配置
org.springframework.web.util.IntrospectorCleanupListener
感觉可以了,充满希望重启TOMCAT,过了一阵子又出现503了,现在差不多崩溃了!怎么办,然后问了我同学(老廖)在这要特别感谢老廖和他的老大.给了我一些建.现在就轮到查TOMCAT的配置了.
怀疑3:TOMCAT配置有问题.
看了一下环境变量没有问题,看了一下没有错,
看了一下TOMCAT的日志文件,出现了好多
2008-10-22 12:00:09 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.jk.common.ChannelSocket$SocketConnection@45b409, terminating thread
2008-10-22 12:00:17 org.apache.commons.modeler.BaseModelMBean setManagedResource
严重: Can’t set model mbean
java.lang.OutOfMemoryError: Java heap space
2008-10-22 12:00:23 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable run
严重: Caught exception (java.lang.OutOfMemoryError: Java heap space) executing org.apache.jk.common.ChannelSocket$SocketAcceptor@1931ec, terminating thread
在网上查了一下是JVM内存泄漏引起TOMCAT昏厥,解决办法加大JVM内存,加入的办法如下:在catalina.bat加入一句
set JAVA_OPTS=-Xms256m -Xmx1024m %JAVA_OPTS%
把JVM的内存最大加到了1024M,哈,但是我的TOMCAT是安装版的,没有找到这个文件,只好另想办法.在tomcat5w.exe中有一个JAVA选项,那里就有设置最大和最小值的内存,看想是解决了.重启试一下.过了三天,没有出错了,网站运行正常,难道我解决了!
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
会得到类似下面的结果,具体数字会有所不同:
LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
也就是说,这条命令可以把当前系统的网络连接状态分类汇总。
下面解释一下为啥要这样写:
一个简单的管道符连接了netstat和awk命令。
------------------------------------------------------------------
先来看看netstat:
netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT
你实际执行这条命令的时候,可能会得到成千上万条类似上面的记录,不过我们就拿其中的一条就足够了。
------------------------------------------------------------------
再来看看awk:
/^tcp/
滤出tcp开头的记录,屏蔽udp, socket等无关记录。
state[]
相当于定义了一个名叫state的数组
NF
表示记录的字段数,如上所示的记录,NF等于6
$NF
表示某个字段的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是TIME_WAIT
state[$NF]
表示数组元素的值,如上所示的记录,就是state[TIME_WAIT]状态的连接数
++state[$NF]
表示把某个数加一,如上所示的记录,就是把state[TIME_WAIT]状态的连接数加一
END
表示在最后阶段要执行的命令
for(key in state)
遍历数组
print key,"\t",state[key]
打印数组的键和值,中间用\t制表符分割,美化一下。
如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,
vim /etc/sysctl.conf
编辑文件,加入以下内容:
1.
net.ipv4.tcp_syncookies = 1
2.
net.ipv4.tcp_tw_reuse = 1
3.
net.ipv4.tcp_tw_recycle = 1
4.
net.ipv4.tcp_fin_timeout = 30
然后执行 /sbin/sysctl -p
让参数生效。
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间
下面附上TIME_WAIT状态的意义:
客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口
状态为TIME_WAIT
是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?
主动关闭的一方在发送最后一个 ack 后
就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间
这个是TCP/IP必不可少的,也就是“解决”不了的。
也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL,上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
TIME_WAIT 并不会占用很大资源的,除非受到攻击。
还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
-
netstat -tna | cut -b 49- |grep TIME_WAIT | sort
取出目前所有 TIME_WAIT 的连接 IP ( 排序过 ) -
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改 为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参 数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。在怀疑有Dos攻击的时候,可以输入
1
netstat
-na |
grep
:80 |
awk
'{print $5}'
|
awk
-F
'::ffff:'
'{print $2}'
|
grep
':'
|
awk
-F:
'{print $1}'
|
sort
|
uniq
-c |
sort
-r |
awk
-F
' '
'{if ($1 > 50) print $2}'
|
sed
's/^.*$/iptables -I firewall 1 -p tcp -s & --dport 80 --syn -j REJECT/'
| sh
先把冲击量最大的前50个IP给封了.
还可以加几个例外的白名单IP
1
netstat
-na |
grep
:80 |
awk
'{print $5}'
|
awk
-F
'::ffff:'
'{print $2}'
|
grep
':'
|
awk
-F:
'{print $1}'
|
sort
|
uniq
-c |
sort
-r |
awk
-F
' '
'{if ($1 > 50) print $2}'
|
grep
-
v
xxx.xxx.xxx.xxx |
sed
's/^.*$/iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s & --dport 80 --syn -j REJECT/'
| sh