安装ftp服务器

# 安装vsftpd
yum install -y vsftpd
# 添加用户名,用作ftp匿名访问用户
useradd ftpuser
# 给用户名设置密码
passwd ftpuser

修改ftp配置文件

yum install -y vsftpd之后,默认会在/etc/vsftpd/下有ftp的配置文件

cd /etc/vsftpd/
vim vsftpd.conf

注意
local_enable和anonymous_enable不能同时为NO,否则会报错。因为本地用户和匿名用户都不能访问,那就没有任何用户可以访问了ftp了。

账号密码访问配置

使用账号密码登录,就是使用任意ftp服务器所在的linux服务器的任意linux用户登录。登录成功后,该用户默认的ftp根目录为/home/该用户的用户名

# 允许匿名访问
anonymous_enable=NO
# 不允许本地用户访问,如root用户。默认允许
local_enable=YES
# 本地用户上传文件权限
local_umask=022
# 匿名用户上传文件权限
anon_umask=022
# 允许写入操作,否则不能上传文件
write_enable=YES
# ftp工具连接成功提示
ftpd_banner=Welcome to blah FTP service.
# 所有用户均不能切换到根目录的上级目录
chroot_local_user=YES
# 是否启动限制用户的名单。YES为启用,NO禁用。默认禁用
chroot_list_enable=NO
# /etc/vsftpd/user_list文件不生效
userlist_enable=NO
#坑,添加以下配置。不添加此项,文件无法上传。报错:550 Permission denied。新版本vsftpd加入了安全需求,切根不允许写,要添加这个配置并设置为YES才可以
allow_writeable_chroot=YES

# 开启被动模式,并且设置被动模式监听的端口访问
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=50000

使用账号密码访问如何免密读取文件

上传、重命名、删除文件/文件夹可以用账号密码登录ftp,如果读取想不需要登录ftp,可以配置ngnix来读取ftp的文件夹,注意要chmod 755 ftp根目录

nginx安装参考博客:

nginx配置文件

cd /usr/local/nginx/conf

location /img {
	alias  /home/ftpuser/;
}

匿名访问配置

# 允许匿名访问
anonymous_enable=YES
# 不允许本地用户访问,如root用户。默认允许
local_enable=NO
# 本地用户上传文件权限
local_umask=022
# 匿名用户上传文件权限
anon_umask=022
# 允许写入操作,否则不能上传文件
write_enable=YES
# 允许匿名用户上传文件,需要配合write_enable=yes
anon_upload_enable=YES
# 控制匿名用户对文件和文件夹的删除和重命名(自己添加,没有该配置)
anon_other_write_enable=YES
# 允许匿名用户创建目录
anon_mkdir_write_enable=YES
# ftp工具连接成功提示
ftpd_banner=Welcome to blah FTP service.
# 所有用户均不能切换到根目录的上级目录
chroot_local_user=YES
# 是否启动限制用户的名单。YES为启用,NO禁用。默认禁用
chroot_list_enable=NO
# /etc/vsftpd/user_list文件不生效
userlist_enable=NO
#坑,添加以下配置。不添加此项,文件无法上传。报错:550 Permission denied。新版本vsftpd加入了安全需求,切根不允许写,要添加这个配置并设置为YES才可以
allow_writeable_chroot=YES
#匿名用户的根目录,这个非常重要!
anon_root=/usr/local/ftpdir
#匿名用户不要密码就靠这个
no_anon_password=YES
# 匿名登录后的使用者
ftp_username=ftpuser

# 开启被动模式,并且设置被动模式监听的端口访问
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=50000

启动ftp服务器

注意ftp服务器默认是监听21端口的,所以要防火墙要放开21端口

# ftp服务器启动命令
systemctl start vsftpd
# 重启vsftpd服务器
systemctl restart vsftpd.service
# 最后执行查看状态,以查看重启成功了
systemctl status vsftpd.service

查询是否启动成功

Linux查询某个端口是否被占用:netstat -anp | grep 端口号
通过pid查看对应端口使用者:netstat -antup | grep pid
或者查询管道过滤:ps -ef | grep ftp

测试ftp能否正常访问

# 下载ftp工具测试连接:
yum install -y ftp
ftp localhost

# 或者cmd连接:
ftp ip地址

# 或者客户端工具filezilla连接。或者浏览器访问链接:
ftp://ip地址
# 如果需要输入密码,但是不想输入密码,就这样访问(重点)
ftp://ftpuser:ftpuser@ip地址/

云服务器搭建ftp的坑

 按找上述步骤在局域网内是没有问题的,但是在云服务器上就有坑要填。因为云服务器有一个安全组的机制,然后从这个突破口去寻找解决方案。首先将局域网的配置步骤照搬到服务器上,启动发现无论是浏览器还是filezilla客户端都访问不了
 在解决这个问题之前要了解ftp的两个工作模式:Port和Pasv。FTP连接一般会有两个连接,也就是会需要用到两个端口。一个服务器与客户端跟进行命令交互的,一个是进行数据传送的。那两种工作模式跟两个连接是怎么搭配起来工作的呢?
假设客户端为C,服务器端为S(以下简称C和S):

  • Port模式:当客户端C和服务端S连接起来后,C会发送一条命令告诉S:“我在本地打开了一个端口N等你进行数据连接”,当S收到这个Port命令后就会向C打开的那个端口N进行数据连接。S主动向C的某个端口进行数据连接,此乃主动模式
  • Pasv模式:当客户端C和服务端S连接起来后,S会发送一条命令告诉C:“我再本地打开了一个端口M你来连接我吧”,当C收到这个消息后就会向S的M端口发起数据连接。S打开端口被C主动连接,此乃被动模式

 那我们应该使用哪种工作模式呢?答案是被动(默认工作模式就是被动)。为什么?很简单,你是在局域网内,你可以连接到云服务器的某个端口(前提是这个端口放开了),但是云服务器连接不到你的
 FTP模式与数据端口:无论是哪一种工作模式,首先在建立控制连接时候操作是一样的,都是由客户端(首先随机选取一个大于1024以上的端口)和FTP服务器的控制端口21建立连接,并通过该连接传输操作指令。两种工作模式的区别是什么呢?在于使用数据传输端口(ftp-data)方式。port mode由FTP服务器指定数据传输所使用的端口,默认值为20。pasv mode由FTP客户端决定数据传输端口,客户端向服务端发出连接请求包含了数据传输端口(重要)

主动模式相关配置(了解):
port_enable=YES|NO:数据连接时取消PORT模式,默认为YES
connetc_from_port_20=YES|NO:控制以PORT模式进行数据传输时是否使用20端口,默认是NO(但实际上我用的RHL-CentOS7.6,vsftpd.conf文件中该配置设为YES,该配置生效前提是工作模式为主动的)
ftp_data_port=端口号:设置FTP数据传输端口(ftp-data)值,默认值为20。此参数也用于主动模式
port_promiscuous=YES|NO:取消PORT安全检查,该检查确保外出的数据只能连接到客户端上,默认为NO。小心打开此选项(Don’t care)

被动模式相关配置:
pasv_enable=YES|NO:允许数据传输使用PASV模式,默认为YES,且配置文件中没有该配置
pasv_min_port=端口号、pasv_max_port=端口号:设置在PASV模式下建立数据传输所用端口范围上界和下界,0表示任意,默认为0。把端口范围设在比较高的一段范围内,比如50000-60000,将有助于安全性的提高,我设置的是30000-50000,这个看你自己的啦
pasv_promiscuous=YES|NO:此选项激活时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中,默认值为NO(Don’t care)
pasv_address=ip地址:此选项为一个数字IP地址,作为PASV命令的响应,默认值为none,地址是从呼入的连接套接字(incoming connectd socket)中获取(Don’t care)
命令通道端口配置,默认为21
listen_port=21

最后一步,修改配置,使云服务器上搭建的FTP服务器可以正常使用: 也没啥要修改的,主要就是加两个配置
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=50000
打开阿里云服务器30000-50000范围端口