vsftpd部署流程和常见问题详解
⭐️ 网上关于在云服务器里配置vsftpd的文章鱼龙混杂,没有一篇是可以彻底解决问题的,有些问题虽简单,但也让初学者感到困惑。本文详细说明vsftpd的部署流程和一些常见问题的解决方法,详述用户创建过程,并且可以在Windows平台下直接访问vsftpd服务器,实现文件传输。——©️ Sylvan Ding
vsftpd简介
vsftpd
是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等[1]。
vsftpd 利用 chroot()
这个函式进行改换根目录的动作,使得系统工具不会被 vsftpd 这支服务所误用。上层程序中,依然使用 chroot() 的功能来限制使用者的执行权限。
环境说明
- 服务器:腾讯云服务器/轻量应用服务器
- 操作系统:Ubuntu Server 18.04.1 LTS 64bit
- vsftpd版本:version 3.0.3
安装vsftpd
ubuntu@VM-12-6-ubuntu:~$ sudo su # 切换到root
root@VM-12-6-ubuntu:/home/ubuntu apt-get install vsftpd # 安装vsftpd
root@VM-12-6-ubuntu:/home/ubuntu# vsftpd -version # 查看vsftpd版本,验证是否安装成功
⚠️ 注意:之后的操作环境都是在root权限下进行!
修改配置文件
root@VM-12-6-ubuntu:/home/ubuntu# whereis vsftpd # 查找配置文件 vsftpd.conf 路径
vsftpd: /usr/sbin/vsftpd /etc/vsftpd.chroot_list /etc/vsftpd.conf /usr/share/man/man8/vsftpd.8.gz
vim /etc/vsftpd.conf # 修改配置文件
重点关注如下参数(我们不设置匿名访问,所以和anonymous
有关的参数我们都不修改,也不做解释):
- local_enable(默认YES, 允许本地用户登陆)
- write_enable(是否允许登陆用户有写权限,需要取消该行注释,即设置
write_enable=YES
) - local_umask(屏蔽用户创建的目录/文件的初始权限)
- chroot_local_user, chroot_list_enable(将用户限制在主目录下)
local_umask
在linux系统中,创建一个新的文件或者目录的时候,这些新的文件或目录都会有默认的访问权限,umask命令与文件和目录的默认访问权限有关。若用户创建一个文件,则文件的默认访问权限为-rw-rw-rw-
,创建目录的默认权限 drwxrwxrwx
,而umask值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值[2]。
例如,用vsftpd创建一个文件夹,文件夹的权限是 777
,此时设置local_umask=077
,即使用其默认值,那么最终文件夹的权限是 700 = 777 - 077
(二进制相减),即由用户创建的文件夹仅对该用户有RWX
的权利。
Linux权限管理—基本权限
chroot
很多情况下,希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上的其他目录,这时候我就需要使用到chroot_local_user
, chroot_list_enable
, chroot_list_file
这三个选项了[3]。
- chroot_local_user 是否将所有用户限制在主目录,YES为启用 NO禁用. (该项默认值是NO,即在安装vsftpd后不做配置的话,ftp用户是可以向上切换到要目录之外的)
- chroot_list_enable 是否启动限制用户的名单 YES为启用 NO禁用(包括注释掉也为禁用)
- chroot_list_file=/etc/vsftpd.chroot_list 是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user的值.
对于chroot_local_user
与chroot_list_enable
的组合效果,可以参考下表:
chroot_local_user=YES | chroot_local_user=NO | |
---|---|---|
chroot_list_enable=YES | 1.所有用户都被限制在其主目录下 2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,不受限制 | 1.所有用户都不被限制其主目录下 2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,受到限制 |
chroot_list_enable=NO | 1.所有用户都被限制在其主目录下 2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户 | 1.所有用户都不被限制其主目录下 2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户 |
重启vsftpd让修改的配置文件生效:
/etc/init.d/vsftpd restart
设置防火墙
需要在腾讯云服务器中开放FTP服务端口(21),否则将无法连接这个端口。
创建用户
useradd -d <home_dir> <username> # 添加用户
passwd <username> # 修改密码
chown -R <username> <home_dir> # 修改家目录所有者
- -d 设定使用者的家目录为 home_dir ,即登陆后的初始目录
检查监听端口
netstat -antup | grep ftp # 检查端口是否开放
正常情况下应该返回,表明正vsftpd正监听21端口:
tcp6 0 0 :::21 :::* LISTEN 5747/vsftpd
问题解决:500 OOPS: vsftpd: refusing…
这时使用上述账户登陆ftp会报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
,这是新版vsftpd加了安全认证导致的,即如果开启了chroot 来控制用户路径,则用户不能再具有该用户根目录的写的权限。 解决方法:在配置文件/etc/vsftpd.conf
中末尾添加allow_writeable_chroot=YES
,表明允许该用户对根目录的写的权限[6]。别忘了重启vsftpd:/etc/init.d/vsftpd restart
.
禁止用户登陆
为确保创建的用户只能通过ftp访问对应的文件夹,而不能在命令行下操作系统,故需要禁止用户登陆。
usermod -s /sbin/nologin <username>
- -s 修改用户登入后所使用的shell,系统账号的shell使用
/sbin/nologin
,此时无法登录系统,即时给了密码也不行. 所谓“无法登录”,指的是仅是这个用户无法使用bash或者其他shell来登录系统而已,并不是说这个账号就无法使用系统资源[4]。
设置禁止登陆后,客户端尝试登陆 ftp,但提示vsftpd 530 Login incorrect.
此时,需要更新/etc/shells
. vsftpd 通过 pam 进行验证 shell,而 nologin 和 false 是不在 /etc/shells 中的,所以验证不能通过,自然不能登录了[5]。解决方法是在 /etc/shells
添加 nologin
即可。
问题解决:Windows访问FTP文件夹错误
使用Windows的文件系统访问FTP文件夹(MacOS在访达中连接ftp时却不会出现这样的问题):
ftp://<username>:<pwd>@<host>:21/
此时,报 FTP文件夹错误
提示。原因是Windows默认使用ftp被动模式(PASV)连接,而服务器端vsftpd使用主动模式(PORT). PORT(主动)模式模式只要开启服务器的21和20端口,而PASV(被动)模式需要开启服务器大于1024所有tcp端口和21端口。
主动模式,指的是FTP服务器“主动”去连接客户端的数据端口来传输数据,其过程具体是:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口(即tcp 21端口),紧接着客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。然后服务器会从它自己的数据端口(20)“主动”连接到客户端指定的数据端口(N+1),这样客户端就可以和ftp服务器建立数据传输通道了。被动模式,指的是FTP服务器“被动”等待客户端来连接自己的数据端口,其过程具体是:当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,向服务器提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据[7].(注意此模式下的FTP服务器不需要开启tcp 20端口了)
解决方法是通过修改配置文件,在配置文件/etc/vsftpd.conf
末尾添加:(别忘了重启/etc/init.d/vsftpd restart
)
pasv_enable=YES # 允许pasv模式
pasv_max_port=11000 # pasv使用的最大端口
pasv_min_port=10100 # pasv使用的最小端口
接着,在防火墙中开放pasv使用的端口,例如:
其他云主机可能需要设置系统内的防火墙哦~
❤️ 原创文章,转载请注明出处!©️ Sylvan Ding
参考文献
- vsftpd(百度百科)
- linux命令–umask
- vsftpd 配置:chroot_local_user与chroot_list_enable详解
- Linux中Shell——sbin/nologin的理解
- vsftpd将shell设置成为nologin后不能登录解决办法
- 500 OOPS: vsftpd: refusing to run with writable root inside chroot() 错误的解决方式
- vsftpd的主动模式与被动模式