FTP 被動模式連接埠範圍檢查工具
確認你 FTP 伺服器的被動模式連接埠範圍已經開啟,而且能穿過防火牆連上。診斷「unable to open data connection」這類錯誤時,這是不可少的一步。
什麼是被動模式?
在 FTP 被動模式(PASV)下,伺服器會為資料傳輸開啟一個隨機的高編號連接埠,並告訴用戶端要連到哪個連接埠。如果防火牆擋住這些連接埠,即使連接埠 21 上的控制連線完全正常,檔案傳輸還是會失敗。
常見的被動連接埠範圍
| 範圍 | 使用者 |
|---|---|
| 49152–65535 | IANA 動態/臨時連接埠範圍(許多伺服器的預設值) |
| 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 連線測試工具可以確認前半段:伺服器有沒有回應、接不接受你的登入。