Blog

Make it work, make it right, make it fast

Sep 17, 2021 - 1 minute read - 编程

FTP详解

一、install

以Ubuntu为例:

sudo apt instal vsftpd -y

执行以下命令确认启动成功:

service vsftpd status

二、config

  • 修改默认参数
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
  • 设置FTP为被动模式,设置本地用户登录后所在目录
pasv_enable=YES
pasv_min_port=6000
pasv_max_port=7000
port_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
  • 移除登陆用户列表

如果使用root或者管理员账户登陆需要修改**/etc/ftpusers**中的禁用用户

QA

1. FTP工作原理

主动模式

  1. 客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,该tcp连接的来源地端口为客户端指定的随机端口x,目的地端口(远程端口)为服务器上的21号端口。
  2. 客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。
  3. 服务器打开20号源端口并且创建和客户端数据端口的连接。此时,来源地的端口为20,远程数据(目的地)端口为(x+1)。
  4. 客户端通过本地的数据端口创建一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经创建好了一个连接。

被动模式

在该模式下用户端进行文件传输时,会先通过客户端随机端口连接到服务器上的端口 21,并发出 PASV 命令建立命令通道,告诉服务端这次是被动模式连接。之后服务器会打开一个随机端口用于数据传输,而客户端通过与发出命令的端口不同的随机端口 B 建立数据通道,从而进行文件传输。

2.登陆成功,但是执行ls等命令的时候显示如下错误:

200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

连接建立失败的原因有以下几点:

  1. vsftpd工作在主动模式,但是客户端并没有公网IP,内网IP经过NAT转换,无法通过服务器像客户端建立连接。
  2. 客户端和服务器的防火墙(ubuntu除外)导致连接失败,关闭客户端和服务器(min-max port)防火墙。
  3. Mac使用inetutils ftp命令行工具无法传输文件(可能不支持被动模式),改用Transmit正常。

Other

如果只是简单的上传下载功能,并且对网络安全要求高,直接使用SFTP