ftp的主动模式和被动模式

断鸿 2019年07月15日 77次浏览

[toc]

相比于HTTP,FTP协议要复杂,FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。 PORT(主动)

(1) PORT(主动模式)

​ PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:

image-20190723205401311

(2) PASV(被动模式)

​ PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:

image-20190723205448908

# wget下载ftp文件默认为被动方式
[root@localhost ~]#wget ftp://user:passwd@192.168.10.1/test.pem
--2015-12-09 15:55:24--  ftp://user:passwd@192.168.10.1/test.pem
           => `test.pem'
Connecting to 192.168.10.1:21... connected.
Logging in as admin ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /test ... done.
==> SIZE test.pem ... 272
==> PASV ...
Retrying.
# wget指定为主动方式下载

[root@localhost ~]#wget --no-passive-ftp ftp://user:passwd@192.168.10.1/test.pem
--2015-12-09 15:55:24--  ftp://user:passwd@192.168.10.1/test.pem
           => `test.pem'
Connecting to 192.168.10.1:21... connected.
Logging in as admin ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /test ... done.
==> SIZE test.pem ... 272
==> PORT ... done.    ==> RETR test.pem ... done.
Length: 272 (unauthoritative)
100%[=================================================================================================================================================================>] 272         --.-K/s   in 0.002s

阿里云使用Vsftpd配置ftp服务器的一个坑

云主机的公网ip并不是分配到网卡上的,做了NAT转换,所以ftp被动模式返回的数据传输地址是云主机内网的ip和端口,这时候客户端拿到的地址是无法访问机器的。访问服务器可能会没响应,具体情况为登录成功,但是list目录和文件的时候卡住。

可以通过配置解决:

  • pasv_address=公网ip
  • pasv_addr_resolve=YES

image-20190723211740670