使用SSH跳板機上傳文件到內網的FTP服務器


最近項目的開發工作告一段落,馬上要跟其他廠商進行聯調了.

客戶提供的測試環境是在內部雲的虛擬機,總共有6台服務器,包括4台windows與2台centos.

服務器只能通過一台可以通過外網SSH訪問的堡壘機進行連接.

之前沒有用過這種方式,網上查了一下,SSH可以通過通道進行端口映射 只要把3389端口(遠程桌面RDP協議)、21端口(FTP協議)、22端口(SSH協議)建立映射就可以直接連接內部服務器進行管理。

在使用FTP服務器的時候,發現了一些問題,花了幾個小時才解決,記錄一下,為后來者戒!

1、FTP客戶端只能使用被動模式

引用百度百科的解釋:

PORT(主動)方式的連接過程是:服務器開放一個端口,通知客戶端連接,服務端接受連接,建立一條命令鏈路。
當需要傳送數據時,客戶端在命令鏈路上用 PORT命令告訴服務器:“我打開了一個1024+的隨機端口,你過來連接我”。於是服務器從20端口向客戶端的1024+隨機端口發送連接請求,建立一條數據鏈路來傳送數據。
PASV(被動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。
當需要傳送數據時,服務器在命令鏈路上用 PASV命令告訴客戶端:“我打開了一個1024+的隨機端口,你過來連接我”。於是客戶端向服務器的1024+端口發送連接請求,建立一條數據鏈路來傳送數據。

很簡單,只要想想就明白,SSH代理只能讓用戶機器單向連通目標服務器,目標服務器無法反向連接用戶機器。

2、要在FTP服務器限定PASV模式下使用端口范圍,並加入到SSH通道

使用PASV模式時,當需要傳送數據時,服務器會打開一個端口N,通過命令鏈路把端口N告訴客戶端,讓客戶端發送連接請求到端口N,創建數據鏈路來傳送數據。

那么這個FTP服務器的端口N就必須要在SSH通道中,因為客戶端與FTP服務器所有通訊都是要SSH通道代理。

所以通過SSH跳板機連接到FTP服務器的通道配置如下:

 

FTP服務器使用的FileZilla,配置PASV模式使用端口范圍,並加入防火牆入站規則

3、選擇可靠的FTP客戶端工具(吐槽一下FileZillaClient)

問題1,問題2都飛快的解決了,最后一個問題把我困了好久。

我開始FTP客戶端也是使用FileZilla,但是連接成功后一直報錯:

 1 狀態:    正在連接 127.0.0.1:9800...
 2 狀態:    連接建立,等待歡迎消息...
 3 響應:    220-FileZilla Server version 0.9.46 beta
 4 響應:    220-written by Tim Kosse (tim.kosse@filezilla-project.org)
 5 響應:    220 Please visit http://sourceforge.net/projects/filezilla/
 6 命令:    USER admin
 7 響應:    331 Password required for admin
 8 命令:    PASS ********
 9 響應:    230 Logged on
10 命令:    SYST
11 響應:    215 UNIX emulated by FileZilla
12 命令:    FEAT
13 響應:    211-Features:
14 響應:     MDTM
15 響應:     REST STREAM
16 響應:     SIZE
17 響應:     MLST type*;size*;modify*;
18 響應:     MLSD
19 響應:     UTF8
20 響應:     CLNT
21 響應:     MFMT
22 響應:    211 End
23 狀態:    已連接
24 狀態:    讀取目錄列表...
25 命令:    PWD
26 響應:    257 "/" is current directory.
27 命令:    TYPE I
28 響應:    200 Type set to I
29 命令:    PASV
30 響應:    227 Entering Passive Mode (XXX,XXX,XXX,66,38,74)
31 命令:    MLSD
32 響應:    150 Opening data channel for directory listing of "/"
33 響應:    226 Successfully transferred "/"
34 錯誤:    無法建立數據連接:ETIMEDOUT - 連接嘗試超時
35 錯誤:    讀取目錄列表失敗

想了好久都沒想明白什么問題,后來想到是不是沒有連接到正確的IP地址,因為FTP客戶端連接的地址是127.0.0.1:9800,通過SSH通道映射內網FTP服務器:21,

會不會客戶端在創建數據連接時,直接用了FTP服務器IP??

然后在設置中看到這個:FTP/被動模式:使用服務器的外部IP地址來代替 ,潛意思把這個問題給排除了,這正是噩夢的開始,反復折騰了2個小時,一直無法定位到問題所在。

 

后來換了FlashFXP,果斷成功

 

 1 [18:47:27] [R] 正在連接到 test_ftp -> IP=127.0.0.1 PORT=9800
 2 [18:47:27] [R] 已連接到 test_ftp
 3 [18:47:27] [R] 220-FileZilla Server version 0.9.46 beta
 4 [18:47:27] [R] 220-written by Tim Kosse (tim.kosse@filezilla-project.org)
 5 [18:47:27] [R] 220 Please visit http://sourceforge.net/projects/filezilla/
 6 [18:47:27] [R] USER admin
 7 [18:47:27] [R] 331 Password required for admin
 8 [18:47:27] [R] PASS (hidden)
 9 [18:47:27] [R] 230 Logged on
10 [18:47:27] [R] SYST
11 [18:47:27] [R] 215 UNIX emulated by FileZilla
12 [18:47:27] [R] FEAT
13 [18:47:27] [R] 211-Features:
14 [18:47:27] [R]  MDTM
15 [18:47:27] [R]  REST STREAM
16 [18:47:27] [R]  SIZE
17 [18:47:27] [R]  MLST type*;size*;modify*;
18 [18:47:27] [R]  MLSD
19 [18:47:27] [R]  UTF8
20 [18:47:27] [R]  CLNT
21 [18:47:27] [R]  MFMT
22 [18:47:27] [R] 211 End
23 [18:47:27] [R] CLNT FlashFXP 5.0.0.3786
24 [18:47:28] [R] 200 Don't care
25 [18:47:28] [R] OPTS UTF8 ON
26 [18:47:28] [R] 202 UTF8 mode is always enabled. No need to send this command.
27 [18:47:28] [R] PWD
28 [18:47:28] [R] 257 "/" is current directory.
29 [18:47:28] [R] PASV
30 [18:47:28] [R] 227 Entering Passive Mode (XXX,XXX,XXX,66,38,73)
31 [18:47:28] [R] 正在打開數據連接 IP: 127.0.0.1 端口: 9801
32 [18:47:28] [R] MLSD
33 [18:47:28] [R] 150 Opening data channel for directory listing of "/"
34 [18:47:28] [R] 226 Successfully transferred "/"
35 [18:47:28] [R] 列表完成: 774 字節 耗時 0.18 秒 (0.8 KB/s)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM