4.9 已建立连接的TCP,收到SYN会发生什么?

TCP连接管理:SYN重用与关闭策略
文章探讨了客户端SYN报文端口号变化对已建立连接的影响,以及如何通过RST报文关闭TCP连接。介绍了killcx和tcpkill工具在主动/被动获取序列号以关闭连接的区别。

1. 客户端的 SYN 报文里的端口号与历史连接不相同

此时服务端会认为是新的连接要建立,于是就会通过三次握手来建立新的连接。

旧连接里处于 Established 状态的服务端最后会怎么样呢?

服务端给客户端发消息了:客户端连接已被关闭,此时客户内核回RST报文,服释放连接;

服务端没给客户端发消息:超过一段时间,tcp保活机制启动,释放连接

2. 客户端的 SYN 报文里的端口号与历史连接相同

 处于 Established 状态的服务端收到了这个 SYN 报文(此时的 SYN 报文其实是乱序的,因为 SYN 报文的初始化序列号其实是一个随机数),服务端回复一个携带正确序列号的确认号的ACK报文,客户端接收到这个ACK发现不是自己想要的,返回RST给服务端,释放连接。

如何关闭TCP连接?

伪造一个RST报文,必须满足四元组相同序列号是对方期望的这两个条件。

killcx工具伪造一个四元组相同的SYN报文,来拿到合法的序列号。

tcpkill 工具是在双方进行 TCP 通信时,拿到对方下一次期望收到的序列号。然后将序列号填充到伪造的 RST 报文,并将其发送给对方,达到关闭 TCP 连接的效果。

  • tcpkill 属于被动获取,必须再双方进行TCP通信时,才能获取正确的序列号,显然这种方式无法关闭非活跃的TCP连接。
  • killcx 工具则是属于主动获取,它是主动发送一个 SYN 报文,通过对方回复的 Challenge ACK 来获取正确的序列号,所以这种方式无论 TCP 连接是否活跃,都可以关闭
<think>我们正在讨论的是iptables中的NOTRACK规则对连接跟踪的影响。根据引用[2],NOTRACK目标用于跳过连接跟踪。具体来说,当我们在raw表的PREROUTING或OUTPUT链中添加NOTRACK规则时,匹配的数据包将不会被连接跟踪模块处理连接跟踪(conntrack)是netfilter的一个核心模块,它负责跟踪数据包的状态(如NEW, ESTABLISHED, RELATED, INVALID)。通过连接跟踪,iptables可以实现有状态防火墙的功能。 使用NOTRACK规则后,数据包将不会进入连接跟踪系统,因此: 1. 该数据包不会创建新的连接跟踪条目。 2. 该数据包也不会更新任何已有的连接跟踪条目。 3. 后续相关的数据包(如响应包)将无法匹配到连接状态(如ESTABLISHED),因为连接跟踪中不存在对应的条目。 举例来说,如果我们对进入80端口的TCP SYN包设置了NOTRACK(如引用[2]中的例子): iptables -t raw -A PREROUTING -i ens33 -p tcp --dport 80 --syn -j NOTRACK 那么,这个SYN包不会被连接跟踪,因此不会创建相应的连接跟踪条目。当服务器返回SYN-ACK时,由于没有连接跟踪条目,这个SYN-ACK包可能会被防火墙视为无效(INVALID)或者不被识别为已建立连接(ESTABLISHED)的包,从而导致连接失败。 因此,使用NOTRACK需要谨慎,通常需要配合其他规则来允许相关数据包通过。 另外,引用[3]中提到的规则: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 这条规则依赖于连接跟踪模块。如果我们在某个连接上使用了NOTRACK,那么该连接的后续包将无法匹配到ESTABLISHED状态,因此可能会被防火墙拒绝。 所以,当我们使用NOTRACK时,通常需要为这些数据包设置额外的规则来允许它们通过,而不依赖于连接跟踪状态。 总结NOTRACK的影响: 1. 跳过连接跟踪,减少系统开销(适用于高性能场景)。 2. 破坏有状态防火墙的功能,需要手动设置无状态规则。 3. 可能导致后续包无法识别状态而被丢弃,需要仔细设计规则。 注意:在raw表中使用NOTRACK规则时,要确保在后续的表中(如filter表)有相应的规则允许这些数据包,否则可能导致通信失败。 相关问题: 1. 在哪些场景下适合使用NOTRACK规则? 2. 如何为NOTRACK的数据包设置防火墙规则? 3. 使用NOTRACK后,如何保证通信的安全性?</think>### iptables 中 `NOTRACK` 规则对连接跟踪的影响分析 #### 一、`NOTRACK` 的核心作用 `NOTRACK` 是 iptables 在 **raw 表**中提供的特殊目标,其核心作用是**完全跳过连接跟踪(conntrack)机制**。当数据包匹配 `NOTRACK` 规则时: 1. **不创建连接跟踪条目** 数据包不会被记录到 `conntrack -L` 的输出中[^2] 2. **不更新状态机** 忽略所有状态转换(NEW/ESTABLISHED/RELATED/INVALID) 3. **绕过状态检测** 后续防火墙规则无法使用 `-m conntrack --ctstate` 匹配该数据包[^1][^5] ```mermaid graph LR A[数据包进入] --> B{raw 表 PREROUTING} B -->|匹配 NOTRACK| C[跳过 conntrack] B -->|未匹配| D[正常连接跟踪] C --> E[后续规则处理] ``` #### 二、对连接跟踪状态的影响 | **状态类型** | **未使用 NOTRACK** | **使用 NOTRACK** | |--------------|-------------------|------------------| | **NEW** | 首次包创建新条目 | ❌ 无条目创建 | | **ESTABLISHED** | 响应包更新状态 | ❌ 状态不更新 | | **RELATED** | 关联连接可识别 | ❌ 关联性丢失 | | **INVALID** | 异常包被标记 | ❌ 不检测异常 | #### 三、典型应用场景与风险 ##### 适用场景 1. **高性能网络处理** 对特定流量(如 UDP 视频流)禁用连接跟踪可减少 CPU 开销 ```bash iptables -t raw -A PREROUTING -p udp --dport 5000:6000 -j NOTRACK ``` 2. **避免状态冲突** 处理特殊协议(如 VRRP/HSRP)时防止状态误判 ##### 风险与缺陷 1. **状态防火墙失效** 经典放行规则失效: ```bash iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT # 不再生效[^3] ``` 2. **需手动放行双向流量** 必须添加显式规则: ```bash iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ``` 3. **NAT 功能受限** 基于连接跟踪的 NAT(如 `MASQUERADE`)可能失效 #### 四、配置示例与验证 ##### 配置 NOTRACK ```bash # 跳过 HTTP 流量跟踪 iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK # 放行流量(不依赖状态) iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT ``` ##### 验证效果 ```bash # 监控 conntrack 条目 conntrack -E -p tcp --dport 80 # 检查规则计数 iptables -t raw -vL iptables -vL INPUT ``` #### 五、与其他技术的对比 | **机制** | **资源消耗** | **状态感知** | **规则复杂度** | |----------------|------------|------------|--------------| | **标准 conntrack** | 高 | ✔️ 完整 | 低(状态规则) | | **NOTRACK** | 低 | ❌ 无 | 高(需显式放行)| | **CT --notrack** | 中 | 部分 | 中 | > 注:`CT --notrack` 是更新的替代方案,提供更精细的控制(需内核 ≥4.9)[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值