FTP 可以連線但無法列出目錄內容?要先理解什麼是 Active Mode 跟 Passive Mode

什麼是主動式 FTP?

主動式 FTP 是一種使用主動模式的 FTP 連接方式。在主動模式中,FTP 客戶端主動地向 FTP 伺服器發送請求,並嘗試建立連接。主動式 FTP 連線至伺服器端的埠 21,透過伺服器端的埠 20 進行回應。因為請求是由伺服器端主動發起,你會需要允許遠端 FTP 連線至你的本地埠,這個在一些客戶端有防火牆的環境下可能會遭遇到問題。

什麼是被動式 FTP?

被動式 FTP 是一種使用被動模式的 FTP 連接方式。在被動模式中,FTP 客戶端向 FTP 伺服器發送連接請求,但是伺服器會拒絕這些請求,並回傳一個特殊的端口號,告訴客戶端連接至該端口。被動模式在某些情況下比較穩定,特別是當防火牆或 NAT 網路存在時,因為它們通常只允許連接請求通過。不同於主動式的伺服器端固定使用埠 20 進行回應,被動式 FTP 伺服器使用隨機的埠給連線回應,如此一來你會需要配置伺服器防火牆以允許來自 FTP 客戶端的連接,但並不會需要在意本地端的環境狀況,這樣的形式對於客戶端來說是比較友善的。

為什麼會需要有主動式 FTP 與被動式 FTP?

在主動模式下,伺服器端使用已經預設好的埠與客戶端進行連線;在被動模式下,客戶端與伺服器端請求可用的埠後,由客戶端再從該埠進行後續的連線。如果不存在任何防火牆,無論使用被動式或是主動式通常都不會遇到什麼問題,只是以資安考量,不太可能會存在有不使用任何防火牆設定的伺服器,因此你會需要設定防火牆開通不同的埠。由於主動式 FTP 是固定埠,可能會造成資源佔用的問題而被動式 FTP 則是會隨機分配一個伺服器端允許的埠,你可以根據你的需求選擇要使用哪一種模式。

配置 FTP 防火牆的方式因防火牆產品而異,但通常都需要您打開或轉發一些端口。這邊提供一個常見的配置方式

使用 iptable 設定防火牆允許 FTP 連線的範例

如果您正在使用 iptable 防火牆,您可以執行以下步驟來配置您的防火牆:

  1. 打開終端並輸入以下命令以獲取 root 權限:
sudo su
  1. 輸入以下命令以查看所有已配置的防火牆规则:
iptables -L
  1. 輸入以下命令以添加一条防火牆规则,允許來自 FTP 伺服器的連接請求通過:
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
  1. 輸入以下命令以保存您的防火牆规则:
/etc/init.d/iptables save
  1. 輸入以下命令以重新啟動防火牆服務:
/etc/init.d/iptables restart

在完成這些步驟後,您的防火牆應該已經配置好了,可以接受來自 FTP 伺服器的連接請求。請注意,這些步驟僅適用於 iptable 防火牆,如果您使用的是其他防火牆產品,您需要查看該產品的文檔以獲取更詳細的配置信息。

使用 Vultr 虛擬主機防火牆設定

你可以進行以下的防火牆設定分別允許 FTP 和一個被動式 FTP 可存取的區間,需確認你的 FTP 伺服器可使用的區間後再行設定開啟。

ActionProtocolPortSourceNotes
acceptTCP210.0.0.0/0允許 FTP
acceptTCP49152-655350.0.0.0/0被動式 FTP 區間
acceptTCP220.0.0.0/0允許 SFTP
Vultr 防火牆設定 FTP