了解 TCP 重组删除

了解 TCP 重组删除

85764
Created On 09/25/18 19:21 PM - Last Modified 06/13/23 13:41 PM


Resolution


本文档讨论了 TCP 重组数据包丢弃疑难解答时的一个常见方案 

 

下面是一个案例研究, 其中, 客户端172.22.136.50 尝试连接到目标端口80上的服务器192.16.31.62。防火墙配置了动态地址和端口转换, 因为在接收和传输阶段的 SYN 显示不同的 ip 和端口号, 尽管 ip ID 保持不变。

 

客户端发送 SYN。 防火墙接收 syn, 执行 NAT 并传输 syn。服务器接收 syn 并以 syn 应答。防火墙接收到 SYN, nats, 并将数据包传送回客户端。SYN 从不从防火墙向客户端进行连接, 因此, 客户端在尝试在新的端口号上建立连接之前, 会重试在同一端口号上连接4次。

 

第一个快照显示从客户端到服务器的 SYNs, 在接收、防火墙、传输和放置阶段 (虽然放置阶段没有包) 的防火墙。第二个快照显示从服务器到客户端的 SYN ACKs, 再次在接收、传输、防火墙和防火墙的放置阶段。

 

a) 客户端首先尝试使用具有以下 IP 和 TCP 值的 SYN 数据包连接到服务器:

ip: 172.22.136.50, D ip: 192.16.31.62, ip. Id 24915, src 端口 44912, 工作台端口 80, 序列 2033466733, Ack#0

b) 防火墙接收到数据包, 并将 IP 从172.22.136.50 转换为198.180.162.5 和源端口, 从44912到 21081, 因此在传输阶段的 SYN 数据包具有以下 IP 和 TCP 值

ip: 198.180.162.5, D ip: 192.16.31.62, ip. id 24915 src 端口 21081, 工作台端口 80, 序列 2033466733, Ack#0

c) syn 最终到达服务器, 服务器以 SYN 应答。在防火墙上收到的 SYN ACK 具有以下 IP 和 TCP 值:

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 743112262, Ack 2033466734

d) 防火墙取消 nats, 并将数据包传输出去, IP 和 TCP 值如下

ip: 192.16.31.62, D ip: 172.22.136.50, ip. id 0, src 端口 80, 工作台端口 44912, 序列 743112262, Ack 2033466734

 

阿维纳考希克

 

 

 阿维纳考希克-戴尔-pcap 分析. jpg

 

由于客户端从未收到 SYN, 因此在最终放弃之前, 它会在相同的源 ip、目标 IP、源端口、目标端口、序号和 ACK 上重试4次, 然后尝试再次连接新的端口号。 

 

ip: 172.22.136.50, D ip: 192.16.31.62, ip. Id 24916, src 端口 44912, 工作台端口 80, 序列 2033466733, Ack#0

ip: 172.22.136.50, D ip: 192.16.31.62, ip. Id 24917, src 端口 44912, 工作台端口 80, 序列 2033466733, Ack#0

ip: 172.22.136.50, D ip: 192.16.31.62, ip. Id 24918, src 端口 44912, 工作台端口 80, 序列 2033466733, Ack#0

ip: 172.22.136.50, D ip: 192.16.31.62, ip. Id 24919, src 端口 44912, 工作台端口 80, 序列 2033466733, Ack#0

 

服务器接收所有这些 SYNs, 并响应所有这些 SYNs 与他们的 SYN ACKs。与 syn 类似, ACKs 也具有相同的源 ip、目标 ip、源端口、目标端口、序列号和 Ack。 

 

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 743112262, Ack 2033466734

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 743112262, Ack 2033466734

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 743112262, Ack 2033466734

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 743112262, Ack 2033466734

 

预计将看到 Ip. ACKs 的 Id 为0。这并不意味着数据包格式不正确。

 

 

在前4次失败的尝试之后, 服务器继续转发 SYN ACKs, 但现在在不同的序列上。理想情况下, Syn 中的序列 # 的变化对客户端无关紧要, 因为客户端不知道服务器的序列号 (客户端的 Syn 数据包有 Ack 0)。

 

如快照中所示, 服务器转发 SYN ACKs, 其 IP 和 TCP 值如下:

 

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 883668401, Ack 2033466734

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 883668401, Ack 2033466734

ip: 192.16.31.62, D ip: 198.180.162.5, ip. id 0, src 端口 80, 工作台端口 21081, 序列 883668401, Ack 2033466734

 

防火墙接收到这些 ACKs, 并将其与下面的计数器一起删除:

 

tcp_drop_packet 2 0 警告 tcp pktproc 数据包由于 tcp 重组失败而丢弃

 

tcp 重组失败的原因可以通过启用 "TCP reass" 以及常规筛选器、捕获和流基本来理解。

 

>> 调试 dataplane 数据包诊断集日志功能 tcp
所有
fptcp fptcp
reass reass

 

>> 调试 dataplane 包诊断显示设置

.....


已启用日志记录: 是
日志节流: 没有
同步-按滴答记录: 是
功能:
流量: 基本
tcp: reass fptcp
计数器:     

 

下面的 pan_packet_diag 日志解释了 TCP reassebly 故障是如何导致数据包下降的。

 

a) 传输的 SYN 的日志

 

== 2015-09-01 13:21:45.170-0400 ==
在 fastpath 阶段收到的数据包
信息: len 74 端口30接口 30 vsys 1
wqe 索引227771数据包 0x0x80000004162190e6
包解码转储:
L2: 70:81:05: 欧共体: d4:3f-> 00:1b: 17:00:04:1e, 类型0x0800
IP: 172.22.136.50->> 192.16.31.62, 协议 6
版 4, 国际人道主义法 5, tos 0x00, len 60,
id 24915, frag_off 0x4000, ttl 60, 校验和 51665
TCP: 运动 44912, dport 80, 序列 2033466733, ack 0,
预留 0, 偏移 10, 窗口 5840, 校验和 49659,
标志 0x0002 (SYN), 紧急数据 0
TCP 选项:
00000000:02 04 05 b4 04 02 08 0a 99 03 5c 3e 00 00 00 00..。..\>....
00000010:01 03 03 00..。
流 fastpath, 会话 371381
NAT 会话, 运行地址/端口转换
2015-09-01 13:21:45.171-0400 调试: pan_tcp_reass (pan_reass: 1999): reass: 工作 0x8000000418bcdd00 session=371381 seqno=2033466733 tcplen=0 l4plen=0 国家 0
2015-09-01 13:21:45.171-0400 调试: pan_tcp_tcb_init_base (pan_reass: 612): SYN: c2s 2015-09-01 13:21:45.171
-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 539): tcp mss 1460 2015-09-01 13:21:45.171
-0400 调试: pan_tcp_parse_options_syn (pan_reass: 560): 麻袋允许
2015-09-01 13:21:45.172-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 568): 忽略 tcp 选项 8 2015-09-01 13:21:45.172
-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 553): tcp窗口缩放 0
Syn Cookie: pan_reass (Init 状态): c2s:0 c2s:nxtseq 2033466734 c2s:startseq 2033466734 c2s:win 0 c2s:st 3 c2s:newsyn 0:: s2c:nxtseq 0 s2c:startseq 0 s2c:win 5840 s2c:st 0 s2c:newsyn 0 ack 0 nosyn 0 2015-09-01 13:21:45.172-0400 
调试: pan_tcp_reass (pan_reass: 2484): 
session=371381 工作0x8000000418bcdd00 有效载荷长度 0, tcp 数据长度 0, ret 0
转发查找, 入口接口 30
L3 模式, 虚拟路由器 2
路由查找在虚拟路由器 2, IP 192.16.31.62

 

b) "莱辛" 通过 pan_packet_diag 日志, 我们遇到了防火墙收到的第一个 SYN 应答。

fireawall 在快速路径阶段接收到此 SYN, 并评估它在 c2s 方向所期望的下一个数据包, 即数据包与序列2033466734(通常是来自客户端的 ACK 数据包).    同样, 它期望从 s2c 方向的下一个数据包是一个与序列 743112263. 在评估这些条件后, 防火墙将数据包传输出去。 

 

== 2015-09-01 13:21:45.173-0400 ==
在 fastpath 阶段收到的数据包
信息: len 66 端口28接口 28 vsys 0
wqe 索引224088数据包 0x0x8000000416faf0e6
数据包解码转储:
L2: b4:14:89:85:4e:43->00:1b:17:00:04:1c, 类型0x0800
IP: 192.16.31.62-198.180.162.5, 协议 6
版 4, 国际人道主义法 5, tos 0x08, len 52,
id 0, frag_off 0x4000, ttl 57, 校验和 63923
TCP: 运动 80, dport 21081, 序列743112262, ack2033466734,
预留 0, 偏移 8,窗口 14600, 校验和 47633,
标志 0x0012 (SYN ACK), 紧急数据 0
TCP 选项:
00000000:02 04 05 b4 01 01     04 02 01 03 03..。....
流 fastpath, 会话 371381
NAT 会话, 运行地址/端口转换
2015-09-01 13:21:45.173-0400 调试: pan_tcp_reass (pan_reass: 1999): reass: 工作 0x8000000418b5ab80 session=371381 seqno=743112262 tcplen=0 l4plen=0 国家 0
2015-09-01 13:21:45.173-0400 调试: pan_tcp_tcb_init_base (pan_reass: 612): SYN: s2c 2015-09-01 13:21:45.173
-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 539): tcp mss 1460 2015-09-01 13:21:45.173
-0400 调试: pan_tcp_parse_options_syn (pan_reass: 560): 麻袋允许
2015-09-01 13:21:45.173-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 553): tcp 窗口刻度 9
syn Cookie: pan_reass (Init 状态): c2s:1 c2s:nxtseq2033466734c2s:startseq2033466734 c2s:win 14600 c2s:st 3 c2s:newsyn 0:: s2c:nxtseq743112263s2c:startseq 743112263 s2c:win 5840 s2c:st 3 s2c:newsyn 0 ack 2033466734 nosyn 0 2015-09-01 13:21:45.173-0400
调试: pan_tcp_tcb_upd_state (pan_reass. c: 783): TCP state=1 prev=3
2015-09-01 13:21:45.173-0400 调试: pan_tcp_reass (pan_reass. c: 2484):
session=371381 工作0x8000000418b5ab80 有效载荷长度 0, TCP 数据长度 0, ret 0
转发查找, 入口接口 28
L3 模式, 虚拟路由器2
虚拟路由器2中的路由查找, 找到的 ip 172.22.136.50
路由, 接口 ethernet1/15, 区域 8, nexthop 10.174.62.17 解决接口上的
ip 10.174.62.17 的 arp ethernet1/15 在接口30上的端口上的

传输数据包上找到的 arp 输入30.              

 

c) 防火墙还接收到随后的3次重新传输的 SYN ACK 数据包, 序列号为743112262和 ACK 2033466734, 并将其传输出去。
 

 

== 2015-09-01 13:21:46.169-0400 ==
在 fastpath 阶段收到的数据包
信息: len 66 端口28接口 28 vsys 0
wqe 索引222187数据包 0x0x80000004162018e6
数据包解码转储:
L2: b4:14:89:85:4e:43->00:1b:17:00:04:1c, 类型0x0800
IP: 192.16.31.62-198.180.162.5, 协议 6
版 4, 国际人道主义法 5, tos 0x08, len 52,
id 0, frag_off 0x4000, ttl 57, 校验和 63923
TCP: 运动 80, dport 21081, 序列743112262, ack 2033466734,
预留 0, 偏移 8, 窗口 14600,校验和47633、
标志 0x0012 (SYN ACK)、紧急数据 0
TCP 选项:
00000000:02 04 05 b4 01 01   04 02 01 03 03 09..。....
流 fastpath, 会话 371381
NAT 会话, 运行地址/端口转换
2015-09-01 13:21:46.169-0400 调试: pan_tcp_reass (pan_reass: 1999): reass: 工作 0x8000000418b1f500 session=371381 seqno=743112262 tcplen=0 l4plen=0 国家 1
2015-09-01 13:21:46.169-0400 调试: pan_tcp_tcb_init_base (pan_reass: 612): SYN: s2c 2015-09-01 13:21:46.169
-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 539): tcp mss 1460 2015-09-01 13:21:46.169
-0400 调试: pan_tcp_parse_options_syn (pan_reass: 560): 麻袋允许
2015-09-01 13:21:46.170-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 553): tcp 窗口刻度 9
syn Cookie: pan_reass (新 syn): c2s:1c2s:nxtseq 2033466734c2s:startseq 2033466734c2s:win 14600 c2s:st 3 c2s:newsyn 0::s2c:nxtseq 743112263s2c:startseq 743112263 s2c:win 5840 s2c:st 1 s2c:newsyn 0 ack 2033466734 nosyn 0 2015-09-01 13:21:46.170-0400
调试: pan_tcp_reass (pan_reass. c: 2484):
session=371381 工作0x8000000418b1f500 有效载荷 len 0, tcp 数据长度 0, 0
转发查找, 入口接口 28
L3 模式, 虚拟路由器 2
路由查找在虚拟路由器 2, IP 172.22.136.50
路由找到, 接口 ethernet1/15, 区域 8, nexthop 10.174.62.17解决接口上的
IP 10.174.62.17 的 arp ethernet1/15 在
接口30上找到的 arp 条目在
端口30上的传输数据包
-------------------------------------------
= = 2015-09-01 13:21:48.169-0400 = =
收到的数据包fastpath 阶段
数据包信息: len 66 端口28接口 28 vsys 0
wqe 索引227536数据包 0x0x8000000416e7e8e6
数据包解码转储:
L2: b4:14:89:85:4e:43->00:1b:17:00:04:1c, 类型 0x0800
IP: 192.16.31.62-> 198.180.162.5, 协议6
版本4、国际人道主义法5、tos 0x08、len 52、
id 0、frag_off 0x4000、ttl 57、校验和 63923
TCP: 运动80、dport 21081、序列743112262、ack 2033466734
预留0、偏移8、窗口14600、校验和47633、
标志 0x0012 (SYN ack)、紧急数据0
TCP 期权:
00000000:02 04 05 b4 01 01             04 02 01 03 03 09..。....
流 fastpath, 会话 371381
NAT 会话, 运行地址/端口转换
2015-09-01 13:21:48.170-0400 调试: pan_tcp_reass (pan_reass: 1999): reass: 工作 0x8000000418bc6780 session=371381 seqno=743112262 tcplen=0 l4plen=0 国家 1
2015-09-01 13:21:48.170-0400 调试: pan_tcp_tcb_init_base (pan_reass: 612): SYN: s2c 2015-09-01 13:21:48.170
-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 539): tcp mss 1460 2015-09-01 13:21:48.170
-0400 调试: pan_tcp_parse_options_syn (pan_reass: 560): 麻袋允许
2015-09-01 13:21:48.170-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 553): tcp 窗口刻度 9
syn Cookie: pan_reass (新 syn): c2s:1c2s:nxtseq 2033466734c2s:startseq 2033466734c2s:win 14600 c2s:st 3 c2s:newsyn 0::s2c:nxtseq 743112263s2c:startseq 743112263 s2c:win 5840 s2c:st 1 s2c:newsyn 0 ack 2033466734 nosyn 0 2015-09-01 13:21:48.170-0400
调试: pan_tcp_reass (pan_reass. c: 2484):
session=371381 工作0x8000000418bc6780 有效载荷 len 0, tcp 数据长度 0, 0
转发查找, 入口接口 28
L3 模式, 虚拟路由器 2
路由查找在虚拟路由器 2, IP 172.22.136.50
路由找到, 接口 ethernet1/15, 区域 8, nexthop 10.174.62.17解决接口上的
IP 10.174.62.17 的 arp ethernet1/15 在
接口30上找到的 arp 条目在
端口30上传输数据包
------------------------------------------          

== 2015-09-01 13:21:48.170-0400 ==
在 fastpath 阶段收到的数据包
信息: len 66 端口28接口 28 vsys 0
wqe 索引226639数据包 0x0x8000000416a288e6
数据包解码转储:
L2: b4:14:89:85:4e:43->00:1b:17:00:04:1c, 类型0x0800
IP: 192.16.31.62-198.180.162.5, 协议 6
版 4, 国际人道主义法 5, tos 0x08, len 52,
id 0, frag_off 0x4000, ttl 57, 校验和 63923
TCP: 运动 80, dport 21081, 序列743112262, ack 2033466734,
预留 0, 偏移 8, 窗口 14600,校验和47633、
标志 0x0012 (SYN ACK)、紧急数据 0
TCP 选项:
00000000:02 04 05 b4 01 01   04 02 01 03 03 09..。....
流 fastpath, 会话 371381
NAT 会话, 运行地址/端口转换
2015-09-01 13:21:48.170-0400 调试: pan_tcp_reass (pan_reass: 1999): reass: 工作 0x8000000418baa700 session=371381 seqno=743112262 tcplen=0 l4plen=0 国家 1
2015-09-01 13:21:48.170-0400 调试: pan_tcp_tcb_init_base (pan_reass: 612): SYN: s2c 2015-09-01 13:21:48.170
-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 539): tcp mss 1460 2015-09-01 13:21:48.170
-0400 调试: pan_tcp_parse_options_syn (pan_reass: 560): 麻袋允许
2015-09-01 13:21:48.170-0400 调试: pan_tcp_parse_options_syn (pan_reass. c: 553): tcp 窗口刻度 9
syn Cookie: pan_reass (新 syn): c2s:1c2s:nxtseq 2033466734c2s:startseq 2033466734c2s:win 14600 c2s:st 3 c2s:newsyn 0::s2c:nxtseq 743112263s2c:startseq 743112263 s2c:win 5840 s2c:st 1 s2c:newsyn 0 ack 2033466734 nosyn 0 2015-09-01 13:21:48.170-0400
调试: pan_tcp_reass (pan_reass. c: 2484):
session=371381 工作0x8000000418baa700 有效载荷 len 0, tcp 数据长度 0, 0
转发查找, 入口接口 28
L3 模式, 虚拟路由器 2
路由查找在虚拟路由器 2, IP 172.22.136.50
路由找到, 接口 ethernet1/15, 区域 8, nexthop 10.174.62.17解决接口上的
IP 10.174.62.17 的 arp ethernet1/15 在
接口30上找到的 arp 条目在
端口30上传输数据包          

 

 

d) 当防火墙从服务器接收到下一组 SYN ACKs 的更改序列883668401 时, 它将丢弃该数据包.   这是一个预期的行为, 因为当防火墙等待 TCP 握手超时10秒 (在接收 SYN 和随后的 ack 完全建立会话之间的最大时间间隔) 时, 它会跟踪来自服务器的下一个预期序列 #边为743112263,但收到了一个包与序列883668401.   序列中的这种不匹配会导致防火墙丢弃数据包。同样所有后面的数据包与序列883668401,由平底锅除去.

 

== 2015-09-01 13:21:54.169-0400 ==
在 fastpath 阶段收到的数据包
信息: len 66 端口28接口 28 vsys 0
wqe 索引222256数据包 0x0x80000004165330e6
数据包解码转储:
L2: b4:14:89:85:4e:43->00:1b:17:00:04:1c, 类型0x0800
IP: 192.16.31.62-198.180.162.5, 协议 6
版 4, 国际人道主义法 5, tos 0x08, len 52,
id 0, frag_off 0x4000, ttl 57, 校验和 63923
TCP: 运动 80, dport 21081, 序列883668401, ack 2033466734,
预留 0, 偏移 8, 窗口 14600,校验和64069、
标志 0x0012 (SYN ACK)、紧急数据 0
TCP 选项:
00000000:02 04 05 b4 01 01   04 02 01 03 03 09..。....
流 fastpath, 会话 371381
NAT 会话, 运行地址/端口转换
2015-09-01 13:21:54.169-0400 调试: pan_tcp_reass (pan_reass: 1999): reass: 工作 0x8000000418b21780 session=371381 seqno=883668401 tcplen=0 l4plen=0 国家 1
2015-09-01 13:21:54.169-0400 调试: pan_tcp_reass (pan_reass c: 2074): reass: session=371381seqno=883668401rcv_nxt=743112263新连接
2015-09-01 13:21:54.169-0400 调试: pan_tcp_reass (pan_reass. c: 2090):序列编号在 SYN_ACK 不一致 (current+1 883668402 vs start_seq 743112263),下降
2015-09-01 13:21:54.169-0400 调试: pan_tcp_reass (pan_reass. c: 2484):
session=371381 工作0x8000000418b21780 有效载荷长度 0, tcp 数据长度0,ret 2
TCP 重组失败: ret 2
             

 

 



Actions
  • Print
  • Copy Link

    https://knowledgebase.paloaltonetworks.com/KCSArticleDetail?id=kA10g000000ClWQCA0&lang=zh_CN&refURL=http%3A%2F%2Fknowledgebase.paloaltonetworks.com%2FKCSArticleDetail

Choose Language