免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

如何kill一條TCP連接?

原創(chuàng):扣釘日記(微信公眾號ID:codelogs),歡迎分享,轉(zhuǎn)載請保留出處 。
簡介如果你的程序?qū)懙糜忻。蜷_了很多TCP連接,但一直沒有關(guān)閉,即常見的連接泄露場景,你可能想要在排查問題的過程中,先臨時kill一波泄露的連接 。又比如你要驗證程序在遇到網(wǎng)絡(luò)錯誤時的自愈能力,想手動kill掉一些正常TCP連接,看程序是否能自動重連并恢復(fù)運(yùn)行 。
這些場景,都需要手動kill一部分TCP連接,那在Linux下有哪些kill連接的方法呢?
kill活躍的TCP連接使用ngrep或tcpkill命令可以殺死活躍狀態(tài)的TCP連接,用法如下:
# ngrep殺死連接$ sudo ngrep -d any -K3 '' 'port 54690'# 安裝tcpkill,及使用其殺死連接$ sudo apt install dsniff$ sudo tcpkill -i any 'port 45308'
如何kill一條TCP連接?

文章插圖
如上所示,可以發(fā)現(xiàn)在殺死連接時,ngrep和tcpkill都向連接方發(fā)送了RST包 。
實現(xiàn)原理學(xué)過《計算機(jī)網(wǎng)絡(luò)》的同學(xué)都知道,TCP協(xié)議是通過FIN包與ACK包來做四次揮手,從而斷開TCP連接的,這是正常的TCP斷連過程,但TCP協(xié)議中還有RST包,這種包用于異常情況下斷開連接,Linux在收到RST包后,會直接關(guān)閉本端的Socket連接,而不需要經(jīng)歷四次揮手過程 。
而上面的ngrep與tcpkill命令,正是通過給對方發(fā)送RST包,從而實現(xiàn)殺死TCP連接的 。但要發(fā)送一個正確的RST包,需要知道TCP連接交互時所使用的序列號(seq),因為亂序的包會被TCP直接丟棄,所以ngrep和tcpkill還會監(jiān)聽網(wǎng)卡上交互的包,以找到指定連接所使用的序列號seq 。
所以,ngrep與tcpkill只能kill有流量的活躍TCP連接,對于空閑連接就無法處理了 。
kill空閑的TCP連接【如何kill一條TCP連接?】對于空閑狀態(tài)的TCP連接,可以用ss或hping3命令來處理,如下:
使用ss殺死連接通過ss命令的-K選項可以用來kill連接,如下:
# 安裝ss命令$ sudo apt install iproute2# 使用ss殺死目標(biāo)端口為65987的連接$ sudo ss -K dport = 65987注意,使用這個功能需要你的內(nèi)核版本>=4.9,且打開了CONFIG_INET_DIAG_DESTROY選項,因此某些情況下可能無法使用 。
使用hping3殺死連接如果無法使用ss命令,則可以考慮使用hping3命令來kill連接,hping3命令可以發(fā)任何類型的TCP包,因此只要模擬tcpkill的原理即可,如下:
  1. 通過發(fā)送SYN包來獲取seq
上面提到了,TCP協(xié)議會直接丟棄亂序的數(shù)據(jù)包,但是對于SYN包卻區(qū)別對待了,如果你隨便發(fā)一個SYN包給已連接狀態(tài)的Socket,它會回復(fù)一個ACK,并攜帶有正確的seq序列號,如下:
# 第一個參數(shù),表示發(fā)送包的目標(biāo)ip地址# -a:設(shè)置包的源ip地址# -s:設(shè)置包的源端口# -p:設(shè)置包的目標(biāo)端口# --syn:表示發(fā)SYN包# -V:verbose output,使hping3輸出序列號seq# -c:設(shè)置發(fā)包數(shù)量$ sudo hping3 172.26.79.103 -a 192.168.18.230 -s 8080 -p 45316 --syn -V -c 1using eth0, addr: 172.26.79.103, MTU: 1500HPING 172.26.79.103 (eth0 172.26.79.103): S set, 40 headers + 0 data byteslen=40 ip=172.26.79.103 ttl=64 DF id=16518 tos=0 iplen=40sport=45316 flags=A seq=0 win=502 rtt=13.4 msseq=1179666991 ack=1833836153 sum=2acf urp=0可以在輸出中找到,ack=1833836153即是對方回復(fù)的序列號,我們用在后面的發(fā)RST包中 。
  1. 使用seq發(fā)RST包
# --rst:表示發(fā)RST包# --win:設(shè)置TCP窗口大小# --setseq:設(shè)置包的seq序列包$ sudo hping3 172.26.79.103 -a 192.168.18.230 -s 8080 -p 45316 --rst --win 0 --setseq 1833836153 -c 1HPING 172.26.79.103 (eth0 172.26.79.103): R set, 40 headers + 0 data bytes--- 172.26.79.103 hping statistic ---1 packets transmitted, 0 packets received, 100% packet lossround-trip min/avg/max = 0.0/0.0/0.0 ms

經(jīng)驗總結(jié)擴(kuò)展閱讀