【电脑远控源码】【openstack心跳包 源码】【网络验证程序源码】tcpdump 源码

时间:2024-11-26 12:39:43 来源:火鸟门户7.1源码 分类:综合

1.在ESTABLISHED状态时,连接收到SYN会回复什么?
2.TCPDUMP简介
3.Netty 出现 Connection reset by peer 异常的几个原因
4.你不知道的linux抓包神器—— tcpdump

tcpdump 源码

在ESTABLISHED状态时,连接收到SYN会回复什么?

       最初的问题,读者在阅读我关于《TCP RST 攻击与如何杀掉一条 TCP 连接》时提出,即处于 ESTABLISHED状态的连接为什么还需要响应 SYN 包?接下来,我们通过实验、电脑远控源码内核源码分析与工具介绍,详细解答这一问题。

       实验复现

       在机器 A(IP:...)使用 nc 启动服务监听 端口。同时,机器 B 使用 nc 连接 A 的 nc 服务器,并输入 "hello"。通过 tcpdump 观察此次连接信息。随后,机器 B 使用 scapy 模拟发送 SYN 包,并查看 tcpdump 显示的包结果。实验发现,对于一个序列号为随意的 SYN 包,TCP 回复了正确的 ACK 包,确认号为 。openstack心跳包 源码RFC 文档也指出,Linux 内核收到乱序 SYN 报文时,会回复携带正确序列号和确认号的 ACK 包,即 Challenge ACK。

       原因分析

       发送 SYN 包的一端记为 A,接收 SYN 的 ESTABLISHED 状态端记为 B。B 对收到的 SYN 包回复 ACK 的目的是验证先前的连接是否失效,以便采取相应处理。若 A 的连接仍在,则正常处理 ACK 包。若连接已不在,此 SYN 包试图发起新连接,收到 ACK 后,A 会立即回复 RST 包,序列号等于 ACK 包的序列号,B 收到合法的 RST 包后释放连接。若 A 想重新与 B 创建连接,则可再次发送 SYN 包。

       内核源码分析

       使用 SystemTap 工具插入探针,网络验证程序源码观察内核函数 tcp_send_ack 的调用过程。在端口号为 时,打印函数调用堆栈。通过 SystemTap 脚本执行后,发现 ACK 包经过了 tcp_validate_incoming 和 tcp_send_challenge_ack 函数。RFC 提出了 ACK Throttling 方案,限制每秒最多发送 个 Challenge ACK 报文,通过 sysctl 函数可以调整此限制。

       RST 攻击

       RST 攻击通过伪造 RST 包关闭正常连接。攻击难点在于构造序列号落在对方滑动窗口内的包。实验中,启动 tcpkill 工具并发送 RST 包,观察服务端与客户端进程退出。tcpkill 通过 libpcap 库抓取符合条件的包,从而获取序列号,伪造 IP 发送 RST 包。此外,介绍 killcx 工具,用于处理僵死连接。静市盈源码

       工具介绍

       杀掉 TCP 连接的工具包括 tcpkill 和 killcx。tcpkill 假冒 IP 发送 RST 包,依赖有数据传输的连接才能获取序列号。killcx 是一个 perl 编写的脚本,可以在任何 TCP 连接状态下关闭连接。

       总结,本文通过实验、内核源码分析和工具介绍,详细解答了 ESTABLISHED 状态连接为何响应 SYN 包,以及如何使用 Challenge ACK、ACK Throttling、tcpkill 和 killcx 来处理相关连接问题。

TCPDUMP简介

       Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。TcpDump是Linux中强大的网络数据采集分析工具之一。

       简单来说,TcpDump就是对网络上的数据包进行截获和包分析的工具。它的linux程序源码安装强大功能和灵活的截取策略,使其成为高级系统管理员分析网络、排查问题的必备工具。

       顾名思义,TcpDump能够完整截获网络中传送的数据包的“头”,并根据用户定义进行过滤。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句帮助去除无用信息。

       TcpDump具有源代码和接口公开的特性,使其具备极强的可扩展性,对于网络维护和入侵者而言都是有用的工具。它存在于基本的FreeBSD系统中,但需要将网络接口设置为混杂模式,普通用户无法执行,仅具备root权限的用户能直接获取网络信息。因此,系统中的网络分析工具主要对网络上的其他计算机安全构成威胁,而非本机安全。

       基本上,TcpDump的输出格式为:系统时间,来源主机.端口 > 目标主机.端口,数据包参数。通过这种方式,用户可以详细分析网络数据,了解网络流量、发现潜在问题,以及进行安全监控等。

扩展资料

       TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

Netty 出现 Connection reset by peer 异常的几个原因

       æœ€è¿‘使用 netty 过程中发现了几个比较细节的 Connection reset by peer 异常,做个笔记。

        这个场景出现在用 Jedis ping 检测的场景,用完直接 close,服务端稳定出现 Connection reset by peer。

        tcpdump 一下就很容易定位到问题所在,客户端收到 PONG 响应后直接发了一个 RST 包给服务端:

        查看 Jedis 的源码发现 socket 有个比较特殊的配置 socket.setSoLinger(true, 0) 。

        先看一下 man7/socket.7 的解释:

        坦白说不是很明白啥意思。。。

        最终在 stackoverflow 上找到一个比较容易理解的解释:

        简而言之,设置 SO_LINGER(0) 可以不进行四次挥手直接关闭 TCP 连接,在协议交互上就是直接发 RST 包,这样的好处是可以避免长时间处于 TIME_WAIT 状态,当然 TIME_WAIT 存在也是有原因的,大部分评论都不建议这样配置。

        这个场景有点儿微妙,首先得理解一下 tcp 的两个队列。

        这篇文章讲得比较清楚: SYN packet handling in the wild

        accept 队列满通常是由于 netty boss 线程处理慢,特别是在容器化之后,服务刚启动的时候很容易出现 CPU 受限。

        为了模拟这个现象,我写了个示例程序 shichaoyuan/netty-backlog-test ,设置 SO_BACKLOG 为 1,并且在 accept 第一个连接后设置 autoRead 为 false,也就是让 boss 线程不再继续 accept 连接。

        启动第一个 Client,可以正常连接,发送 PING,接收 PONG。

        启动第二个 Client,也可以正常连接,但是没有收到 PONG:

        可见这个连接创建成功了,已经在 Accept Queue 里了,但是进程没有 accept,所以没有与进程绑定。

        启动第三个 Client,也可以正常连接,也没有收到 PONG:

        与第二个连接一样。

        启动第四个 Client,也可以正常连接,但是在发送 PING 后出现 Connection reset by peer:

        这个连接在服务端并没有进入 accept queue,处于 SYN_RECV 状态,并且很快就消失了(因为 accept queue 已经满了,无法转入 ESTABLISHED 状态)。

        抓包看一下:

        从客户端视角来看连接确实是建成功了,有一个比较特殊的地方在三次握手之后,服务端又向客户端发送了一个 [S.],客户端回复了一个 [.],这个交互看起来不影响连接。

        服务端后来销毁了连接,而客户端还认为连接是 ESTABLISHED 的,发送 PING 消息,服务端自然得回复一个 RST。

        PS:我在 Windows 的 WSL2 中实验这种场景是建连接超时,可能不同的操作系统或 linux 版本对这个交互的过程处理不同,在此不进行进一步测试了。

        以上,这个故事告诉我们判断连接是否可用,建成功之后应该发个心跳包测试一下。

你不知道的linux抓包神器—— tcpdump

       在Linux世界中,tcpdump这款神器就像一个无与伦比的网络数据侦探,为网络分析提供了强大的工具。让我们深入了解这款工具及其众多强大的参数,它们将帮助你洞察网络世界的每一个细节。

-a:当你想要揭示网络的真实名字而非地址时,这个选项派上用场,让你的报告更具人性化。

-d, -dd, -ddd:想要深入到数据包的底层?这些选项分别展示了汇编、C语言代码和十进制代码,揭示了数据包的构造秘密。

-e:显示链路和网络层的头部信息,让你瞬间明白数据包的旅程起点和终点。

-n, -nn:增强细节呈现,nn选项甚至会揭示IP地址和端口,让你对数据包的交互了如指掌。

-t:如果时间不是你的关注点,-t则会移除包的发送时间,让关键信息更突出。

-v, -vv:从常规输出到深度解析,vv让你能够深入探究每个报文的来龙去脉。

-c:定义抓包数量限制,让你对流量进行精细管理。

-F:这个选项允许你自定义过滤规则,让你的抓包更具针对性。

-i:指定你感兴趣的网络接口,确保只捕获你需要的数据。

-p:非混杂模式下,只捕获指定接口的流量,提高抓包效率。

-r, -w:分别用于读取和写入包文件,为数据备份或长期分析提供方便。

-s:控制抓包的包大小,节省存储空间,同时保持关键信息完整。

-T:将报文类型进行解释,让你快速识别关键类型的数据。

-X:原样显示协议,保留原始格式,方便深入理解协议细节。

       此外,学习之路并非孤立,加入我们的交流群,前名成员将有机会获得内核资料包的馈赠。这里有丰富的学习资源,如内核技术解析视频、源码解析,以及深入的Linux内核系统学习课程,助你提升网络知识。

       在实战中,你可以用tcpdump less greater 来过滤出大于字节且小于字节的报文,然后保存到文件或实时查看。抓取特定端口数据也轻而易举,比如跟踪..1.的端口交互,或者指定源/目的网段(如.//.)。通过观察数据包,你可以清晰地看到三次握手的整个过程,包括SYN(带有S标志)和SYN-ACK(带有S.标志)的发送和接收。

       总之,tcpdump是Linux网络分析的得力助手,通过掌握这些参数和技巧,你将能深入解析网络行为,解锁更多可能。现在就拿起你的工具,开始探索网络的无限奥秘吧!