使用 apt-get 安装 [vsftpd]:
sudo apt-get install vsftpd -y
vsftpd 是在 Linux 上被广泛使用的 FTP 服务器,根据其官网介绍,它可能是 UNIX-like 系统下最安全和快速的 FTP 服务器软件。
安装完成后 VSFTPD 会自动启动,通过 netstat 命令可以看到系统已经[监听了 21 端口]:
sudo netstat -nltp | grep 21
如果没有启动,可以手动开启 VSFTPD 服务:
sudo systemctl start vsftpd.service
FTP 协议默认使用 21 端口作为服务端口
sudo mkdir /home/uftp
执行完后,在这里 /home/uftp [?] 就能看到新建的文件夹 uftp 了。
创建登录欢迎文件 [?]:
sudo touch /home/uftp/welcome.txt
方便用户登录后可以看到欢迎信息,并且确定用户确实登录到了主目录上。
用户的主目录是用户通过 FTP 登录后看到的根目录
创建一个用户 uftp [?]:
sudo useradd -d /home/uftp -s /bin/bash uftp
为用户 uftp 设置密码 [?]:
sudo passwd uftp
删除掉 pam.d 中 vsftpd,因为该配置文件会导致使用用户名登录 ftp 失败:
sudo rm /etc/pam.d/vsftpd
为了方便后面的实验步骤,不建议使用其它的用户名
请记住设置的密码以用于后续步骤
限制用户 uftp 只能通过 FTP 访问服务器,而不能直接登录服务器:
sudo usermod -s /sbin/nologin uftp
sudo chmod a+w /etc/vsftpd.conf
修改 /etc/vsftpd.conf 文件中的配置(直接将如下配置添加到配置文件最下方):
# 限制用户对主目录以外目录访问
chroot_local_user=YES
# 指定一个 userlist 存放允许访问 ftp 的用户列表
userlist_deny=NO
userlist_enable=YES
# 记录允许访问 ftp 用户列表
userlist_file=/etc/vsftpd.user_list
# 不配置可能导致莫名的530问题
seccomp_sandbox=NO
# 允许文件上传
write_enable=YES
# 使用utf8编码
utf8_filesystem=YES
新建文件 /etc/vsftpd.user_list,用于存放允许访问 ftp 的用户:
sudo touch /etc/vsftpd.user_list
sudo chmod a+w /etc/vsftpd.user_list
修改 /etc/vsftpd.user_list ,加入刚刚创建的用户:
示例代码:/etc/vsftpd.user_list
uftp
设置主目录访问权限(只读):
sudo chmod a-w /home/uftp
新建公共目录,并设置权限(读写):
sudo mkdir /home/uftp/public && sudo chmod 777 -R /home/uftp/public
重启vsftpd 服务:
sudo systemctl restart vsftpd.service
FTP 服务已安装并配置完成,下面我们来使用该 FTP 服务
根据您个人的工作环境,选择一种方式来访问已经搭建的 FTP 服务
通过 FTP 客户端工具访问
FTP 客户端工具众多,下面推荐两个常用的:
FileZilla - 跨平台的 FTP 客户端,支持 Windows 和 Mac
WinSCP - Windows 下的 FTP 和 SFTP 连接客户端
下载和安装 FTP 客户端后,使用下面的凭据进行连接即可:
[主机]:
<您的 CVM IP 地址>
用户:
uftp
输入密码后,如果能够正常连接,那么大功告成,您可以开始使用属于您自己的 FTP 服务器了!
接下来,请上传任意一张图片到您的 FTP 服务器上的 uftp 的 public 目录下,然后,就可以在/home/uftp/public 中看到了。
通过 Windows 资源管理器访问
Windows 用户可以复制下面的[链接]到资源管理器的地址栏访问:
ftp://uftp:你的密码@<您的 CVM IP 地址>
如果您申请了域名,可以将Ip 地址替换为对应的域名作为访问凭据
如果您申请了域名,可以将链接中的 Ip 地址替换为对应的域名访问 FTP 服务
恭喜!您已经成功完成了搭建 FTP 服务器的实验任务。
如果vsftp是部署在阿里云上,无法在windows资源管理器上打开,这是阿里云的网络环境引起的。这里需要理解下ftp的被动模式,被动模式下,客户端请求ftp服务器后,ftp服务器告诉客户端获取数据的地址和端口,但是阿里云服务上的网卡都是内网地址。参考:https://blog.csdn.net/ridicuturing/article/details/80308053
所以完成上面的部署后,我们需要再修改,最后配置内容:
#以下三项要修改,关闭ipv6,指定外网IP,未测试配置之后内网是否可以说访问
listen=YES
listen_ipv6=NO
pasv_address=47.52.234.212
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
#配置被动模式端口
pasv_enable=YES
pasv_min_port=9000
pasv_max_port=9045
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
chroot_local_user=YES
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
seccomp_sandbox=NO
write_enable=YES
utf8_filesystem=YES
ps: pasv_address 此选项为一个数字IP地址,作为PASV命令的响应。默认值为none,即地址是从呼入的连接套接字(incoming connectd socket)中获取。
pasv_min_port=port number
pasv_max_port=port number
设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意。默认值为0。把端口范围设在比较高的一段范围内,比如50000-60000,将有助于安全性的提高。显示阿里云服务是不可能让它随意安排端口,必需指定使用我为它开放的端口如9000~9045
在通过以上配置,客户端可以登录uftp账号连接ftp,但是这种账号是使用了系统账号,这是一种并不安全的方案,虽然我们禁了uftp通过ssh2连接系统。更安全的做法是配置虚拟ftp用户,这里虚拟ftp用户可以是基于文件,也可以基于数据库,这里介绍基于文件的虚拟用户,基于数据的虚拟用户配置参考:https://blog.csdn.net/qq_18863573/article/details/52296554
https://blog.csdn.net/u010257920/article/details/52435250
1.创建一个文本文件,将用户名密码逐行填写到里面,如:
sudo mkdir /etc/vsftp
cd /etc/vsftp
sudo touch loguser.txt
sudo vim loguser.txt
将用户名、密码一行一行地填写,比如创建两个用户名和密码相同的teacher和student,那么,loguser.txt的内容是:
teacher
teacher
student
student
2.根据loguser.txt文件创建虚拟用户数据库:
sudo apt-get install db-util
sudo db_load -T -t hash -f loguser.txt /etc/vsftp/vsftpd_login.db
3.赋予虚拟用户数据库文件合适的权限:
sudo chmod 600 vsftpd_login.db
4.创建新的vsftpd认证配置文件:
sudo touch /etc/pam.d/vsftpd.vu
sudo vim /etc/pam.d/vsftpd.vu
配置刚才生成的数据库文件
auth sufficient pam_userdb.so db=/etc/vsftp/vsftpd_login
account sufficient pam_userdb.so db=/etc/vsftp/vsftpd_login
5.修改vsftpd配置文件,内容如下(可以将原来的备份,就只配置如下的配置,注意pasv_address对应云服务器外网IP):
listen=YES
listen_ipv6=NO
pasv_address=47.52.234.212
anonymous_enable=YES
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
pasv_enable=YES
pasv_min_port=9000
pasv_max_port=9045
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd.vu
chroot_local_user=YES
# 不配置可能导致莫名的530问题
seccomp_sandbox=NO
write_enable=YES
utf8_filesystem=YES
allow_writeable_chroot=YES
guest_enable=YES
guest_username=uftp
user_config_dir=/etc/vsftp/vsftpd_user_conf
#新建的目录 权限是755,文件的权限是 644
umask = 022
anon_umask=022
banner_file=/home/uftp/welcome.txt
6.创建虚拟用户配置目录,并为用户teacher,student创建配置文件:
sudo touch teacher
sudo touch student
指定teacher工作目录并配置可写权限,teacher配置:
local_root=/home/uftp/teacher
anon_world_readable_only=NO
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
指定student与teacher用户相同工作目录,但只有读的权限,student配置:
local_root=/home/uftp/teacher
anon_world_readable_only=NO
7.创建teacher和students的工作目录,并修改目录所属用户和用户组:
sudo mkdir /home/uftp/teacher
sudo chown uftp:uftp /home/uftp/teacher
8.重启vsftud:
sudo mkdir /home/uftp/teacher
sudo chown uftp:uftp /home/uftp/teacher
大功告成!