相關資料:
先說結論:用端口轉發無法解決ftp客戶端與服務器的連接問題,原因是ftp的data端口不固定,不能把所有>1024的端口都做端口轉發
有如下三台機器:
1. ftp服務器 F (ftp)
2. 端口轉發用的跳板機 J (jump)
3. 客戶端 C (client)
其中,C要請求F的數據,但C無法連接F,F可以連接C,我們無法控制F,但可以控制J和C。J與F,C都可以連接,故作為中間跳板。
在C上建立端口轉發,C的2221端口映射F的21端口,即映射FTP的CMD端口
ssh -g -f -N -L 2221:<A>:21 username@<B> -22
注意:這里必須有-g 即開放轉發給所有ip使用。
原因:如果沒有-g,則C會監聽 127.0.0.1:2221,如果訪問<C>:2221則會被拒絕,而后面進行步驟⑦時會ftp的data通道會試圖連接127.0.0.1上的端口,導致錯誤。
使用-g后,就可以訪問<C>:2221了
在建立端口轉發后,采用主動模式的ftp連接過程如下圖所示:

①ftp客戶端像轉發端口2221請求建立cmd連接
②<C>:2221 通過 <J>:22 轉發請求
③<J>:22向ftp的cmd端口發送請求
④ftp的cmd端口響應<J>:22
⑤跳板返回響應
⑥<C>:2221返回響應 至此ftp的命令通道連接成功
⑦出問題的是在這一步,建立data通道時,ftp服務器企圖繞過J,直接與C連接。這是不可以的。
原因:
ftp實際上是與J建立了cmd連接,此時J告知ftp直接連接C,ftp發現cmd和data通道連接不同的ip自然會拒絕。
所以主動模式是行不通的。那看被動模式:
采用被動模式時,⑦的方向反過來了。需要C的data端口訪問F的data端口,但C的data端口不固定,所有>1024的都有可能,數量過大,不能都建立轉發。
所以,被動模式也是不行的.......
至此:得到結論,當ftp客戶端與服務器無法互聯時,無法通過端口轉發來解決。
