1,需求和問題的產生
實踐中需要分布在各地的各個客戶端向雲端服務器上傳文件,因此在阿里雲服務器上安裝了FileZilla Server軟件作為文件FTP服務端。
客戶端程序采用FTP方式向服務端傳輸文件。由於客戶端為局域網地址,服務端無法主動訪問客戶端,因此需要設置服務端為被動模式。
但實踐發現,客戶端程序可以連接上服務端,但無法向服務端正常傳輸文件,服務端生成的文件大小為0。而服務端則出現“425 Can't open data connection for transfer”錯誤。
2,問題分析
首先懷疑是客戶端程序寫得有問題。於是,在客戶端電腦上安裝FlashFXP和WinSCP軟件,用這兩種軟件作為FTP客戶端連接FileZilla Server,測試結果表明文件傳輸正常。
因此懷疑客戶端程序有問題。但客戶端程序先后更換了INDY、ICS、CIS等多種FTP客戶端組件,其結果均不正常。
由於客戶端采用FlashFXP和WinSCP能正常傳輸文件,因此顯然與防火牆設置無關了,況且為簡化情況已將服務端和客戶端的防火牆全部禁用,360殺毒和安全衛士也關閉。
因此又懷疑是FileZilla Server設置問題,但網上查了很多資料,均不得要領。
某次打開“Passive mode settings”發現,最下方有個網址可以幫助檢查問題。
於是在客戶端電腦上點擊進去,訪問https://ftptest.net/
結果如下:
顯然是網絡配置有問題的,而且解決方案也很明確,就是第2條,必須讓“the server knows its external IP address”。這就很明確了,服務端應該配置明確的外網地址!
3,問題解決
於是在“Passive mode settings”選項中,設置明確的外網地址如下:
再次訪問https://ftptest.net/測試,hula!測試通過!
客戶端軟件上傳文件試試,也OK了!
至此,內網向阿里雲服務器FTP上傳文件的問題得到解決。
4,總結
至此還有一個疑惑未解,就是為什么服務端“Passive mode settings”選項中,未設置明確的外網地址時,FlashFXP和WinSCP軟件也能正常使用呢?
其實分析FlashFXP的日志不難發現,在FileZilla Server的被動模式下未設置明確的外網地址時,其得到的服務器地址確實是阿里雲服務器的內網地址(172,18,134,181),但軟件足夠聰明,下一步打開數據連接時將IP地址自動轉換為了外網地址(120.25.204.13),因此能連接成功。如下圖:
但普通的FTP客戶端軟件缺少這一轉換,直接使用服務器返回的內網地址去建立數據連接,顯然只能失敗。如下圖:
當FileZilla Server的被動模式下設置了明確的外網地址時,客戶端得到的是服務器的外網地址,因此數據連接能夠成功。如下圖:
總之,為了確保被動模式下FTP連接不出現“425 Can't open data connection for transfer”錯誤,應在服務端“Passive mode settings”選項中,設置明確的外網地址。