如果使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个 Socket 来连接这个端口,然后我们可根据操作来发送命令,数据会通过新开的一个端口传输。
如果使用主动模式,通常客户端会发送一个端口号给服务器端,并在这个端口监听。服务器需要连接到客户端开启的这个数据端口,并进行数据的传输。
下面对 FTP 的主动模式和被动模式做一个简单的介绍。
FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。
被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。
第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口 (P > 1024 ),返回如“227 entering passive mode (127,0,0,1,4,18)”。 它返回了 227 开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘256 再加上最后一个数字,这就是 FTP 服务器开放的用来进行数据传输的端口。如得到 227 entering passive mode(h1,h2,h3,h4,p1,p2),那么端口号是 p1*256+p2,ip 地址为h1.h2.h3.h4。这意味着在服务器上有一个端口被开放。客户端收到命令取得端口号之后, 会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。
操作系统
FTP软件
FTP软件版本
FTP服务器
Windows XP
Serv-U
版本15.0.1.20
FTP客户端
Windows XP
FileZilla
版本3.8.0
FTP服务器安装在公司内网的电脑上,FTP客户端在外网的电脑上(严格来说也是在另一外局域网内)。
这就是我遇到的第一个弯路,折腾了很久才知道。虽然数据端口是随机的,但Serv-U可以指定随机的范围。打开Serv-U管理控制台 > 管理服务器 > 服务器限制和设置 > 服务器设置 。在“设置”选项卡里找到“PASV端口范围”,如下图所示,在这里就可以指定随见的范围了。你只要把这些端口映射到路由器就可以了。
图表 1 PASV 端口范围
当然别忘了,还有一个命令端口也得映射。
状态: 正在连接 125.89.123.99:13000…
状态: 连接建立,等待欢迎消息…
响应: 220 Serv-U FTP Server v15.0 ready…
命令: USER zhangsan
响应: 331 User name okay, need password.
命令: PASS *
响应: 230 User logged in, proceed.
命令: CLNT FileZilla
响应: 200 Noted.
命令: OPTS UTF8 ON
响应: 200 OPTS UTF8 is set to ON.
命令: OPTS MLST type;size;modify;perm;
响应: 200 MLST OPTS Type;Size;Modify;Perm;
状态: 已连接
状态: 读取目录列表…
命令: PWD
响应: 257 “/” is current directory.
命令: TYPE I
响应: 200 Type set to I.
命令: PASV
响应: 227 Entering Passive Mode (100,100,100,100,50,203)
命令: MLSD
响应: 150 Opening BINARY mode data connection for MLSD.
错误: 连接超时
错误: 读取目录列表失败
也是经过一阵折腾,最后突然发现服务器对PASV指令的响应是:227Entering Passive Mode (100,100,100,100,50,203),这里100.100.100.100是FTP服务器在内网IP,客户端自然连接不上。打开Serv-U管理控制台 > 你自定义的域名 > 域详细信息 > 监听器 > 编辑 ,在PASV IP地址或域名中设置公网IP即可。 如下图所示。
转载:https://blog.csdn.net/benkaoya/article/details/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213816.html原文链接:https://javaforall.net
