- Issue: SSH packet size exceeds client maxpack limit (32781 > 32768) - Impact: Large file transfer fails, file incomplete - Severity: ⭐⭐⭐⭐⭐ Critical (blocks all SFTP large file transfers) - Status: SSH server stable (no crash), but transfers incomplete Test results: - 5MB upload: 2.0MB (incomplete) - 5MB download: 0B (failed) - MD5 check: Failed Root cause: SSH server violates RFC 4254 Section 5.3 - SSH_MSG_CHANNEL_DATA packet must not exceed client maxpack - OpenSSH client maxpack: 32768 bytes Next step: Phase 4 (highest priority) - Add client_maxpack field to Channel structure - Fix SSH_FXP_READDIR: chunk file list (max 320 files per packet) - Fix SSH_FXP_DATA: chunk data (max 32KB per packet) - Add packet size validation before sending Estimated work: ~200 lines, ~1 hour
3.8 KiB
3.8 KiB
Phase 3 大文件测试报告
测试时间:2026-06-17 20:03
测试工具:OpenSSH sftp client
测试环境:MarkBaseSSH server (port 2024)
测试用户:demo (password: demo123)
⚠️ 发现严重问题:SSH packet 大小超过 client maxpack 限制
问题症状
测试 5MB 文件上传:
- ✅ SSH server 稳定运行(没有崩溃)
- ❌ 上传文件大小:2.0MB(应该是 5.0MB)
- ❌ 下载文件大小:0B
- ❌ MD5 校验失败
OpenSSH client 报告:
channel 0: rcvd big packet 32781, maxpack 32768
SSH server 日志:
[2026-06-17T12:03:32Z INFO] Building SSH_MSG_CHANNEL_DATA: channel=0, data_len=32781
[2026-06-17T12:03:32Z INFO] Sent SSH_MSG_CHANNEL_DATA (SFTP response)
根本原因分析 ⭐⭐⭐⭐⭐
问题:SSH server 发送的 packet 大小超过了 client 的 maxpack 限制(32768 bytes)
违反协议:
- RFC 4254 Section 5.3:SSH_MSG_CHANNEL_DATA packet 大小不应超过 client 的 maximum packet size
- OpenSSH channels.h:
c->local_maxpacket默认 32768 bytes
可能触发场景:
- SSH_FXP_READDIR:一次性返回太多文件信息
- SSH_FXP_DATA:一次性返回太多数据(超过 32KB)
影响 ⭐⭐⭐⭐⭐
严重性:⭐⭐⭐⭐⭐ 极高
影响范围:
- ❌ 大文件传输失败(>32KB)
- ❌ 目录浏览失败(目录包含太多文件)
- ❌ SFTP 功能受限
用户体验:
- ❌ 无法上传/下载大文件
- ❌ 无法浏览大目录
- ❌ 文件完整性无法保证
建议修复方案 ⭐⭐⭐⭐⭐
Phase 4: SSH packet size限制修复
任务 1:添加 maxpack 字段到 Channel 结构
pub struct Channel {
// ⭐⭐⭐⭐⭐ Phase 4: 添加 client maxpack 限制
client_maxpacket: u32, // 来自 SSH_MSG_CHANNEL_OPEN_CONFIRMATION
}
任务 2:SSH_FXP_READDIR 分块返回
// 限制每次返回的文件数量,确保 packet 不超过 maxpack
let max_files_per_packet = (client_maxpacket - 50) / 100; // 约 320 个文件
任务 3:SSH_FXP_DATA 分块返回
// 限制每次返回的数据大小,确保 packet 不超过 maxpack
let max_data_per_packet = client_maxpacket - 50; // 约 32KB
任务 4:SSH_MSG_CHANNEL_DATA packet 大小检查
// 在发送 SSH_MSG_CHANNEL_DATA 前,检查 packet 大小
if packet_size > client_maxpacket {
warn!("Packet size {} exceeds client maxpack {}", packet_size, client_maxpacket);
// 分块发送或拒绝
}
测试结果记录 ⚠️⚠️⚠️⚠️⚠️
| 文件大小 | 上传结果 | 下载结果 | MD5校验 | SSH server 状态 |
|---|---|---|---|---|
| 5MB | ❌ 2.0MB (不完整) | ❌ 0B | ❌ 失败 | ✅ 稳定 |
| 10MB | ⏳ 未测试 | ⏳ 未测试 | ⏳ 未测试 | ✅ 稳定 |
| 50MB | ⏳ 未测试 | ⏳ 未测试 | ⏳ 未测试 | ✅ 稳定 |
| 100MB | ⏳ 未测试 | ⏳ 未测试 | ⏳ 未测试 | ✅ 稳定 |
下一步行动 ⭐⭐⭐⭐⭐
优先级:⭐⭐⭐⭐⭐ 最高优先级
Phase 4:SSH packet size 限制修复(必须立即实施)
- 添加 client maxpack 字段
- 修复 SSH_FXP_READDIR(分块返回)
- 修复 SSH_FXP_DATA(分块返回)
- 添加 packet 大小检查机制
预计工作量:
- 代码修改:约 200 行
- 测试验证:约 30 分钟
- 总时间:约 1 小时
测试清理
# 清理测试文件
rm -f /tmp/test_5mb.bin /tmp/upload_5mb.bin /tmp/download_5mb.bin
rm -f /tmp/test_10mb.bin /tmp/test_50mb.bin /tmp/test_100mb.bin
# 停止 SSH server
pkill -9 -f "markbase-core ssh-start"
最后更新:2026-06-17 20:03
发现问题:SSH packet 大小超过 client maxpack 限制 ⭐⭐⭐⭐⭐
下一步:Phase 4 立即修复(最高优先级)