2013-09-25 35 views
1

我在EC2上運行的Python 2.6.5,我已經取代了舊FTPLIB從Python2.7,允許進口FTP_TLS較新的一個。 (15-20分鐘超時)EC2未能通過FTPS連接,但本地工作

from ftplib import FTP_TLS
ftp = FTP_TLS('host', 'username', 'password')
ftp.retrlines('LIST')

我能夠在幾秒鐘之內我的本地機器上成功運行以下三行:然而,以下對我掛斷,但它在ec2上失敗。任何想法,爲什麼這是?

謝謝。

回答

0

這聽起來像是一個問題,涉及到您的FTP連接是否處於PASSIVE模式,以及連接的兩端是否都可以支持它。

ftplib documentations表明,它是在默認情況下,這是一種恥辱,因爲我要建議你打開它。相反,我會建議你set_debuglevel在那裏你可以看到發生了協議的較低水平,看看你現在的模式。這應該給你如何進行信息。要麼你處於被動模式,而另一端無法正確處理,或者(希望)你不會,但你應該這樣做。

可以配置FTP和FTPS(但不是SFTP),以便服務器與客戶端進行實際傳輸的後向連接,或者使客戶端與服務器進行第二次轉發連接以進行傳輸。前者,尤其是涉及到網絡地址轉換時容易出現複雜情況。如果沒有TLS,一些防火牆實際上可以重寫FTP會話流量​​,以使其神奇地工作,但由於加密,TLS是不可能的。

當您嘗試傳輸數據(LIST需要第二個連接在一個方向上或另一個方向上)時,大概認證然後超時的事實是典型的症狀,通常是需要被動模式的設置,或者,這是:

像平常一樣連接到端口21,在認證之前隱式保護* FTP控制連接。保護數據連接需要用戶通過調用prot_p()方法明確要求它。

ftps.prot_p()   # switch to secure data connection 
ftps.retrlines('LIST') # list directory content securely 

我不FTPS工作的時候,因爲SFTP是少了這麼多問題,但如果你不這樣做,遠端服務器可能無法配合。

*注意,我懷疑這句話是想說,FTP_TLS「隱含保證FTP控制連接」,在對比與數據連接的明確固定。

+0

難道是服務器阻止從ec2的連接?我調用了prot_p()和set_pasv('true')。我也成功地返回了歡迎消息。正如我所提到的,我能夠在本地列出文件 - 我set_debuglevel並觀看渲染 - ec2和本地產生相同的輸出。 –

0

如果您仍然遇到問題,你可以嘗試排除亞馬遜防火牆問題。 (我你沒有使用基於主機的防火牆假設。)

如果您的EC2實例是在VPC然後在AWS管理控制檯可你:

  • 確保你有互聯網網關
  • 保證子網的EC2實例是有一個默認路由(0.0.0。0/0),配置在互聯網網關
  • 在安全組入站和出站指向允許來自所有來源(0.0.0.0/0)
  • 在網絡的ACL入站和出站流量允許所有流量從各種來源(0.0.0.0/0)

如果您的EC2實例不是在VPC然後在AWS管理控制檯可以這樣:

  • 在安全組入站允許所有來自所有來源的流量(0.0.0.0/0)

只能在測試環境中做到這一點! (顯然)

這將打開你的EC2實例,所有來自互聯網的流量。希望你會發現你的FTPS正在工作。然後,您可以逐步重新應用安全規則,直到找出問題的原因。如果它仍然無法正常工作,那麼AWS防火牆不是問題的原因(或者您有多個問題)。

相關問題