被動模式下FTP不能創建數據會話問題

問題描述:瀏覽器

    在阿里雲使用WINDOWS IIS搭建了FTP服務器,使用被動模式,指定了被動端口而且已經放行FTP的命令和數據端口。在實際使用時發現使用專用的FTP客戶端(如WinSCP、lftp、瀏覽器等)一切正常,當使用FTP命令時能夠登錄FTP服務器,但不能創建FTP數據鏈接,也就不能列出和傳輸數據文件。提示:ftp: connect: Resource temporarily unavailable。安全


    圖片.png

    圖片.png


分析:服務器

    經過抓包和返回的信息發現FTP服務器返回了數據端口號和服務器IP地址,但服務器IP地址是內網IP,而非實際使用的公網IP,此時FTP客戶端會向該內網IP發起數據會話創建請求,由於路由不可達因此超時後提示ftp: connect: Resource temporarily unavailable。ide

    通過測試,是因爲該FTP服務器運行在阿里雲的VPC內,而VPC默認不進行公網IP和內網IP的NAT轉換。可是專用的FTP客戶端和瀏覽器則能夠根據返回的數據包,提取出FTP數據端口號向源公網IP發起數據會話請求,因而可知,傳統的FTP命令仍是不夠「聰明」。測試

    圖片.png



解決方法:阿里雲

    IIS:
spa

        在FTP服務器上手工指定公網IP便可,此時FTP服務器在返回被動模式數據端口時將返回帶有指定公網IP的套接字信息。以下:3d

        圖片.png

        圖片.png


    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

        圖片.png

相關文章
相關標籤/搜索