天天看點

在百花之中幹掉一個雜草連接配接...

早上接到阿裡雲的伺服器報警,說有一台伺服器的流量超标,這個伺服器的外網帶寬是5M,但是登陸進去使用#iftop -i eth1發現裡面的流量已經幾乎跑滿,如圖:

<a href="https://s3.51cto.com/wyfs02/M01/91/57/wKioL1j1huahS67iAAF_zOlJVeo445.png" target="_blank"></a>

我這個伺服器的名稱叫online-mts-001,為啥會有一個mail25.u.tsender.com,這個是什麼鬼?莫非是通過我的伺服器去連接配接這個“郵箱”域名?于是我就ping了一下這個mail25.u.tsender.com,結果如圖:

<a href="https://s1.51cto.com/wyfs02/M02/91/58/wKioL1j1h2eSzPTTAACG1Mg43pk828.png" target="_blank"></a>

看到這個域名對應的ip位址是115.29.177.8,嗯,115.29.177.8,哎?這個ip位址好熟悉啊,卧槽,這特麼不是這個online-mts-001的外網ip麼?

<a href="https://s2.51cto.com/wyfs02/M02/91/59/wKiom1j1h8WTYI_-AAFekKgrysw748.png" target="_blank"></a>

也就是說我這個機器在我不知道的情況下被人綁定了一個域名!但是我這個伺服器不是網頁伺服器,上面那個tsender.com的域名打不開,我檢查了伺服器一番,發現這個機器沒有被人入侵的痕迹,隻能說是被人有意/無意(無意的可能性更大,比如看錯了阿拉伯數字)綁定了域名。

被人綁定了域名就好比被人起了外号一樣,一旦非本人操作就不太好往下摘了,查了很多資料都沒有辦法,畢竟主動權不在我這裡了。

但是回頭過來,我們的重心是要解決那個占據了3M帶寬的連接配接,#netstat 看了一下,發現這個連接配接的具體資訊如下:

<a href="https://s5.51cto.com/wyfs02/M00/91/58/wKioL1j1iS3CEKFoAAAps18eNgc369.png" target="_blank"></a>

僅僅是幹掉連接配接的話,方法有很多,關閉網卡再重開或者關閉相應的服務都可以,但是現在的問題是這台伺服器是生産環境的伺服器,它主要是給使用者提供視訊拉流,通過抓包分析得知,這位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

4)yum install libICE libSM libXmu -y

5)rpm -ivh libnet-1.1.5-1.el6.x86_64.rpm

6)rpm -ivh libnids-1.24-1.el6.x86_64.rpm 

7)rpm -ivh  dsniff-2.4-0.14.b1.el6.x86_64.rpm

請按順序操作,不然的話dsniff就會報錯:

1

2

3

4

<code>warning: dsniff-2.4-0.14.b1.el6.x86_64.rpm: Header V3 RSA</code><code>/SHA256</code> <code>Signature, key ID 0608b895: NOKEY</code>

<code>error: Failed dependencies:</code>

<code>libnet.so.1()(64bit) is needed by dsniff-2.4-0.14.b1.el6.x86_64</code>

<code>libnids.so.1.24()(64bit) is needed by dsniff-2.4-0.14.b1.el6.x86_64</code>

安裝完畢之後,就會生成tcpkill指令,如圖:

<a href="https://s2.51cto.com/wyfs02/M01/91/60/wKiom1j1sruBMzU2AACxKEY_jf8710.png" target="_blank"></a>

然後斷開上面那個大帶寬連接配接的指令是:#./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沒打開而又沒有資料向對端發送,導緻一直無法感覺次連接配接其實已經斷開)是無法斷開的。

至于第一個問題,怎麼把這台伺服器上的域名撤除,我倒要好好想想了...

參考資料:

<a href="http://www.cyberciti.biz/howto/question/linux/kill-tcp-connection-using-linux-netstat.php" target="_blank">http://www.cyberciti.biz/howto/question/linux/kill-tcp-connection-using-linux-netstat.php</a>

http://www.gnutoolbox.com/tcpkill-command/

本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1917007