周六,群里的大佬发了一篇关于TCPkeepalive的文章。有一段是关于孤儿连接的。什么是孤立连接?我们用redis来实现吧,客户端172.24.213.40,服务器172.24.213.39。在client端打开两个session,分别连接server和tcpdump,会看到client每隔15s会向server发送一个空的ACK包,并收到server返回的ACK。其实这就是client端的tcpkeepalive。影响。然后我们在服务器上设置iptables,人为创建网络隔离root@myali:~#iptables-IINPUT-s172.24.213.40-jDROP;iptables-IOUTPUT-d172.24.213.40-jDROP;iptables-nvL稍后查看客户端tcpdump输出14:05:14.563481IP172.24.213.40.38470>172.24.213.39.6380:frags[。],ack11469,win559,win559,options[nop,nop,nop,tsval32222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222.6380:Flags[.],ack11469,win559,options[nop,nop,TSval3222344155ecr1210531111],length014:05:24.803489IP172.24.213.40.38470>172.24.213.39.6369,ops1,nop,TSval3222349275ecr1210531111],length014:05:29.923486IP172.24.213.40.38470>172.24.213.39.6380:Flags[R.],seq18,ack11469,win559,options[nop,nop,TSval322354394ecr1210531111],length0client172.24.213.40每次R发送三次ST,最后发送一个RST3次数据包破坏连接。当然这个RSTredis-server肯定没有收到。过一会,删除服务器防火墙root@myali:~#iptables-DINPUT-s172.24.213.40-jDROP;iptables-DOUTPUT-d172.24.213.40-jDROP;iptables-nvL然后查看网络连接ss-a|grep6380,你会发现client端消失了,但是server端还在,状态还是ESTABroot@myali:~#ss-a|grep6380tcpESTAB00172.24.213.39:6380172.24.213.40:38470这是什么孤儿连接会导致问题?这种孤儿连接首先会占用资源,如果要处理,不管用什么方法,比如lsof查看占用端口的进程,都会发现无法定位到进程号,因为进程已经退出,不是进程级别的connection也有常见的运维场景。这时候,如果你想启动同一个端口的应用程序或进程,你也会发现端口被占用,无法启动。如果停止进程,会发现TCP连接不属于进程管理,无法使用。这个时候怎么停?介绍一个专门针对这种TCP连接的工具KillcxKillcx是Linux下关闭TCP连接的Perl脚本,不管它是什么状态(半开、已建立、等待或关闭状态)。这是官方的解释,killcx专门用于Linux下关闭TCP连接,无论连接状态如何,killcx的原理是关闭网络连接,从TCP包中提取Acknowlegment和Sequencenumbers,熟悉TCP挥了四次,结合上面孤连接造成的原因,可以理解其实是客户端或者服务端没有收到SYN和ACK确认包,killcx伪造了这两个包来完成最后未完成的方法使用TCP交互式killcx如下:-syntax:killcx[dest_ip:dest_port]{interface}dest_ip:remoteIPdest_port:remoteportinterface(optional):networkinterface(eth0,loetc).-example:killcx120.121.122.123:1234killcx120.121.122.123:1234eth0Killcx安装killcx的安装包,可以直接从sourceforge下载。下载地址为http://sourceforge.net/projects/killcx/files/下载完成后不能直接执行,killcx官网介绍其依赖Perlmodulesneeded:Youneedthefollowingmodulestorunkillcx:*Net::RawIP:neededtocreatespoofedpackets。*Net::Pcap:neededtocaptureTCPpackets.*NetPacket::Ethernet:neededtodecodeTCP/IPpackets。因为killcx是一个perl脚本,它的运行依赖于三个Perl模块,分别是Net::RawIp、Net::PCAP和NetPacket::Ethernet。这些模块的安装很简单#先通过yum安装perl-CPANyum-yinstallperl-CPAN#使用CPAN安装三个模块perl-MCPAN-eshellcpan>installNet::RawIPcpan>installNet::Pcapcpan>installNetPacket::Ethernet公众号.
