安装vsftpd
apt update
apt install vsftpd
配置vsftpd
# 在/etc/vsftpd.conf中修改,没有提到的默认即可
listen=NO
listen_ipv6=YES
# 以上两个不能同时为NO或者YES,打开了listen_ipv6也会开启ipv4的监听,所以最好选择第二个为YES
anonymous_enable=NO
#禁止匿名登录
local_enable=YES
#允许系统用户登录
write_enable=YES
#开启写权限,方便上传文件
dirmessage_enable=YES
#用户进入目录时发送反馈消息
use_localtime=YES
#使用本地时间
xferlog_enable=YES
#开启上传下载日志
connect_from_port_20=YES
#确保数据传输连接起源于20端口
修改完配置文件重启vsftpd服务:service vsftpd restart
这样应该就可以使用非root用户登录了。登录的账号和密码就是Linux系统用户的账号密码。
至于为什么root用户无法登录,是因为在安装vsftpd的时候会自动把root用户添加到限制名单中,该限制名单的位置一般在/etc/ftpusers
或者/etc/vsftpd/ftpusers
使用户登录FTP
建议不要把FTP用户用来登录系统,所以最好新建一个FTP用户
mkdir /home/ftpUser
useradd -d /home/ftpUser -s /bin/false ftpUser #使用-s 来限制用户登录系统
passwd ftpUser #设置该用户的口令
chown -R ftpUser:ftpUser /home/ftpUser #把该目录的属主更换为ftpUser,也可以不换,不过下一步就要把权限设置为777
chmod -R 755 /home/ftpUser
接下来就可以使用ftpUser来登录FTP服务,如果在输对口令的情况下显示530 Login incorrect请参考我在下文中写的处理方法。
其他问题
新建的系统用户登录失败
我是通过useradd -d /home/ftpUser -s /bin/false ftpUser
新建用户的,为了限制该用户的登录特意加了-s
选项指定其无法登录,但是直接拿这个用户来登录FTP似乎登录不成功,借鉴别人的方法是在/etc/shells文件里添加一行/bin/false
这样我就可以登录了。
使用cmd的ftp命令无法执行ls
能成功登录但是没办法进一步获取列表,一般是Windows防火墙的问题,但是不建议关闭防火墙。找到windows防火墙设置,在修改允许通过的应用里添加C:\Windows\System32\ftp.exe
再次执行就不报错了。
关于配置文件中的几个设置选项
主要说明两个比较绕的配置:chroot_list_enable
和chroot_local_user
。
按照我的理解是:
- list_user是local_user的子集,list_user是通过/etc/vsftpd/chroot_list文件手动指定的,local_user就是系统用户,即/etc/passwd中看到的用户。
- 前缀chroot的意思是锁定用户根目录,不允许登录的用户访问其他目录,所以当chroot_x_x的值是YES时就说明x_x所包含的用户只能在限制目录下活动,而当其值为NO时,他可以切到系统的任意目录。
于是有了以下四种配置组合:
- 当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd/chroot_list文件中列出的用户,可以切换到上级目录;未在文件中列出的用户,不能切换到站点根目录的上级目录。
- 当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd/chroot_list文件中列出的用户,不能切换到站点根目录的上级目录;未在文件中列出的用户,可以切换到上级目录。
- 当chroot_list_enable=NO,chroot_local_user=YES时,所有用户均不能切换到上级目录。
- 当chroot_list_enable=NO,chroot_local_user=NO时,所有用户均可以切换到上级目录。
- 当用户不允许切换到上级目录时,登录后FTP站点的根目录“/”是该FTP账户的主目录,即文件的系统的/var/ftp目录。
被动模式和主动模式
区别
以下引自优快云博客
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送FTP用户名和密码,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令,告诉服务端客户端采用主动模式并开放了端口。FTP服务器接收到PORT命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送用户名和密码进行登陆,同时会开启N+1端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P(端口P的范围是可以设置的,后面会说到这个是很重要的)进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
开启被动模式
在配置文件中添加:
pasv_enable=YES
pasv_min_port=24600
pasv_max_port=25000 #这两个端口可以根据实际情况修改
#以下是可选设置,我在公网服务器上配置被动模式会提示返回无法路由的地址,添加下面的设置就解决了
pasv_address=39.xx.xxx.65 #改成服务器的IP地址
然后重启vsftp,使用被动模式连接
SSL配置
如果以上配置都没有问题,推荐在vsftpd.conf里面打开SSL来安全传输。
ssl_enable=YES