下午突然收到服务商的报警通知,提示我的某台服务器外网流量过高,打开网站查看,一看吓一跳,带宽占用几乎满值,时间持续了几乎15小时,网站访问速度非常慢,服务商的后台里可以看到流量统计,从今天午夜0点到现在,外网流量一直全占满,我的小站一般访问量不可能这么大,看来真的是遭遇到“关注”了……立刻打开搜索引擎,同时联系上服务商的在线技术支持,开始着手解决这个问题。
查看服务器外网实时流量
服务商后台的流量监控不是实时的,并且只有一个大概的总的统计,无法知晓这部分流量是哪里开始的,于是首先安装iftop检查实时流量,执行
1 |
|
安装完成后,在终端中直接执行
1 |
|
观察一段时间发现,目前占用流量最多的是上面两个IP,分别是123.151.10.37和123.151.43.72
锁定这两个ip之后,根据服务商技术支持的指导,执行如下命令
1 |
|
执行后发现,这个ip正在不断的对网站的80端口进行持续访问,并且大多都超时了。
可以看到大量的访问并且状态是TIME_WAIT,技术支持的建议是开启tcp短连接回收。
开启tcp短连接回收
关于tcp短连接产生大量TIME_WAIT的基础知识,可以参考这篇文章了解,这里我直接根据技术支持的建议进行操作, 首先打开sysctl.conf文件
1 |
|
找到(如果没有找到,就直接加上这行)
1 |
|
在其后面加上
1 |
|
保存退出,然后执行
1 |
|
这样就生效了,上面的参数含义引用网上的说明
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,表示关闭。
防火墙iptables临时封禁ip
发现添加了短连接回收的参数后,并没能阻止那两个ip的继续访问,于是需要在iptables中直接禁止这两个ip的访问,直接在终端里输入
1 |
|
这样的话封禁效果会持续到下次重启,如果想永久保持封禁,则需要在/etc/sysconfig/iptables里加上以上语句。 封禁那两个ip之后,再次iftop查看,发现流量已经瞬间降下来了,持续观察一段时间后,基本确定问题解决。