前言:这里采用vsftpdUbuntu 18.04云服务器上搭建FTP服务,支持匿名用户、本地用户和虚拟用户三种类型。

安装vsftpd

1
$ sudo apt install vsftpd
  • 使用ps -ef | grep ftp命令查看是否开启了FTP服务进程,有如下进程表示开启成功。

  • 设置开机自启动
1
$ sudo systemctl enable vsftpd
  • 查看FTP服务状态
1
$ sudo systemctl status vsftpd.service

  • 启动/重启/停止FTP服务
1
$ sudo systemctl start/restart/stop vsftpd.service

匿名用户访问配置

  • 创建FTP存放目录
1
2
3
$ mkdir /home/ftp
$ cd /home/ftp
$ mkdir anonymous # 匿名访问目录
  • 备份vsftpd配置文件
1
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
  • 修改vsftpd配置文件
1
sudo vim /etc/vsftpd.conf

需要修改内容如下(配置匿名用户只有读权限):

1
2
3
4
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=YES
anon_root=/home/ftp/anonymous
no_anon_password=YES
  • 重启FTP服务

本地用户访问配置

  • 添加FTP用户
1
2
3
4
$ sudo mkdir /home/ftp/lyj	# 创建FTP用户家目录
$ sudo useradd -d /home/ftp/lyj -s /bin/bash ftpuser # 添加FTP用户ftpuser
$ sudo passwd ftpuser # 添加密码
$ sudo chown ftpuser:ftpuser -R /home/ftp/lyj/ # 修改目录权限

查看FTP本地用户:cat /etc/passwd | grep ftp

删除FTP用户:sudo deluser --remove-home username

  • 将新添加的ftpuser用户添加到vsftpd.chroot_list文件

这里是使ftpuser不被限制到主目录中,可以切换并访问其他目录的文件

1
2
sudo vim /etc/vsftpd.chroot_list
# 直接添加ftpuser保存即可
  • 修改vsftpd配置文件
1
sudo vim /etc/vsftpd.conf

需要修改内容如下(配置本地用户有读写权限):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=YES
anon_root=/home/ftp/anonymous
no_anon_password=YES
#
# Uncomment this to allow local users to log in.
local_enable=YES
local_root=/home/ftp/lyj
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES

# You may restrict local users to their home directories. See the FAQ for
# the possible risks in this before using chroot_local_user or
# chroot_list_enable below.
# 是否将所有用户限制在登录根目录内
chroot_local_user=YES
allow_writeable_chroot=YES
# 是否锁定用户的chroot功能
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd.chroot_list
  • 重启FTP服务

本地虚拟用户访问配置

  • 创建本地无法登录的用户及其登录目录
1
2
3
sudo sueradd guest -d /var/ftp -s /bin/nologin
sudo mkdir /var/ftp/guest
sudo chown guest:guest -R /var/ftp
  • 创建虚拟用户的文件夹
1
sudo mkdir -p /var/ftp/anonymous /var/ftp/admin /var/ftp/test
  • 创建虚拟用户统一存放配置文件的文件夹
1
sudo mkdir /etc/vsftpd
  • 创建用户数据库ftpguests
1
2
3
4
5
6
vim ftpguests
# 以下为添加内容,用户名及其密码独占一行
admin
admin_passwd
test
test_passwd
  • 生成用户数据库ftpguests.db

用到的工具为db_load,若没安装则执行sudo apt install db-util安装

1
2
sudo db_load -T -t hash -f ftpguests /etc/vsftpd/ftpguests.db
sudo chmod 600 /etc/vsftpd/ftpguests.db
  • 修改pam认证文件
1
2
sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
sudo vim /etc/pam.d/vsftpd

第一行添加如下内容:

auth sufficient pam_userdb.so db=/etc/vsftpd/ftpguests
account sufficient pam_userdb.so db=/etc/vsftpd/ftpguests

其中sufficient表示同时支持虚拟用户和本地用户

  • 建立虚拟用户的配置文件
1
vim /etc/vsftpd/admin
1
2
3
4
5
6
7
8
9
local_root=/var/ftp
# 具有读权限,查看文件夹/文件
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
# 具有写权限,新建文件夹/文件
anon_mkdir_write_enable=YES
# 具有修改权限,修改文件夹/文件
anon_other_write_enable=YES
1
vim /etc/vsftpd/test
1
2
3
4
5
6
7
8
9
local_root=/var/ftp/test
# 具有读权限,查看文件夹/文件
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
# 具有写权限,新建文件夹/文件
anon_mkdir_write_enable=YES
# 没有修改权限,不能修改文件夹/文件
anon_other_write_enable=NO
  • 修改配置文件/etc/vsftpd.conf

在上面本地用户访问配置基础上添加如下内容

1
2
3
4
5
6
# 开启虚拟用户访问
guest_enable=YES
# 把虚拟用户映射到本地用户guest
guest_usernaem=guest
# 指定虚拟用户配置文件所在目录
user_config_dir=/etc/vsftpd
  • 重启FTP服务

遇到的问题

1.使用FileZilla软件连接报错:服务器发回了不可路由的地址。使用服务器地址代替的问题

  • 修改vsftpd配置文件
1
sudo vim /etc/vsftpd.conf

添加如下内容:

1
2
3
4
5
6
7
8
9
10
11
listen=YES
listen_ipv6=NO

#开启被动模式
pasv_enable=YES
#被动模式端口范围
pasv_min_port=6000
pasv_max_port=6010
#需要加入外部ip,否则被动模式会失败
pasv_address=云服务器外部ip地址
pasv_addr_resolve=YES
  • 重启FTP服务

记得开放云服务器上对应的被动端口,否则无法访问。

2.限制本地用户在主目录后仍然能访问其他目录

这里首先介绍一下/etc/vsftpd.conf配置文件中的三个相关参数,然后根据需要可以

  • chroot_local_user

作用:是否将所有用户限制在主目录中,默认为NO表示不做限制,否则表示启用限制

  • chroot_list_enable

作用:是否启用限制用户的名单,默认为NO表示禁用,否则表示启用

  • chroot_list_file

作用:是否限制在主目录下用户名称的文件,对该文件中的用户是否限制则根据chroot_local_userchroot_list_enable确定

chroot_local_user=YES chroot_list_enable=YES 所有用户均被限制在其主目录,chroot_list_file中的用户不受限制
chroot_local_user=YES chroot_list_enable=NO 所有用户均被限制在其主目录下
chroot_local_user=NO chroot_list_enable=YES 所有用户均不被限制, chroot_list_file中的用户受到限制
chroot_local_user=NO chroot_list_enable=NO 所有用户均不被限制在其主目录下

3.报错500 OOPS: vsftpd: refusing to run with writable root inside chroot()

  • 这是由于vsftpd2.3.5之后增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限,如果检查发现还有写权限,就会报该错误。
  • 网上有两种方法分别是:(1)sudo chmod a-w /home/ftp/anonymous(用户主目录) (2)在配置文件中添加allow_writeable_choot=YES ,但是我这里只有第一种方法可行,第二种没有效果,大家若遇到可以两种方法都尝试一下

4.其他错误

  • FileZilla软件报错如下:

553 Could not create file.
错误: 严重文件传输错误

一般可能是权限不够的问题,也有可能是磁盘空间已满的原因。

可以尝试修改文件权限(777),或者修改文件所属用户

550 Failed to change directory.
错误: 读取目录列表失败

可能是权限问题,也可能是SElinuxFTP传输审核功能禁止切换目录,还可能是限制了用户对主目录的访问。

参考文章:

Ubuntu下同时搭建支持匿名、本地、虚拟用户的ftp服务器