首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

FTP 傳輸文件大小為 0 字節?McAfee 防火牆阻攔數據連接通道排查實錄

     編輯:Java 綜合教學

現象:FTP 上傳成功但文件為空

使用 FTPClient 上傳文件到 FTP Server,其他機器正常,唯獨本機生成 0 字節文件。經排查為 McAfee 防火牆攔截 FTP 數據連接端口 導致。

根因分析:FTP 雙通道機制

  • 命令通道(控制連接):默認端口 21,用於發送指令(USER, PASS, PUT, RETR 等)
  • 數據通道:傳輸文件內容/列表,端口動態協商
    • 主動模式:Server 主動連接 Client 的高位端口(易被 Client 端防火牆攔截)
    • 被動模式:Client 連接 Server 開放的高位端口(易被 Server 端防火牆攔截)

本案例中,Client 端 McAfee 防火牆阻擋了主動模式下 Server 回連的數據端口,導致命令握手成功但數據無法傳輸,生成 0 字節佔位文件。

解決方案:防火牆放行規則配置

McAfee 端點安全 典型放行步驟

  1. 打開 McAfee 端點安全控制台 → 防火牆 → 規則
  2. 新增規則:允許 / 出站/入站 / TCP / 本地/遠程端口 21(命令通道)
  3. 關鍵:新增規則 允許 / 入站 / TCP / 本地端口範圍 1024-65535(主動模式數據通道)
    或配置 FTP Server 被動模式端口範圍並在 Client 放行對應出站端口
  4. 應用規則並重試上傳

代碼層面的預防措施

FTPClient ftp = new FTPClient();
ftp.connect(host, port);
ftp.login(user, pass);
ftp.enterLocalPassiveMode(); // 強制被動模式,減少 Client 端防火牆干擾
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setBufferSize(1024 * 1024); // 1MB 緩衝區

// 上傳前檢查
if (!ftp.storeFile(remotePath, inputStream)) {
    throw new IOException("FTP上傳失敗: " + ftp.getReplyString());
}
// 上傳後驗證
long remoteSize = ftp.getFileSize(remotePath);
if (remoteSize != localFile.length()) {
    throw new IOException("文件大小不一致,疑似傳輸中斷");
}

排查檢查清單

檢查點命令/操作正常特徵
命令通道連通telnet ftp.host 21返回 220 歡迎信息
數據通道連通主動模式:Client netstat -an 看 LISTEN 端口
被動模式:Server 防火牆放行 PASV 端口範圍
數據傳輸時建立 ESTABLISHED 連接
防火牆日誌McAfee 日誌查看被阻擋的 TCP 連接無 FTP 相關阻擋記錄
殺毒軟件掃描實時掃描可能鎖定臨時文件排除 FTP 臨時目錄

最佳實踐總結

  1. 生產環境強制使用被動模式,配合 Server 端固定 PASV 端口範圍
  2. Client/Server 雙端防火牆均需放行對應端口範圍
  3. 上傳後必須驗證文件大小/校驗和,防止靜默截斷
  4. 排查網絡問題優先用 tcpdump/Wireshark 抓包分析 FTP 協議交互

FTP 看似簡單,實則「雙通道、動態端口、防火牆敏感」三重坑疊加。遇到 0 字節文件,第一反應應是數據通道被阻斷,而非代碼邏輯錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved