preface

最近讨论解决服务状态不正确的问题, 涉及到一个连接关闭的手段, 但是网上说法很多, 很难有一篇完整的手段描述, 特别记忆

实现

首先, 我们使用nc模拟网络的收发. 启动server:

nc -l -p 4444 

启动client:

nc localhost 4444 -p 5555 

使用tcpdump 查看效果:

sudo tcpdump port 4444 -i lo  -xnn -S 
sudo tcpdump port 5555 -i lo  -xnn -S

结果如下:

tcpdump

查看下连接的状态:

ss -ant | grep -E '4444|5555'

如下图: ss

根据参考的文档, 正确关闭的姿势如下(亲测有效):

sudo iptables -A INPUT -p tcp --dport 4444 -j REJECT --reject-with tcp-reset
iptables -nL   // n 数字化输出地址和端口, L 列出所有规则
iptables -F    // 删除所有规则
iptables -A OUTPUT -p tcp --dport 5555 -j REJECT --reject-with tcp-reset
iptables -nL

注意:

iptables 在设置了reject策略之后, 需要及时清除, 方便后面创建新的连接, 这样才可以做到 关闭之前的连接但不影响整体连接的健康. 比如 mq的连接未关闭的处理.

参考