最近项目的开发工作告一段落,马上要跟其他厂商进行联调了.
客户提供的测试环境是在内部云的虚拟机,总共有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)