linux 如何close 指定的socket的幾種方法

經常做服務端開發、或者客戶端開發的你雖然很多時候都是沒有什麼問題,但是俗話說的好,常在河邊站哪有不溼鞋,你總會遇到生產環境上有些異常的socket 需要把它關閉。至於為什麼,比如發現這條鏈路經常發送一些異常的請求包、或者是一些Hungup的socket(FIN包沒有收到,本機客戶端沒有開啟tcp_keepalive 業務層也沒有心跳機制)尤其是在某些虛擬化場景下,沒有心跳機制或者是心跳的週期比宿主機session timeout時間還長,導致宿主機回收了session此時宿主機是不會給服務端、客戶端發送reset包)。那麼我們想關閉指定的socket的時候我們應該如何操作呢?

方案1:暴力型(萬能的重啟)

直接重啟服務,如果重啟服務對你的業務沒有影響,那自然是直接重啟服務就可以了。

方案2:用tcpkill

  1. 需要安裝dnsiff(centos:yum install dsniff --enablerepo=epel)
  2. 調整iptable :

iptables -A INPUT -s IP-ADDRESS -j DROP

在規則鏈表後面追加一個針對源ip 是IP-ADDRESS的 入包 執行丟棄操作

注意將IP-ADDRESS 替換成你需要kill的socket IP

3. 使用命令tcpkill -I eth0 -9 port xxxx

將xxx 換成對應的socket 連接端口,eth0 換成你服務對應的網卡

方案3: 使用ss --kill(-K)

如果你的lkerne>=4.9 那麼可是用該方法來kill 對應的socket

eg: ss -K dst 192.168.2.214 dport=40290

方案4:使用gdb

1.首先通過ss -anp 獲取到你想要kill 的socket對應的fd(或者使用lsof 來獲取),這裡假定對應的fd是1024

2. gdb attach 到對應進程,然後在裡面執行以下命令即可:

call close(1024)

quit

拋磚引玉,如果大家有更好的方法,歡迎留言


分享到:


相關文章: