ftp 並不是用單一 port 連線的協定, 所以... 不是只有把 port 21 轉入就可以 (這個只用來傳送指令).
server 選擇用 passive 連線, 上頭設定 ip 為 192.168.0.4, port 6610-6650. 就表示要傳送檔案或檔案列表時, server 會送出的回應跟 client 說使用 ip 為 192.168.0.4, port 為 6610-6650 其中一個來傳送. 這時 client 就會用那個 ip 與 port 再連回 server.
所以... 你的問題就來了. 解決方法通常有兩種: 1. router 是不是知道這是一個 ftp 連線的回應, 自動把這個 ip 轉成外部的 ip (外面才會連的到), 並把 port 轉成任何一個可用的 port, 然後再內外之間做一個對應連結. (如果是用 linux 的 netfilter 做的, 會有個 ftp 的模組要載入才可以) 2. 如果 router 不會做上面那個轉換與對應.... 那就只能 server 這邊處理. 就是 passive 那邊把 ip 設成你真的外部 ip (或者第一個或第三個選項也可以, 通常應該會抓到外部 ip), 然後在 router 上頭的那個 dmz 設定, 除了 port 21 外, 也要把 port 6610-6650 都轉入.