FTP 被動模式連接埠範圍檢查工具

確認你 FTP 伺服器的被動模式連接埠範圍已經開啟,而且能穿過防火牆連上。診斷「unable to open data connection」這類錯誤時,這是不可少的一步。

預設範圍:

什麼是被動模式?

在 FTP 被動模式(PASV)下,伺服器會為資料傳輸開啟一個隨機的高編號連接埠,並告訴用戶端要連到哪個連接埠。如果防火牆擋住這些連接埠,即使連接埠 21 上的控制連線完全正常,檔案傳輸還是會失敗。

連接埠 21 上的控制連線能穿過防火牆,但連到連接埠 50000 的第二條資料連線被擋住了;伺服器的 227 回應把這個連接埠表示為 195 x 256 + 80
失敗的不是控制連線,而 227 回應會告訴你該開哪個連接埠。

常見的被動連接埠範圍

範圍 使用者
49152–65535IANA 動態/臨時連接埠範圍(許多伺服器的預設值)
40000–40100常見的自訂範圍(cPanel、Plesk)
30000–31000常見的自訂範圍(FileZilla Server 預設值)

主動模式與被動模式的差異

FTP 會用到兩條連線:一條是連接埠 21 上用來傳送指令的控制連線,另一條是每次傳輸檔案或列出目錄時另外建立的資料連線。模式決定的是:第二條連線由哪一端開啟。

主動模式(PORT) 被動模式(PASV)
由誰開啟資料連線伺服器(反過來連回用戶端)用戶端(連到伺服器)
用戶端送出的指令附上自己位址與連接埠的 PORT(或 EPRT)PASV(或 EPSV)
必須能連到的地方用戶端這邊的連接埠(家用路由器和公司防火牆會擋)伺服器的被動連接埠範圍
誰在用Windows 內建的 ftp.exe、舊的腳本幾乎所有現代用戶端(預設)

被動模式只需要用戶端往外建立連線,所以在 NAT 後面也能運作,現代用戶端也因此預設使用它。代價轉移到伺服器那邊:伺服器的防火牆必須在整個被動範圍內放行用戶端,而不只是連接埠 21。

如何解讀 227 回應

伺服器會用六個數字回應 PASV,例如 227 Entering Passive Mode (203,0,113,10,195,80)。前四個是要連線的 IP 位址,後兩個是連接埠:195 x 256 + 80 = 50000。常出問題的地方有兩個:

  • 連接埠落在防火牆允許的範圍之外。把伺服器的被動範圍設成你開放的範圍,或者開放伺服器實際使用的範圍。
  • 位址是私人 IP,例如 192.168.1.10,因為伺服器在 NAT 後面,送出的是內部位址。這時用戶端每次列出目錄都會卡住。請用下方的設定告訴伺服器它的公開位址;有些用戶端會改用伺服器本身的位址來繞過問題,但真正該修的是伺服器。

使用 EPSV 時,回應是 229 Entering Extended Passive Mode (|||50000|):只有連接埠、沒有位址,所以不會有私人位址的問題。不過連接埠一樣必須開啟。

在常見伺服器上設定被動範圍

  • vsftpd:在 vsftpd.conf 裡設定 pasv_min_port=40000、pasv_max_port=40100,伺服器在 NAT 後面時,再把 pasv_address 設成公開 IP。
  • ProFTPD:設定 PassivePorts 40000 40100,並用 MasqueradeAddress 指定公開位址。
  • Pure-FTPd:設定 PassivePortRange 40000 40100 和 ForcePassiveIP。
  • FileZilla Server:它的被動模式設定可以指定自訂的連接埠範圍,以及要回報的公開 IP。
  • IIS:在伺服器層級的「FTP 防火牆支援」(FTP Firewall Support)中,設定資料通道連接埠範圍和防火牆的外部 IP 位址。新的範圍可能要重新啟動 FTP 服務才會生效。

接著,在伺服器前方的每一處(作業系統防火牆、雲端安全性群組、路由器的連接埠轉送)都開放同一段 TCP 範圍,再用上面的工具檢查其中幾個連接埠。

如何解讀結果

開啟表示從網際網路連到該連接埠的 TCP 連線被接受了,路上沒有東西擋住。沒有回應通常表示防火牆默默丟棄了這次連線嘗試。關閉表示有東西以拒絕作為回應,多半就是伺服器本身,因為許多 FTP 伺服器只會在用戶端送出 PASV 之後的短短一瞬間,在被動連接埠上等待連線。

所以,在沒有傳輸的伺服器上,範圍內的連接埠顯示關閉是正常的;整個範圍都沒有回應,才是真正的警訊。最終的確認方式,是用真正的用戶端在被動模式下列出目錄:如果登入成功、列目錄時卻卡住,被擋住的就是資料連線。FTP 連線測試工具可以確認前半段:伺服器有沒有回應、接不接受你的登入。