問題描述:瀏覽器
在阿里雲使用WINDOWS IIS搭建了FTP服務器,使用被動模式,指定了被動端口而且已經放行FTP的命令和數據端口。在實際使用時發現使用專用的FTP客戶端(如WinSCP、lftp、瀏覽器等)一切正常,當使用FTP命令時能夠登錄FTP服務器,但不能創建FTP數據鏈接,也就不能列出和傳輸數據文件。提示:ftp: connect: Resource temporarily unavailable。安全
分析:服務器
經過抓包和返回的信息發現FTP服務器返回了數據端口號和服務器IP地址,但服務器IP地址是內網IP,而非實際使用的公網IP,此時FTP客戶端會向該內網IP發起數據會話創建請求,由於路由不可達因此超時後提示ftp: connect: Resource temporarily unavailable。ide
通過測試,是因爲該FTP服務器運行在阿里雲的VPC內,而VPC默認不進行公網IP和內網IP的NAT轉換。可是專用的FTP客戶端和瀏覽器則能夠根據返回的數據包,提取出FTP數據端口號向源公網IP發起數據會話請求,因而可知,傳統的FTP命令仍是不夠「聰明」。測試
解決方法:阿里雲
IIS:
spa
在FTP服務器上手工指定公網IP便可,此時FTP服務器在返回被動模式數據端口時將返回帶有指定公網IP的套接字信息。以下:3d
vsftpd:
blog
對於Linux下的vsftpd,需添加:pasv_address=公網IP。圖片
或者關閉PASV模式的安全檢查,即:pasv_promiscuous=YES,該檢查確保數據鏈接和控制鏈接是來自同一個IP地址。當心打開此選項。此選項惟一合理的用法是存在於由安全隧道方案構成的組織中。默認值爲NO。
注意:當使用pasv_address指定公網IP時,必須將監聽的IP地址改成IPv4,即:listen=YES,不然vsftpd將返回錯誤的被動套接字,如:227 Entering Passive Mode (0,0,0,0,34,198). 。而啓用IPv4地址時則須要禁用IPv6地址的監聽,由於二者互斥。
listen=YES #指定被動模式時的公網IP地址時只能監聽在IPv4地址 listen_ipv6=NO #與listen衝突,默認監聽IPv6地址,當監聽在IPv4時IPv6必須禁用,不然vsftpd.service將沒法啓動 pasv_enable=YES pasv_min_port=8900 pasv_max_port=8909 pasv_address=47.95.120.253 #指定被動模式時的公網IP地址 #pasv_addr_resolve=YES #pasv_promiscuous=YES