进程外部断开TCP连接的方式

本文总结了五种断开TCP连接的方式,包括利用iptables设置防火墙规则、使用gdb挂载进程关闭socket、借助tcpkill工具、运行killcx脚本以及直接kill掉TCP连接所在进程。每种方法都有其适用场景,但都需要ROOT权限。

总结五种断开TCP连接的方式

1.防火墙规则

可以设置iptables规则禁掉某个或者某些端口,但是对已建立的TCP连接无效,只是会让TCP收不到包。上层业务要是对长时间收不到数据有超时出来也可以实现断开连接功能

关闭端口
【iptable】
sudo iptables -A INPUT -p tcp --dport $PORT -j DROP
sudo iptables -A OUTPUT -p tcp --dport $PORT -j DROP 
//规则分INPUT/OUTPUT 

参考1
iptables 添加,删除,查看,修改

2.gdb挂载进程

命令行关闭端口或者tcp连接

  1. 定位进程
netstat -antp
//获得端口对应的进程pid

tsh@ubuntu:~$ netstat -antp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.229.128:10001   0.0.0.0:*               LISTEN      1573/server                
tcp        0      0 192.168.229.128:43178   192.168.229.128:10001   ESTABLISHED 1583/client     
tcp        0      0 192.168.229.128:10001   192.168.229.128:43178   ESTABLISHED 1573/server            
  1. 获得进程中的文件描述符fd
lsof -np pid
//获得相应端口连接的文件描述符 (FD这列就是文件描述符)

tsh@ubuntu:~$ lsof -np 1583
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
client  1583  tsh  cwd    DIR    8,1     4096  920909 /home/tsh/codeTest/TCP_Server_Clinet/clinet
client  1583  tsh  rtd    DIR    8,1     4096       2 /
client  1583  tsh  txt    REG    8,1    13648  920223 /home/tsh/codeTest/TCP_Server_Clinet/clinet/client
client  1583  tsh  mem    REG    8,1  1868984 2103006 /lib/x86_64-linux-gnu/libc-2.23.so
client  1583  tsh  mem    REG    8,1   162632 2103004 /lib/x86_64-linux-gnu/ld-2.23.so
client  1583  tsh    0u   CHR  136,9      0t0      12 /dev/pts/9
client  1583  tsh    1u   CHR  136,9      0t0      12 /dev/pts/9
client  1583  tsh    2u   CHR  136,9      0t0      12 /dev/pts/9
client  1583  tsh    3u  IPv4  24777      0t0     TCP 192.168.229.128:43178->192.168.229.128:10001 (ESTABLISHED)

  1. gdb挂载到对应进程上
gdb -p pid 
//挂载到进程上,这里可能需要root权限

  1. 关闭socket
gdb挂载上去之后执行:
call close(fd)
//fd就是上面lsof命令查询的fd
  1. 退出gdb
quit
//退出gdb

参考

3.tcpkill工具

这个一个命令行的工具
tcpkill是dsniff工具集中的,安装用一下命令即可:

 sudo apt-get install dsniff

使用说明
修改说明:原本的tcpkill只能关闭活跃的tcp连接,修改后非活跃的也能关闭

在Ubuntu下编译说明:
修改makefile文件,修改下面这两行:
原始:
LDFLAGS = -lpcap -lnet -lpthread
${CC} ${CFLAGS} ${LDFLAGS} -o $@ $^
修改后:
LDFLAGS = -lnet -lpthread -lpcap 
${CC} ${CFLAGS}  -o $@ $^ ${LDFLAGS}

原因:
这是因为Ubuntu对链接库查找顺序导致的问题,centos下可能没有这个问题。

4.killcx脚本

这是一个perl脚本,需要三个模块

官网下载
说明和使用介绍
三个依赖模块安装:要以root用户安装,不然会找不到依赖库,因为killcx是以root身份运行的
使用说明

5.kill掉TCP连接所在的进程

通过杀掉进程的方式

  1. sudo netstat -ap | grep :<port_number>
    获得进程pid
  2. kill -9
    杀掉进程

参考

总结

以上5种方式都需要ROOT权限下才能实现,这是一个弊端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值