httpd进程非常多,查找被攻击的原因

Posted by Yancy on 2014-09-13

前两天,公司托管在电信机房的vps服务器突然网络中断,运营商那边说我们的服务器不断往外发包,严重影响到机房的网络,所以把该机器的端口封了,无比蛋疼啊,无奈下只能亲自跑到机房解决问题。
去到机房,使用top命令查看后发现httpd进程居然占到90%多的CPU。

ps -aux |grep httpd |wc -l

发现有300多个httpd进程应该是受到SYN Flood攻击这时候没有直接杀掉进程,要找出是哪个网站受攻击。

top |grep httpd

选取进程中占用CPU%多的,用lsof -p pid 来查看,如果有几个httpd进程都显示同一个网站,则基本上可以判定该网站就是问题网站

lsof -p <pid> 

找到问题网站后停掉该网站vps

killall -9 httpd ,service httpd start 强制杀掉http进程,再重新启动。

以下是在网上找的预防SYN flood的办法linux下防止SYN Flood攻击,能够有效防范SYN Flood攻击的手段之一,就是SYN Cookie

Linux下设置
如果你的服务器配置不太好,TCP TIME_WAIT套接字数量达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少服务器的TIME_WAIT套接字数量。

TIME_WAIT可以通过以下命令查看:

以下是代码片段:

netstat -an | grep "TIME_WAIT" | wc -l

在Linux下,如CentOS,可以通过修改/etc/sysctl.conf文件来达到目的增加以下几行:

以下是代码片段:

1
2
3
4
5
6
7
8
9
10
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

说明:

net.ipv4.tcp_syncookies = 1表示开启SYN Cookies,这是个BOOLEAN。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用,这是个BOOLEAN。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,这是个BOOLEAN,默认为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套接字拖死。
net.ipv4.tcp_synack_retriesnet.ipv4.tcp_syn_retries是定义SYN重试次数。

执行以下命令使配置生效:

以下是代码片段:
/sbin/sysctl -p

如果你不想修改/etc/sysctl.conf,你也可以直接使用命令修改:

以下是代码片段:

/sbin/sysctl -w key=value

找漏洞:

重新审视了M站目录下文件权限。仅对几个必要的缓存、静态化的目录为apache开启了写权限,防止phzLtoxn.php文件再次生成。

重新开启httpd服务,使用360网站检测对H站进行漏洞检测,发现M站中有严重的远程执行漏洞,于是赶紧打了补丁。

补丁打好之后,顺便修改了系统用户、数据库用户、ftp用户的密码、M站系统用户密码。
观察几日之后,一切正常。