为什么服务器突然回复RST——小心网络中的安全设备
RST产生原因
一般情况下导致TCP发送RST报文的原因有如下3种:
1、 SYN数据段指定的目的端口处没有接收进程在等待。
2、TCP想放弃一个已经存在的连接。
3、TCP接收到一个数据段,但是这个数据段所标识的连接不存在。
对于第一种情况,常见的例子是终端访问服务器未开放的端口,服务器回复RST报文。比如,访问Web服务器的21端口(FTP),如果该端口服务器未开放或者阻断了到该端口的请求报文,则服务器很可能会给终端SYN报文回应一个RST报文。因此,服务器对终端的SYN报文响应RST报文在很多时候可以作为端口扫描器判断目标端口未开放的一个可靠依据。当然,在大多数场景下,服务器对到达自身未监听端口的报文进行丢弃而不响应是一种更为安全的实现。
第二种情况比较好理解,正常拆除一个已有TCP连接的方式是发送FIN,FIN报文会在所有排队数据都发出后才会发送,正常情况下不会有数据丢失,因此,这也被称为是有序释放。另外一种拆除已有TCP连接的方式就是发送RST,这种方式的优点在于无需等待数据传输完毕,可以立即终结连接,这种通过RST拆除连接的方式被称为异常释放。大多数时候服务器需要针对两种不同的拆链方式提供不同的处理方法,也有很多服务器无法识别RST方式的拆链,这时候就需要格外小心,因为一旦出现这种情况,尤其是大量终端使用RST方式拆链,可能会导致服务器侧连接无法得到有效释放,影响其正常业务侧处理能力。
最后一种情况,TCP通过4元组(源目IP,源目端口)唯一的标识一个连接,由于TCP状态机的存在,触发TCP连接建立的第一个报文标志位一定是SYN置位,因此,当服务器接收到一个新四元组(服务器本地没有这个连接)的非SYN首包就会丢弃该报文并向终端响应一个RST报文。最后一种情况,TCP通过4元组(源目IP,源目端口)唯一的标识一个连接,由于TCP状态机的存在,触发TCP连接建立的第一个报文标志位一定是SYN置位,因此,当服务器接收到一个新四元组(服务器本地没有这个连接)的非SYN首包就会丢弃该报文并向终端响应一个RST报文。
问题现象
通过终端登录Web,输入用户名密码后Web页面显示连接被重置。抓包报文如下:
终端10.153.47.104访问服务器10.153.42.65的8051端口,三次握手建立完成后,终端向服务器发送认证请求,提交用户名和密码,而后服务器立即回应RST拆除已有连接。
问题分析
通过对比前述3种情况,发现只能匹配上原因2,但从原因2来看也只是说明服务器在这个位置确实可以回复RST报文,无法解释为什么服务器要回复RST。
这个时候我们需要考虑一个问题:这个RST报文是不是真的是服务器回复的?从RST报文的seq来看确实可以和前序报文对应得上(由于SYN标志位在逻辑上占用1字节序号,所以RST报文的序号是第二个报文的序号加1)。一个很好的判断一条流是否是同一个服务器发送的方法是对比同一个方向的报文的IP头中的TTL值。由于TCP对乱序非常敏感,而网络设备逐包转发数据会引入更严重的乱序,因此网络中的设备一般都是逐流转发(按五元组,源目IP、源目端口、协议),所以,大部分情况下,在捕获的数据流中,同一条流的同一个方向的报文总是有相同的TTL值,我们基于这个判断来看一下上方截图中的第二个和第五个报文的TTL值:
第二个报文的TTL值为251:
第五个报文的TTL为122:
因此,基本可以判断RST报文为中间传输设备发出。排查流量路径上的安全设备,在IPS中找到对应的日志:
由于用户名和密码都是admin且明文传输,因此触发了Web用户登录弱口令的防御规则,连接被重置,IPS冒充服务器向终端发送RST报文拆链,如果在IPS设备抓包,可以看到IPS也同时冒充终端发送了RST给服务器。
在很多环境中,中间安全设备通过RST拦截报文时初始TTL一般是64、128、255,这时候根据终端抓包的TTL就能反推出进行拦截的安全设备所处的位置。当然也有一些安全设备进行拦截的时候TTL初始值无迹可寻,这时候只能逐跳排查了。
为什么服务器突然回复RST——小心网络中的安全设备的更多相关文章
- 阿里云VPC服务器通过ClassicLink访问经典网络服务器
VPC中的服务器名称是 vpc-ecs1 , 经典网络中的服务器名称是 classic-ecs2 ,要实现 vpc-ecs1 通过内网访问 classic-ecs2 . VPC 网段是 10.0.0. ...
- 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!
摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...
- 客户也可以申请它使用的最后一个IP地址。如果该客户所在的网络中此IP仍然可用,服务器就可以准许该申请。
http://baike.baidu.com/item/IP地址 公有地址 公有地址(Public address)由Inter NIC(Internet Network Information Ce ...
- DDos攻击的一些领域知识——(流量模型针对稳定业务比较有效)不稳定业务采用流量成本的检测算法,攻击发生的时候网络中各个协议的占比发生了明显的变化
在过去,很多防火墙对于DDoS攻击的检测一般是基于一个预先设定的流量阈值,超过一定的阈值,则会产生告警事件,做的细一些的可能会针对不同的流量特征设置不同的告警曲线,这样当某种攻击突然出现的时候,比如S ...
- Android 从网络中获取数据时 产生部分数据乱码的解决
产生部分数据乱码的解决 标签: android部分中文乱码 2014-04-12 23:24 12366人阅读 评论(10) 收藏 举报 分类: [Android 基础](15) 版权声明:本文为博主 ...
- 网络中两台主机的通信过程(TCP)
两台主机通信有两种情况:1.在同一网段中 2.不在同一网段中 (1.)在同一网段的通信过程 主机在应用层上的操作: TCP/IP协议上tcp的端口对应的各种应用程序,客户机要访问某个应用程序就会要求打 ...
- http报文在网络中是明文传输的,所以不安全。HTtp必然来临
HTTP数据在网络中裸奔 HTTP明文协议的缺陷,是导致数据泄露.数据篡改.流量劫持.钓鱼攻击等安全问题的重要原因.HTTP协议无法加密数据,所有通信数据都在网络中明文“裸奔”.通过网络的嗅探设备及一 ...
- Sun开发的JINI技术在网络中的应用
一.概述 Sun公司开发的Jini系统是一种创新技术,听说它的人很多但较少被人理解.Jini系统可利用Java扩展网络计算的范围,并有可能成为最佳解决方案. Jini是Sun公司的研究与开发项目,它能 ...
- Windows Azure 虚拟网络中虚拟机的网络隔离选项
最近我们发布了一份<Windows网络安全白皮书>(单击此处下载),文中深入说明了客户可以如何利用该平台的本地功能,为他们的信息资产提供最好的保护. 由首席顾问Walter Myer ...
随机推荐
- 使用MySQL,SQL_MODE有哪些坑,你知道么?
SQL_MODE是MySQL中的一个系统变量(variable),可由多个MODE组成,每个MODE控制一种行为,如是否允许除数为0,日期中是否允许'0000-00-00'值. 为什么需要关注SQL_ ...
- HyperLPR车牌识别
简介 本文基于HyperLPR进行修改,完整代码参考https://github.com/Liuyubao/PlateRecognition. HyperLPR是一个使用深度学习针对对中文车牌识别的实 ...
- 致Java星球程序员兄弟们的一封信
致Java星球程序员兄弟们的一封信 亲爱的Java星球的程序员兄弟们: 你们好!我是来自地球的一名Java程序员,首先我代表地球人对贵星球的高司令来到地球传授Java语言,造福了全人类,造福了整个地球 ...
- js垃圾回收
内存生命周期 分配你所需要的内存 使用分配到的内存(读.写) 不需要时将其释放\归还 所有语言第二部分都是明确的.第一和第三部分在底层语言中是明确的,但在像 JavaScript 这些高级语言中,嵌入 ...
- LVS DR模式实践
client:192.168.4.10/24 proxy:192.168.4.5/24 VIP: 192.168.4.15/24 web1:192.168.4.100/24 VIP:192.168 ...
- LVS NAT模式实践
client:192.168.4.10/24 proxy:192.168.2.5/24 192.168.4.5/24 web1:192.168.4.100/24 web2:192.168.4.200/ ...
- Win7安装解压版MySQL
1.下载MySQL 访问https://dev.mysql.com/downloads/mysql/5.6.html#downloads,下载操作系统对应的版本(无账号需先注册一个),以mysql-5 ...
- RocketMQ ACL使用指南
目录 1.什么是ACL? 2.ACL基本流程图 3.如何配置ACL 3.1 acl配置文件 3.2 RocketMQ ACL权限可选值 3.3.权限验证流程 4.使用示例 4.1 Broker端安装 ...
- linux写系统服务的方法
linux写系统服务的方法 2.1 首先编写demo程序:hello.c<pre>#include <stdio.h> # chkconfig: 2345 10 90 main ...
- Ansible之常用模块(二)
1.hostname:此模块的主要作用是管理远端节点主机名 模块帮助: root@localhost ~]# ansible-doc -s hostname - name: Manage hostna ...