自从下决心把Gen8的系统从win切换到linux以后,ubuntu20.04作为LTS版本的ubuntu各方面用起来确实还是挺稳定的,其实我的需求特别简单,只需要samba共享,qbittorrent下载,再加上个ftp服务基本就齐活了。可问题就出在这ftp上,一直搞不明白,为什么linux那么适合做服务器系统,但ftp的server端应用却非常的不友好,基本没有靠谱的能够通过GUI进行配置的ftp服务端,一直非常喜欢的filezilla居然也只有win平台独占的server端。大概在linux世界里,最流行的ftp server就是vsftpd了,然而这货的配置体验却不是很好,甚至把我Gen8搞挂了...

搁置了很久以后,昨天终于还是伸着懒腰逼自己要把系统搞好,各种忙活,把系统重新装好了(因为在sata5的位置拓展了一块SSD,所以整个装系统和引导的过程特别艰辛),今天继续研究,终于把vsftpd算是比较完善的搞好了,也差不多能实现各种权限控制了,为了方便以后折腾,这里把经验记录一下。

首先直接apt安装vsftpd就可以了,这一步非常简单。重要的是配置文件的修改。sudo vim /etc/vsftpd.conf修改配置文件。

listen=NO                 //是否开启监听ipv4和ipv6数据,这个开了会有奇怪的报错,我是没开      
listen_ipv6=YES          //是否开启监听ipv6数据

# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO      //是否允许匿名登陆,无需密码

# Uncomment this to allow local users to log in.
local_enable=YES        //是否允许本地用户登录

# Uncomment this to enable any form of FTP write command.
write_enable=YES        //是否允许登陆者上传文件,这个是全局参数,不开就没办法上传文件

# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022         //设置本地用户默认要减免的权限

# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES       //目录消息,能够给远程登陆的用户发送目录
#
# If enabled, vsftpd will display directory listings with the time
# in  your  local  time  zone.  The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
use_localtime=YES           //服务器所展示的目录将随着本地时间而改变
#
# Activate logging of uploads/downloads.
xferlog_enable=YES          //开启上传下载的日志记录
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES    //确认连接传输的端口号为20

# You may override where the log file goes if you like. The default is shown
# below.
xferlog_file=/var/log/vsftpd.log    //日志文件存放位置
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=YES          //日志文件采用标准格式


# You may fully customise the login banner string:
ftpd_banner=Welcome to FTP service.  //在使用shell时登陆那么会发送欢迎语


# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
chroot_local_user=YES        //对本地用户是否实施限制,这个开了只允许用户访问自己的主目录,无法越级向上访问,一定要开
chroot_list_enable=YES       //开启限制白名单
# (default follows)         
chroot_list_file=/etc/vsftpd.chroot_list        //白名单路径,这个文件需要自己创建

# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty
#
# This string is the name of the PAM service vsftpd will use.
# pam_service_name=vsftpd
pam_service_name=ftp            //此处ubuntu的系统需要改为ftp

# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO                 

#
# Uncomment this to indicate that vsftpd use a utf8 filesystem.
utf8_filesystem=YES         //编码统一为utf8编码,可以识别中文,防止乱码
user_config_dir=/etc/vsftpd_user_conf      //这句加上可以对用户进行单独的权限控制,后面会提到
allow_writeable_chroot=YES     //这句一定要加,不然开启chroot以后如果根目录的权限是777就会报错

配置文件修改好以后接着就是进行用户和权限的设置,这一步也非常关键。需要用上的命令一并写在下面

sudo groupadd ftpusers     //创建ftpusers用户组
sudo useradd -d 用户的家目录路径 用户名    //通过这个命令创建本地用户并指定该用户的家目录路径,这个路径以后就是该用户的ftp根目录
usermod -G ftpusers 用户名    //将这个新用户加入到ftpusers用户组中
sudo passwd 用户名      //更改密码
usermod -s /sbin/nologin username     //限制用户登录方式;限制用户username只能通过ftp登陆,而不能直接登陆服务器

创建完用户以后,还要将该用户加入vsftpd.chroot_list白名单中,这样才允许访问。

mkdir /etc/vsftpd.chroot_list
vim vsftpd.chroot_list

文件内容如下

#白名单
用户名1
用户名2
用户名3

还记得刚刚在配置文件里加的user_config_dir=/etc/vsftpd_user_conf这句吗,这句话是来精确控制每个用户能够使用的ftp命令的,也就是ftp权限,需要在/etc/vsftpd_user_conf目录里头创建和用户名同名的文件,比如smith,编辑内容如下

local_root=/home/user/smith
#这个是我之前创建smith这个用户时给他指定的家目录
cmds_allowed=ABOR,CWD,LIST,MDTM,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,SIZE,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
#这里是你给他设的权限,我这里给的权限符合上头所说的要求,可以上传下载,但不能删除文件,也不能创建文件夹

如果我想给一个用户完整的权限呢,比如我想让naturennn既可以上传下载,又可以删除文件和创建文件夹,那么我可以编辑文件naturennn(当然是/etc/vsfpd_user_conf目录下)为如下内容

local_root=/home/user/naturennn
cmds_allowed=ABOR,CWD,LIST,DELE,RMD,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,RNFR,RNTO,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

至于每个命令是什么意思,如果需要再精确的进行控制,可以个别的查一下。

最后用systemctl restart vsftpd重启vsftpd服务就可以了。

对了,最后再多说一句关于权限的问题,如果这样操作还是遇到了目录不可读写的问题,可以尝试将该目录的权限设置成777,用chmod 777 目录即可,也可以尝试改变用户的属权,用chown -R 用户名 目录路径来尝试更改。

Last modification:May 29, 2021
If you think my article is useful to you, please feel free to appreciate