早上接到阿里云的服务器报警,说有一台服务器的流量超标,这个服务器的外网带宽是5M,但是登陆进去使用#iftop -i eth1发现里面的流量已经几乎跑满,如图:
我这个服务器的名称叫online-mts-001,为啥会有一个mail25.u.tsender.com,这个是什么鬼?莫非是通过我的服务器去连接这个“邮箱”域名?于是我就ping了一下这个mail25.u.tsender.com,结果如图:
看到这个域名对应的ip地址是115.29.177.8,嗯,115.29.177.8,哎?这个ip地址好熟悉啊,卧槽,这特么不是这个online-mts-001的外网ip么?
也就是说我这个机器在我不知道的情况下被人绑定了一个域名!但是我这个服务器不是网页服务器,上面那个tsender.com的域名打不开,我检查了服务器一番,发现这个机器没有被人入侵的痕迹,只能说是被人有意/无意(无意的可能性更大,比如看错了阿拉伯数字)绑定了域名。
被人绑定了域名就好比被人起了外号一样,一旦非本人操作就不太好往下摘了,查了很多资料都没有办法,毕竟主动权不在我这里了。
但是回头过来,我们的重心是要解决那个占据了3M带宽的连接,#netstat 看了一下,发现这个连接的具体信息如下:
仅仅是干掉连接的话,方法有很多,关闭网卡再重开或者关闭相应的服务都可以,但是现在的问题是这台服务器是生产环境的服务器,它主要是给用户提供视频拉流,通过抓包分析得知,这位183.228.128.188的用户合法通过外网连接到了这台视频服务器,而且拉取的是高清视频,所以才占据了这么大的带宽。不过我们还是决定先断开这位用户的连接同时不动其他用户的连接,这位183.228.128.188的用户在客户端虽然会发觉视频断开,但是有缓存和人为刷新的客观因素,实际的体验不会差太多,至少不会投诉400...
那么如何干掉一个established连接同时保证其他连接呢?请使用tcpkill。
tcpkill的下载比较有说法,下面是安装步骤:
1)wget http://rpm.repo.onapp.com/ramdisk-hv/centos6/dsniff/libnids-1.24-1.el6.x86_64.rpm
2)wget http://rpm.repo.onapp.com/ramdisk-hv/centos6/dsniff/libnet-1.1.5-1.el6.x86_64.rpm
3)wget http://rpm.repo.onapp.com/ramdisk-hv/centos6/dsniff/dsniff-2.4-0.14.b1.el6.x86_64.rpm
4)rpm -ivh libnet-1.1.5-1.el6.x86_64.rpm
5)rpm -ivh libnids-1.24-1.el6.x86_64.rpm
6)rpm -ivh dsniff-2.4-0.14.b1.el6.x86_64.rpm
请按顺序操作,不然的话dsniff就会报错:
warning: dsniff-2.4-0.14.b1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY error: Failed dependencies: libnet.so.1()(64bit) is needed by dsniff-2.4-0.14.b1.el6.x86_64 libnids.so.1.24()(64bit) is needed by dsniff-2.4-0.14.b1.el6.x86_64
安装完毕之后,就会生成tcpkill命令,如图:
然后断开上面那个大带宽连接的命令是:#./tcpkill -i eth0 src port 9132 and dst port 9595 and src host 115.29.177.8 dst host 183.228.128.188 或者#./tcpkill -s 115.29.177.8:9132 -d 183.228.128.188:9595。
但是要注意一下!tcpkill 一定要运行在能接收到应答包的主机上在,最好运行在连接或半连接存在的一端主机上,因为tcpkill会发现这个连接里有数据传输进而感知并且干掉。而且tcpkill默认情况下是只能干掉established状态的连接,对于假死连接(连接在,但是数据不传输)或者半连接(由于tcp keeplive没打开而又没有数据向对端发送,导致一直无法感知次连接其实已经断开)是无法断开的。
如果遇到上述所说的假死连接和半连接就需要手动更改tcpkill的源码,更改原理在https://yq.aliyun.com/articles/59308。
如果使用的系统是ubuntu or debian,还可以使用cutter命令,#apt-get install cutter下载即可。使用方法:http://www.cyberciti.biz/tips/cutting-the-tcpip-network-connection-with-cutter.html
至于第一个问题,怎么把这台服务器上的域名撤除,我倒要好好想想了...
参考资料:
http://www.cyberciti.biz/howto/question/linux/kill-tcp-connection-using-linux-netstat.php
http://www.gnutoolbox.com/tcpkill-command/