准备
先有一台 ubuntu16.04 的服务器,并且具有 sudo 权限的 root 用户
步骤1 - 安装vsftpd
更新应用 并安装 vsftpd
sudo apt-get update
sudo apt-get install vsftpd
安装完成后,我们将复制配置文件,以便我们出现操作失误的时候将原始文件还原回来。
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
备份后我们可以配置防火墙了
步骤2 - 打开防火墙
我们先看下防火墙是否启用,并且确保 FTP 是可以被允许访问的 【不需要配置防火墙的请跳过此步骤】
sudo ufw status
默认情况下,应该只允许 SSH 通过:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
现我们添加防火墙规则在
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status
然后再看下我们现在的防火墙规则列表状态:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
990/tcp ALLOW Anywhere
20/tcp ALLOW Anywhere
21/tcp ALLOW Anywhere
40000:50000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
20/tcp (v6) ALLOW Anywhere (v6)
21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
40000:50000/tcp (v6) ALLOW Anywhere (v6)
接下来我们可以进行下一步
步骤3 - 准备用户目录
我们讲重新创建一个新的用户组以及用户,也许你已经有了用户组跟用户,但是建议使用新的来进行操作,避免不必要的问题出现
首先我们先创建一个 FTP 测试用户
sudo adduser ftpuser
提示输入用户名密码时候一直下一步确认即可
当用户被限制到特定目录时,FTP 通常更安全。vsftpd 完成这个与 chroot 监狱。当 chroot 本地用户启用时,默认情况下,它们仅限于其主目录。但是,由于 vsftpd 保护目录的方式,用户不能写入。对于只能通过 FTP 连接的新用户来说,这是可以的,但如果现有的用户也可以通过 shell 访问,则可能需要写入他们的主文件夹。
在这个例子中,而不是从主目录中删除写特权,我们将创建一个 ftp 目录作为 chroot 一个可写files目录来保存实际的文件。
创建 ftp 文件夹,设置其所有权,并确保使用以下命令删除写权限:
sudo mkdir /home/ftpuser/ftp
sudo chown nobody:nogroup /home/ftpuser/ftp
sudo chmod a-w /home/ftpuser/ftp
我们来验证权限:
sudo ls -la /home/ftpuser/ftp
结果如下:
Output
total 8
4 dr-xr-xr-x 2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x 3 ftpuser ftpuser 4096 Aug 24 21:29 ..
接下来,我们将创建可以上传文件的目录,并为用户分配所有权:
sudo mkdir /home/ftpuser/ftp/files
sudo chown ftpuser:ftpuser /home/ftpuser/ftp/files
该 files 目录上的权限检查应返回以下内容:
sudo ls -la /home/ftpuser/ftp
Output
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 ftpuser ftpuser 4096 Aug 26 13:59 ..
drwxr-xr-x 2 ftpuser ftpuser 4096 Aug 26 14:01 files
最后,创建一个 test.txt 文档稍后测试用:
echo "vsftpd test file" | sudo tee /home/ftpuser/ftp/files/test.txt
现在我们已经确保了 ftp 目录,并允许用户访问该 files 目录,我们再回到配置。
步骤4 - 配置FTP访问
我们计划允许具有本地 shell 帐户的单个用户与 FTP 连接。这两个关键设置已经设置好了vsftpd.conf。首先打开配置文件以验证您的配置中的设置是否符合以下条件:
sudo vi /etc/vsftpd.conf
注意:不熟悉 vim 命令的, 请参照 VIM命令
/etc/vsftpd.conf文件
. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .
接下来,我们需要更改文件中的一些参数。为了允许用户上传文件,我们将取消注释 write_enable 设置:
write_enable=YES
我们还将取消对 chroot 的注释,以防止FTP连接的用户访问目录树之外的任何文件或命令。
chroot_local_user=YES
我们将添加一个 user_sub_token 为了在我们的 local_root directory 路径中插入用户名,所以我们的配置将适用于此用户和任何未来可能添加的用户。【添加如下命令】
user_sub_token=$USER
local_root=/home/$USER/ftp
我们将限制可用于被动FTP的端口范围,以确保有足够的连接可用:【添加如下命令】
pasv_min_port=40000
pasv_max_port=50000
注意:我们预先打开了这里为被动端口范围设置的端口。如果更改值,请确保更新防火墙设置
由于我们仅计划允许基于个别情况的FTP访问,因此我们将设置配置,以便只有当用户明确添加到列表而不是默认情况下才可以访问用户:【取消注释】
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
userlist_deny 切换逻辑。当设置为“是”时,列表中的用户被拒绝FTP访问。当它设置为“否”时,只允许列表中的用户访问。完成更改后,保存并退出文件。
最后,我们将创建并添加我们的用户到该文件。我们将使用该 -a 标志附加到文件:
echo "ftpuser" | sudo tee -a /etc/vsftpd.userlist
仔细检查它是否按照预期添加:
cat /etc/vsftpd.userlist
Output
ftpuser
重新启动守护程序以加载配置更改:
sudo systemctl restart vsftpd
在我们准备好测试了。
步骤5 - 测试FTP访问
我们已将服务器配置为仅允许用户 ftpuser 通过FTP连接。我们来确认一下。
匿名用户无法连接:我们禁用匿名访问。这里我们将通过尝试匿名连接进行测试。如果我们做得很好,匿名用户应该被拒绝: 【IP地址请根据自己的配置IP替换】
ftp -p 192.168.1.222
Output
Connected to 192.168.1.222.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sudo_user
530 Permission denied.
ftp: Login failed.
ftp>
关闭连接:
ftp> bye
也可以通过网页链接测试 【网页下不能进行上传、新建操作】
ftp://192.168.1.222
ftp://ftpuser@192.168.1.222
根据提示输入用户名与密码即可。