一招搞定TCP孤儿连接引起的端口占用!

开发 架构
以 redis 做实现吧,client 172.24.213.40, server 172.24.213.39. 在 client 端开启两个 session, 分别连接 server 和 tcpdump。

[[440007]]

周六群里大佬发了一篇文章,是关于TCP keepalive相关的,其中有一段是关于孤儿连接的,这里引用下

什么是孤儿连接?

以 redis 做实现吧,client 172.24.213.40, server 172.24.213.39. 在 client 端开启两个 session, 分别连接 server 和 tcpdump

会看到 client 每隔 15s 会发送空的 ACK 包给 server, 并收到 server 返回的 ACK, 实际上这就是 client 端的 tcp keepalive 在起作用。然后我们在 server 设置 iptables, 人为制造网络隔离

  1. root@myali:~# iptables -I INPUT -s 172.24.213.40 -j DROP;iptables -I OUTPUT -d 172.24.213.40 -j DROP;iptables -nvL 

过一会查看 client tcpdump 输出

  1. 14:05:14.563481 IP 172.24.213.40.38470 > 172.24.213.39.6380: Flags [.], ack 11469, win 559, options [nop,nop,TS val 3222339035 ecr 1210531111], length 0 
  2. 14:05:19.683482 IP 172.24.213.40.38470 > 172.24.213.39.6380: Flags [.], ack 11469, win 559, options [nop,nop,TS val 3222344155 ecr 1210531111], length 0 
  3. 14:05:24.803489 IP 172.24.213.40.38470 > 172.24.213.39.6380: Flags [.], ack 11469, win 559, options [nop,nop,TS val 3222349275 ecr 1210531111], length 0 
  4. 14:05:29.923486 IP 172.24.213.40.38470 > 172.24.213.39.6380: Flags [R.], seq 18, ack 11469, win 559, options [nop,nop,TS val 3222354394 ecr 1210531111], length 0 

client 172.24.213.40 每 5s 发送一个 ACK 三次,最后发一个 RST 包销毁连接。当然这个 RST redis-server 肯定也没有接收到。过一会将 server 防火墙删除

  1. root@myali:~# iptables -D INPUT -s 172.24.213.40 -j DROP;iptables -D OUTPUT -d 172.24.213.40 -j DROP;iptables -nvL 

此时再分别查看网络连接 ss -a | grep 6380, 会发现 client 端消失了,但是 server 端的还在,状态仍然是 ESTAB

  1. root@myali:~# ss -a | grep 6380 
  2. tcp   ESTAB    0      0   172.24.213.39:6380   172.24.213.40:38470 

这就是孤儿连接

孤儿连接会造成什么问题?

这种孤儿连接,首先会占用资源,然后如果你想处理,不管你通过什么方法,比如lsof查看占用该端口的进程,会发现,无法定位进程号,因为进程已经退出了,它不是进程层面的连接

还有一种运维常见的场景

此时如果你想启动相同端口的应用,或者进程,还会发现端口已被占用,无法启动,停止进程,会发现该TCP连接不属于进程管理,无法停止

这个时候怎么做?介绍一款专门针对这种TCP连接的工具

Killcx

Killcx is a Perl script to close a TCP connection under Linux, whatever its state is (half-open, established, waiting or closing state).

这是官方的解释,Killcx就是专门用来关闭Linux下TCP连接的,不管连接状态是什么,半开、连接中、等待或关闭状态

killcx的原理是要关闭的网络连接,从TCP包中提取Acknowlegment和Sequence numbers,熟悉TCP四次挥手,结合上面孤儿连接造成的原因,你就能明白,其实就是client或者server端没有收到SYN和ACK确认包,killcx就是通过伪造这两个包,来完成最后没完成的TCP交互

killcx使用方法如下:

  1. - syntax   : killcx [dest_ip:dest_port] {interface} 
  2.  
  3.   dest_ip              : remote IP 
  4.   dest_port            : remote port 
  5.   interface (optional) : network interface (eth0, lo etc). 
  6.  
  7. - example  : killcx 120.121.122.123:1234 
  8.              killcx 120.121.122.123:1234 eth0 

Killcx安装

killcx的安装包,可以直接从sourceforge下载,下载地址http://sourceforge.net/projects/killcx/files/

下载完成后,并不能直接执行,killcx官网介绍了它的依赖

  1. Perl modules needed : 
  2.  
  3. You need the following modules to run killcx : 
  4.  
  5. * Net::RawIP : needed to create spoofed packets. 
  6. * Net::Pcap : needed to capture TCP packets. 
  7. * NetPacket::Ethernet : needed to decode TCP/IP packets. 

因为Killcx是perl脚本,它运行依赖三个Perl模块,分别是Net::RawIp、Net::PCAP、NetPacket::Ethernet,这几个模块的安装很简单

  1. # 通过yum先安装perl-CPAN 
  2. yum -y install perl-CPAN 
  3. # 利用CPAN安装三个模块 
  4. perl -MCPAN -e shell 
  5. cpan> install Net::RawIP 
  6. cpan> install Net::Pcap 
  7. cpan> install NetPacket::Ethernet 

本文转载自微信公众号「运维研习社」,可以通过以下二维码关注。转载本文请联系运维研习社公众号。

 

责任编辑:武晓燕 来源: 运维研习社
相关推荐

2022-09-06 11:53:00

开发计算

2020-12-31 13:17:57

手机电脑多屏协同

2010-03-16 08:59:45

Windows 7纯净版安装

2020-10-20 08:01:30

MySQL密码Windows

2023-12-18 08:24:09

LinuxPythonWord

2015-08-03 14:02:37

Windows 10升级

2021-03-06 09:54:22

PythonHTTP请求头

2022-01-25 13:00:52

前端设计优化

2021-08-21 23:33:16

iOS苹果系统

2013-07-30 11:24:33

SAP“简化IT 一招

2018-08-14 05:21:43

路由器网络运维网络

2021-01-25 05:41:25

Flash Fliqlo软件

2021-11-22 11:30:37

JavaScript代码浏览器

2021-08-02 05:16:36

IE技巧操作系统

2013-05-03 11:21:27

2017-02-28 20:03:49

WIFI无线网卡

2020-06-05 15:45:18

微信微信号移动应用

2012-06-04 09:05:13

2021-06-28 20:01:07

电脑性能Windows 7

2010-08-19 15:07:26

DB2 -964
点赞
收藏

51CTO技术栈公众号