FTP可以登入,但是無法列舉目錄

有時候我們需要在Server上進行一些FTP的傳輸,但是當我們打開命令模式下的FTP操作時,卻發現一件很詭異的事情,明明可以登入,並輸入帳號密碼,但是卻無法列舉目錄。例如你下ls或dir指令,他的畫面卡在...

150 Opening data channel for directory list

這時候有經驗的老手,可能會直接進防火牆,把ftp.exe這個程式設定成允許就好了,一般的情況下是沒問題的。但如果你是要「測試」你的伺服器的「服務」(例如:ASP.NET, PHP ...),是不是因為被防火牆擋住的關係,因此無法連線成功,那你這樣的動作就顯得毫無意義,因為你允許了ftp.exe不代表你的服務也同時被允許啊。

讓我們來複習一下FTP Active Mode的傳輸過程

  1. Client用一個亂數的Port X(例如:1024)跟Server的Port 21敲門。(所以Server的Port 21要開啟,這個Port做為Command用)
  2. Server的Port 21回應Port X,說我活著。
  3. 接下來Server自動開啟Port 20,把資料傳過去Port X+1(例如:1025)。(所以Server的Port 1025要開啟)
  4. Client持續用Port X+1回應Server Port 20,說我收到資料了,請傳下一個封包。(所以Server的Port 21要開啟,這個Port做為Data傳輸用)
  5. 就此往返最後兩項的封包傳遞...

Server的Port Mapping很明顯的就是要開20, 21,但這不是我們今天要討論的對象。上面程序的重點是,我怎麼知道Port X是幾號?沒錯,Port X是在運行時期取決於Socket空值動態決定的,不是我們在一開始就可以制定的。特別是ASP.NET或PHP等服務調用的DLL,大部份的時候底層的連線細節都不是你可以控制的。

因此我們只能針對防火牆開刀了,在這邊我們使用Windows 7來進行解說:

  1. 呼叫進階防火牆:Windows + R > cmd > wf.msc
  2. 點選:輸入規則 > 新增規則
  3. 連接埠 > TCP > 所有本機連接埠
  4. 允許連線
  5. 「網域、私人、公用」是否要全勾,請自己決定
  6. 輸入一個可視別的名稱,例如:FTP Data Port
  7. 按確定後回到進階防火牆畫面,點選你剛建立的FTP Data Port規則,選內容。
  8. 接下來的內容設定,請看下圖說明:

大功告成,請開心的連線吧!請注意,這樣的防火牆設定意味著由Port 20所發出的連線要求,你的伺服器都要吃,這將會帶來一些風險,所以請自行斟卓要不要設定。另外一條路你也可以參考看看,例如去設定服務在背景運行的身分之存取網路權限?

FTP Port FireWall Windows Server