PASV FTP 對於 wget/ftp 失敗,但適用於 curl/lftp
我有一台執行 Centos 7 和 vsftpd-3.0.3 的伺服器(從原始碼安裝以獲得最新版本,儘管我描述的所有內容也適用於之前安裝的 vsftpd-3.0.2 版本)。
vsftpd 配置為使用設置為 10100-10500 範圍的被動埠,防火牆允許所有必要的埠。伺服器位於一些我無法控制的路由/NATing 後面,但似乎工作正常。
從 Fedora 30 機器遠端連接:
$ curl ftp://ftp.domain.com #works - 顯示目錄列表
$ wget <ftp://ftp.domain.com> # 失敗
==> PASV ... couldn't connect to 10.xx.xx.xx port 45027: Connection refused
$ lftp ftp.domain.com # 有效 - 使用匿名登錄,’ls’ 返回目錄列表
$ ftp ftp.domain.com # 失敗 - 使用匿名登錄和 ’ls 返回
ftp> ls 227 Entering Passive Mode (10,xx,xx,xx,176,231). ftp: connect: Connection refused
由於 curl 和 lftp 工作,我不明白它如何成為伺服器設置,但我不知道為什麼 wget 和 ftp 不起作用。
…防火牆允許所有必要的埠。
這表明伺服器和客戶端不在同一個網路中。我猜伺服器在某個內部網路中,而客戶端在網際網路上的某個地方。
227 進入被動模式 (10,xx,xx,xx,176,231)。
伺服器提供了一個私有的不可路由地址(即 10.xx.xx.xx)作為客戶端應該連接的目標。鑑於上述假設客戶端位於 Internet 上的其他位置,這種連接是不可能的。
當 FTP 伺服器位於內部網路中的某些防火牆後面時,這實際上是一個典型的錯誤。由於它是如此典型,因此一些客戶端通過忽略伺服器提供的 IP 地址來解決此問題,只使用埠並將其與它們用於 FTP 控制連接的 IP 地址結合起來。其他客戶無法解決它。
無論如何-伺服器設置是罪魁禍首,應該修復。如何做到這一點取決於特定的伺服器,但對於 proftp 有一個
MasqueradeAddress
設置,並且對於其他一些 FTP 伺服器也有類似的設置。另請參閱防火牆後的 ProFTPd 伺服器返回內部 IP 地址。