一、安装
sudo apt install vsftpd
卸载
sudo apt purge vsftpd
查看版本
vsftpd -v
二、修改服务配置文件
对于ftp的登录目录需要先设置777权限
sudo chmod 777 /home/myftp -R
创建用户(用户名为myftp,与后面vsftpd配置文件对应),也可以直接使用当前登录用户:
sudo useradd -m myftp -d /home/myftp
若不想让该用户登录系统
sudo useradd -m myftp -d /home/myftp -s /bin/bash/nologin
设置用户密码:
sudo passwd myftp
/etc目录下的配置文件vsftpd.conf,整体配置文件结构及部分解释
listen=YES
#listen_ipv6=YES #使用IPV6和上面的listen只能开一个不然启动会报错
anonymous_enable=NO #不允许匿名访问
local_enable=YES #允许本地用户登录
write_enable=YES #允许FTP写入
local_umask=022 #新建文件夹或文件的权限默认为077,大多数ftp服务器设置为022
#anon_upload_enable=YES #不允许匿名用户上传文件
#anon_mkdir_write_enable=YES #不允许匿名用户新建目录
dirmessage_enable=YES #进入目录时向远程用户发送消息
use_localtime=YES #显示带有时间的目录列表
xferlog_enable=YES #激活上传/下载的日志记录
connect_from_port_20=YES #确保ftp传输端口号为20
#chown_uploads=YES #可将上传的匿名文件由指定用户拥有
#chown_username=whoever
xferlog_file=/var/log/vsftpd.log #日志文件路径,也可以直接使用默认路径
xferlog_std_format=YES #使用标准化格式的日志文件
#idle_session_timeout=600 #空闲会话超时的默认值
#data_connection_timeout=120 #数据连接超时的默认值
#Nopriv_user= ftpsecure #创建唯一的用户,将该用户用作完全隔离且无特权的用户
#async_abor_enable=YES #识别异步abor请求,可能会拒绝一些老的FTP客户端的连接
#ascii_upload_enable=YES #设置ASCII上传下载
#ascii_download_enable=YES
ftpd_banner=Welcome to blah FTP service. #登录欢迎语
#deny_email_enable=YES #拒绝匿名email地址的文件,防止攻击
#banned_email_file=/etc/vsftpd.banned_emails
#chroot_local_user=YES #将本地用户限制在主目录中
local_root=/home/myftp #设置主目录
chroot_local_user=YES #限制用户权限,默认情况下,为了防止安全漏洞,启用chroot后,如果用户锁定的目录可写,则vsftpd将拒绝上传文件。
allow_writeable_chroot=YES #如果必须将用户的可写访问权限授予其主目录,请使用此选项
chroot_list_enable=YES #chroot_local_user和chroot_list_enable都为YES的时候/etc/vsftpd.chroot_list中的用户可以不受限制访问任务目录
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd.chroot_list #允许访问的用户列表文件
#ls_recurse_enable=YES #激活ls -r选项
secure_chroot_dir=/var/run/vsftpd/empty #空目录名称
pam_service_name=vsftpd #用户认证的PAM文件位置/etc/pam.d/vsftpd.vu)
#rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem #ssl的RSA证书位置
#rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key #ssl的RSA秘钥位置
#ssl_enable=NO #开启ssl加密
#utf8_filesystem=YES #使用utf8文件系统
pasv_min_port=30000 #passive模式的时候随机端口范围最小端口
pasv_max_port=31000 #passive模式的时候随机端口范围最大端口
userlist_enable=YES #要仅允许某些用户登录FTP服务器,将用户名添加到/etc/vsftpd.user_list文件(每行一个用户)来明确指定哪些用户可以登录。
userlist_file=/etc/vsftpd.user_list #要仅允许某些用户登录FTP服务器,将用户名添加到/etc/vsftpd.user_list文件(每行一个用户)来明确指定哪些用户可以登录。
userlist_deny=NO #要仅允许某些用户登录FTP服务器,将用户名添加到/etc/vsftpd.user_list文件(每行一个用户)来明确指定哪些用户可以登录。
local_root=/home/myftp
//该目录为之前创建的ftp目录
chroot_local_user和chroot_list_enable详解
在vsftpd.user_list
中设置允许访问的用户
一般不建议这么设置,因为这样就意味着这个用户不受主目录限制,可以随便访问其他地方
创建文件vsftpd.chroot_list
sudo vi /etc/vsftpd.chroot_list
并将之前创建的用户名(myftp)添加到该文件中。
三、重启命令和添加开机启动
#启动服务
sudo service vsftpd start
#重启服务
sudo service vsftpd restart
#停止服务
sudo service vsftpd stop
开机启动
sudo systemctl enable vsftpd
遇到的问题
windows的cmd连接上后敲命令显示这个
200 PORT command successful. Consider using PASV.
这是因为电脑连接无线网络,属性设置为“公用”导致,修改为“专用”,重新ftp连接恢复正常
ftp启动失败
service vsftpd status查看状态(code=exited, status=2)
主要原因:ipV4和ipV6不能同时被监听,这边需要去掉一个监听设置,常规情况下只要去掉ipV6得就可以了。
使用windows本地文件夹访问时,提示FTP文件夹错误,227 Entering Passive Mode…
查询相关资料,这是由于FTP的主动模式和被动模式导致的。解决方法为:
打开浏览器->工具 ->Internet 选项 -> 高级->取消使用被动FTP的勾选->应用->确定。
按照上述步骤部署完之后,到chrome中去访问目标地址发现无法访问现场以及原因
demo
但是到文件中直接访问是ok的
在cmd中登录也是ok的
可以直接ftp 192.168.56.101
登录ftp
如果登录超时之后可以open 192.168.56.101
例如下图中就是连接超时之后重新open
后续我查看了service vsftpd status的状态,里面有登录的日志,发现浏览器一直以匿名方式在访问,而匿名方式访问又被我们禁止掉了,所以浏览器才访问不到
不过我想来想去还是没想到原因.后来停了大佬的建议,应该是权限问题,具体哪个权限引发的问题我还是不知道
我新建了一个用户,顺便把ftp的那个local_root的目录权限改成这个用户下
sudo useradd -d /home/ubuntu/app/downloads -g ftp -s /sbin/nologin myftp
sudo passwd myftp
然后重启了下vsftp
sudo service vsftpd restart
然后就一切ok了
浏览器也能访问了…迷幻
当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加下列两项中的一项:
allow_writeable_chroot=YES
然后在实际使用过程中发现连接的时候没问题,但是一上传文件就time out 最后关了防火墙就ok了......这个是真坑....
这个是为什么呢,我后面理解了一下,原因是连接的时候是通过21端口和ftp服务端进行连接的,我的防火墙是开启了21和20端口的通信的所以连接是ok的,但是一般我们采用的是passive模式去连接,也就是ftp服务端随机开一个端口给客户端去连接,要是这个端口不在防火墙的允许端口范围内,这个时候就会time out.所以我给ftp服务端随机开的端口限定了范围,然后在防火墙允许这个范围的端口通信,一切就ok了.
/etc/vsftpd.conf
配置文件中
pasv_min_port=30000
pasv_max_port=31000
sudo ufw allow 30000:31000/tcp
FTP一般使用2个端口,一个是命令端口(默认为21),一个为数据端口(默认为20)。
两种模式介绍:
- 主动模式:FTP客户端向FTP服务器端的21端口请求,FTP客户端告知FTP服务器端自己的端口是多少,FTP服务器端的20端口会连接FTP客户端的端口并进行数据传输。
- 被动模式:FTP客户端向FTP服务器端的21请求,告知自己是被动模式,FTP服务器打开数据端口并告知FTP客户端,FTP客户端连接该FTP服务器数据端口并进行数据传输。
主动模式的缺点:当FTP客户端通过NAT接入公网时,因为防火墙或端口映射原因,FTP服务器端无法直接连接FTP客户端的端口。此时可以通过被动模式来实现数据的传输
参考了一位大佬的博客
https://www.myfreax.com/how-to-setup-ftp-server-with-vsftpd-on-ubuntu-18-04/