FTP 简介
FTP(File Transfer Protocol):即文件传输协议,是一种在网络中进行文件传输而被广泛使用的标准协议。基于 FTP 协议的软件实现常采用 C/S 架构,即提供服务的服务器端与进行访问的客户端。
在各类 FTP 软件中,通常有两种工作模式(这两类工作模式都是相对于服务器端来说的,而不是客户端):
- 主动模式(有时也称为 PORT) – 服务器端从特定的端口主动向客户端发起数据连接
- 被动模式(有时也称为 PASV) – 由客户端发起数据连接,对于服务器端而言即被动模式
FTP 的主动模式如下图所示:
说明如下:
- 21 端口(也称控制端口或命令端口)用来建立连接,连接的目的是完成身份验证和命令交互
- 随机端口指的是 1024 以上的端口
PORT
命令会把客户端的随机端口号告诉服务器端- 20 端口(也称为数据端口)用来传输数据
FTP 的被动模式如下图所示:
说明如下:
- 21 端口(也称控制端口或命令端口)用来建立连接,连接的目的是完成身份验证和命令交互
PASV
命令的作用是通知服务器进入到被动模式- 随机端口指的是 1024 以上的端口
Q:主动模式和被动模式哪个更加好一些?
从工作量考虑,被动模式更加好一些。如果是主动模式,服务器通过 20 端口主动发起数据连接,那么客户端的软件防火墙可能会屏蔽相应的端口(这种防火墙一般考虑的是入站规则),导致文件传输失败,外加客户端数量非常多时,需要花费非常多的时间去解决与排查。如果采用被动模式,虽然客户端与服务器端都是高位的随机端口,但服务器端的随机端口容易控制,可在配置文件中将随机端口的范围缩小,排错时对于管理员的工作量而言会非常小。
FTP客户端常用命令
help
– 获取帮助get
– 下载文件,你在哪个位置登录的 ftp,就下载在 Windows 的那个位置mget
– 下载一批文件put
– 上传mput
– 上传一批文件pwd
– 文件路径位置(服务器)cd
– 切换 ftp 服务器的目录exit
或quit
– 退出lcd
– 切换本地的工作目录
需要注意!Windows 的命令行客户端原生不支持对目录的上传与下载,若您需要此功能,请使用图形化的 FTP 客户端(如 FileZilla)
vsftpd 简述
vsftpd(有时也称 vsftp):基于 FTP 协议而实现的其中一个软件。这里的 d 即 Daemon (Disk And Execution MONitor),是 GNU/Linux 当中守护进程的意思。
安装 vsftpd 也是非常简单:
Shell > dnf install -y vsftpd
释放出的文件说明:
- /etc/vsftpd/vsftpd.conf – 主配置文件
-
/etc/vsftpd/ftpusers 和 /etc/vsftpd/user_list – 用户控制列表文件(黑名单文件)。只要把相应用户名写入到这两个文件当中,这些用户即被禁止登录。但是 /etc/vsftpd/user_list 这个文件可以通过修改配置文件的方式转变成为白名单文件,即把相应用户写入到该白名单文件中,这些用户才被允许登录。默认情况下,这两个文件的文件内容是一样的:
Shell > cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
Q:有些人看到这两个文件,问为什么 root 是被默认禁止登录的?
FTP 登录验证的过程是明文的,也就是说用户名与密码是不会经过加密的,一旦截获到了数据包,可以直接看到明文的密码,非常地不安全,这也是为什么要禁止 root 的原因。我们可以使用 tcpdump
命令监听网卡的 21 端口就可以截获到明文密码,后面会演示。
Q:当 ftpusers 是黑名单且 user_list 是白名单时,如果把同一个用户都写入进去,这个用户是能访问还是不能访问?
不能访问,因为黑名单的优先级更高,白名单相对较低。
用户划分
vsftpd 中的用户被划分为三类:
- 匿名用户 – 即 anonymous 或 ftp 用户,两个用户的密码都为空。
- 本地用户 – 使用 GNU/Linux 操作系统的用户和密码来作为 vsftpd 的用户名和密码,一旦截获到用户名的密码,不仅可以登录 vsftpd,还可以登录到 GNU/Linux 操作系统,这样会带来一些安全隐患。
- 虚拟用户 – 管理员自定义的模拟用户。虚拟用户可以单独添加,对应地密码也是独立的,即使截获到明文的密码,也和 GNU/Linux 操作系统没有太大的关系。
/etc/vsftpd/vsftpd.conf 说明
默认的文件内容如下:
Shell > grep -v -E "^#|^$" /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
anonymous_enable=NO
– 是否开启匿名用户locale_enable=YES
– 是否开启本地用户write_enable=YES
– 本地用户是否允许上传local_umask=022
– 本地用户上传的 umask 值,默认为022,则目录的权限是755(777-022=755),文件权限是644(666-022=644)dirmessage_enable=YES
– 用户登陆成功后是否显示欢迎消息或者警告消息xferlog_enable=YES
– 是否开启 vsftpd 的日志connect_from_port_20=YES
– 主动模式下是否开启相应的 20 端口进行数据传输xferlog_std_format=YES
– 是否使用标准的 FTP 日志格式。ftpd_banner=Welcome to blah FTP service.
– 注释项,登录之后的欢迎消息listen=NO
– 是否对相应的端口(默认 21)进行监听,不能和listen_ipv6
一起使用。建议修改为 YESpam_service_name=vsftpd
– PAM 策略文件的名称定义,位于 /etc/pam.d/ 目录下userlist_enable=YES
– 是否开启黑名单
还有一些其他的配置项:
listen_address=192.168.100.20
– 设置监听的 IP 地址listen_port=21
– 设置监听 ftp 服务的端口号,不建议更改监听的端口download_enable=YES
– 是否允许下载,默认为YESmax_clients=0
– 限制并发客户端连接数max_per_ip=0
– 限制同一 ip 地址的并发连接数
被动模式相关:
pasv_enable=YES
– 是否开启被动模式。pasv_min_port=24500
– 被动模式最小随机端口pasv_max_port=24600
– 被动模式最大随机端口
安全配置相关:
accept_timeout=60
– 被动模式的连接超时时间connect_timeout=60
– 主动模式的连接超时时间。idle_session_timeout=600
– 600秒内没有任何操作则断开连接date_connection_timeout=500
– 超过500秒内没有传输完成,则断开连接。有时 ftp 文件传输的数据较大,那么这一项参数的值需要改大。
抓取 vsftpd 的明文密码
配置文件默认情况下就允许本地用户访问,因此 vsftpd 的配置文件不做任何修改。
# 添加新的本地用户并更改其密码
Shell > useradd ftpuser
Shell > passwd ftpuser
Shell > id ftpuser
uid=1000(ftpuser) gid=1000(ftpuser) groups=1000(ftpuser)
Shell > systemctl start vsftpd.serice
# 客户端登录成功后则会显示这些
## 从输出信息可以看到,登录的用户为 ftpuser,密码为 Google338922549
## -i 表示监听哪个网卡,-X 表示将抓取的数据包解析为十六进制以及 ASCII 字符
Shell > tcpdump -i ens160 -nnX port 21
...
20:41:25.012258 IP 192.168.100.3.3991 > 192.168.100.20.21: Flags [P.], seq 15:29, ack 47, win 8146, length 14: FTP: USER ftpuser
...
20:41:30.564118 IP 192.168.100.3.3991 > 192.168.100.20.21: Flags [P.], seq 29:51, ack 81, win 8112, length 22: FTP: PASS Google338922549
...
20:41:30.632124 IP 192.168.100.20.21 > 192.168.100.3.3991: Flags [P.], seq 81:104, ack 51, win 229, length 23: FTP: 230 Login successful.
...
客户端使用 Windows 的 PowerShell:
PS E:\> ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): ftpuser
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp>
这也解释了为什么默认的黑名单文件 /etc/vsftpd/ftpusers 和 /etc/vsftpd/user_list 需要禁止 root 用户登录的原因。
匿名用户访问
修改配置文件,依次是开启监听、删除 listen_ipv6 配置项、开启匿名用户、关闭本地用户、去掉注释添加另外两个匿名用户的配置项
Shell > sed -i -r '/^(listen=)/s/NO/YES/g' /etc/vsftpd/vsftpd.conf
Shell > sed -i -r '/^(listen_ipv6)/d' /etc/vsftpd/vsftpd.conf
Shell > sed -i -r '/^(anonymous_enable)/s/NO/YES/g' /etc/vsftpd/vsftpd.conf
Shell > sed -i -r '/^(local_enable)/s/YES/NO/g' /etc/vsftpd/vsftpd.conf
Shell > sed -i -r '/^(#anon_upload)/s/(#)//g' /etc/vsftpd/vsftpd.conf
Shell > sed -i -r '/^(#anon_mkdir)/s/(#)//g' /etc/vsftpd/vsftpd.conf
Shell > grep -v -E "^#|^$" /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
Shell > systemctl restart vsftpd.service
匿名用户的 FTP 根目录为 "/var/ftp/",根下面还有一个 pub 目录,您可以将您的数据放入到该目录下,还需要注意 vsftpd 的服务权限以及文件权限,两者同时配置正确才能生效。
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
pub
226 Directory send OK.
ftp: 收到 8 字节,用时 0.00秒 8000.00千字节/秒。
ftp> pwd
257 "/" is the current directory
ftp>
假设我需要从 pub 目录中下载文件:
# 先在该目录下创建测试文件
Shell > echo "success" >> /var/ftp/pub/ftp_test_file
ftp> cd pub
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
ftp_test_file
226 Directory send OK.
ftp: 收到 18 字节,用时 0.00秒 18000.00千字节/秒。
# 将该文件下载在我当前的 E 盘上
ftp> get ftp_test_file
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for ftp_test_file (8 bytes).
226 Transfer complete.
ftp: 收到 8 字节,用时 0.00秒 8000.00千字节/秒。
ftp> quit
221 Goodbye.
PS > ls .\ftp_test_file
Directory: E:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2025/4/18 21:29 8 ftp_test_file
假设我需要将 E:\vsftp.md 文件上传到 /var/ftp/pub/ 目录中:
PS > cd E:\
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): FTP
331 Please specify the password.
密码:
230 Login successful.
ftp> cd pub
250 Directory successfully changed.
ftp> put vsftp.md
200 PORT command successful. Consider using PASV.
553 Could not create file.
Q:明明开启了匿名用户的上传,为什么上传还是失败了?
答案很简单,文件权限不正确:
Shell > ls -l /var/ftp/
total 4
drwxr-xr-x 3 root root 4096 Apr 18 21:40 pub
pub 目录的所有者和所属组都是 root ,其他人的权限为 r-x,没有 w 权限所有不能上传,变更所属组并赋予 w 权限即可:
Shell > chown root:ftp /var/ftp/pub/
Shell > chmod g+w /var/ftp/pub/
Shell > ls -l /var/ftp/
total 4
drwxrwxr-x 3 root ftp 4096 Apr 18 21:52 pub
再次尝试,成功上传:
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp> cd pub
250 Directory successfully changed.
ftp> put vsftp.md
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 16 字节,用时 0.04秒 0.41千字节/秒。
创建目录同样需要服务权限(anon_mkdir_write_enable=YES
)与文件权限(w 权限)都配置正确:
ftp> mkdir crea-dir
257 "/pub/crea-dir" created
本地用户访问
对配置文件做一些修改,最终生效的配置项如下:
Shell > grep -v -E "^#|^$" /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
本地用户的基本配置项即:
local_enable=YES
write_enable=YES
local_umask=022
默认情况下,vsftpd 本地用户登录成功后所在的初始目录为用户自身的家目录且被允许切换到操作系统的根,这会有安全隐患。
还是拿上面的添加的 ftpuser 用户来说明:
PS > cd E:\
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): ftpuser
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> pwd
257 "/home/ftpuser" is the current directory
ftp> cd /
250 Directory successfully changed.
ftp> pwd
257 "/" is the current directory
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
bin
boot
dev
docker
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
226 Directory send OK.
ftp: 收到 127 字节,用时 0.00秒 63.50千字节/秒。
ftp>
演示下载与上传,没有任何问题:
Shell > echo "fail" >> /home/ftpuser/ftpuser-file
PS > cd E:\
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): ftpuser
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
ftpuser-file
226 Directory send OK.
ftp: 收到 17 字节,用时 0.00秒 17.00千字节/秒。
ftp> get ftpuser-file
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for ftpuser-file (5 bytes).
226 Transfer complete.
ftp: 收到 5 字节,用时 0.00秒 5000.00千字节/秒。
ftp> put vsftp.md
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 16 字节,用时 0.02秒 0.94千字节/秒。
本地用户除了基本的配置项外,还有:
local_root=/vsftpd/ftp
– 定义所有本地用户的默认初始目录,全局生效。同样需要注意文件权限。local_max_rate=300
– 限制本地用户的文件传输的最大速度,单位 KB/s-
chroot_local_user=YES
– 开启本地用户的目录切换限制,YES 表示不允许切换到操作系统的根。vsftpd 中若添加了该配置项,使用客户端登录会出现诸如 "500 OOPS: vsftpd: refusing to run with writable root inside chroot()
远程主机关闭连接。" 的错误,vsftpd 认为在开启了目录切换限制后若初始登录目录拥有 w 权限会非常不安全(普通用户的家目录权限为 700),于是会出现这种错误提示不让用户登录成功,在这种情况下您还需要添加allow_writeable_chroot=YES
参数项Shell > ls -ld /home/ftpuser/ drwx------ 2 ftpuser ftpuser 4096 Apr 19 09:19 /home/ftpuser/ Shell > sed -i -r '/^(#chroot_local_user)/s/(#)//g' /etc/vsftpd/vsftpd.conf Shell > sed -i -r '/^(chroot_local_user)/aallow_writeable_chroot=YES' /etc/vsftpd/vsftpd.conf Shell > grep -v -E "^#|^$" /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES chroot_local_user=YES allow_writeable_chroot=YES listen=YES pam_service_name=vsftpd userlist_enable=YES Shell > systemctl restart vsftpd.service PS > cd E:\ PS > ftp 192.168.100.20 连接到 192.168.100.20。 220 (vsFTPd 3.0.3) 200 Always in UTF8 mode. 用户(192.168.100.20:(none)): ftpuser 331 Please specify the password. 密码: 230 Login successful. ftp> pwd 257 "/" is the current directory
还可以不同本地用户区别对待,开启这三个配置项:
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
写入到 /etc/vsftpd/chroot_list 文件中的用户可以访问任何目录,而其他用户则被限制在家目录或者指定的目录中。
用户访问控制
指的是 /etc/vsftpd/ftpusers 和 /etc/vsftpd/user_list 这两个文件,/etc/vsftpd/user_list 可通过修改配置文件变更为白名单文件。
相关配置项:
userlist_enable=YES
– 开启用户访问控制userlist_deny=YES
– 默认值为 YES ,表示 /etc/vsftpd/user_list 是黑名单;如果值为 NO,表示 /etc/vsftpd/user_list 是白名单userlist_file=/etc/vsftpd/user_list
– 指定访问控制的文件
虚拟用户
虚拟用户更加灵活,可以做到让每一个虚拟用户拥有单独的配置文件、单独的主目录、单独的访问权限。
步骤如下:
- 添加虚拟用户口令文件
- 生成虚拟用户口令认证文件
- 编辑 vsftpd 的 PAM 策略文件
- 建立本地映射用户且设置家目录权限
- 修改配置文件
- 关闭匿名用户,调整匿名用户权限并重启 vsftpd
- 使用虚拟用户测试上传与下载
第一步:添加虚拟用户口令文件。该文件可以存放在 GNU/Linux 的任意位置,其文件内容要求一行用户名一行密码,以此类推。比如 /etc/vsftpd/viuser.txt 文件:
Shell > vim /etc/vsftpd/viuser.txt
vutest
33892468
zhang
952468
第二步:生成虚拟用户口令认证文件。需要使用 db_load
命令
# -T 表示将文本加载到数据库中,-t hash 表示指定算法,-f 指定文件
## viuser.db 是一个二进制文件
Shell > db_load -T -t hash -f /etc/vsftpd/viuser.txt /etc/vsftpd/viuser.db
第三步:编辑 vsftpd 的 PAM 策略文件
Shell > vim /etc/pam.d/vsftpd
#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/viuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/viuser
第四步:建立本地映射用户且设置家目录权限。比如 useradd -d /home/vftproot -s /sbin/nologin vuser
,虚拟用户 vutest 和 zhang 在 GNU/Linux 看来都统一映射为 vuser 用户。注意!vuser 用户不需要设置密码,因为它本身只是映射用户。
# 设置家目录权限为 555 ,如果不设置,虚拟用户登录时会出现 "vsftpd: refusing to run with writable root inside chroot()" 错误
## 也允许设置成 755 ,但您还需要添加 `chroot_local_user=YES` 和 `allow_writeable_chroot=YES` 这两个参数项,虚拟用户最终可实现在根目录上上传文件
Shell > chmod 755 /home/vftproot/
这个家目录即所有虚拟用户登陆成功后默认上传的位置,当然你也可以给每一个虚拟用户单独指定上传位置,后面再说。
第五步:修改配置文件,添加以下参数项:
guest_enable=YES
– 开启虚拟用户guest_username=vuser
vsftpd 虚拟用户对应的系统用户,即第四步添加的用户pam_server_name=vsftpd
– 默认存在,不需要修改
第六步:关闭匿名用户,调整匿名用户权限并重启 vsftpd
Shell > vim /etc/vsftpd/vsftpd.conf
...
anonymous_enable=NO
...
anon_upload_enable=YES
...
anon_mkdir_write_enable=YES
...
anon_other_write_enable=YES
...
Shell > grep -v -E "^#|^$" /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
guest_enable=YES
guest_username=vuser
Shell > systemctl restart vsftpd.service
第七步:使用虚拟用户测试上传与下载
Shell > echo "hello" > /home/vftproot/file1.txt
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): vutest
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/" is the current directory
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
file1.txt
226 Directory send OK.
ftp: 收到 14 字节,用时 0.00秒 14000.00千字节/秒。
ftp> get file1.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for file1.txt (6 bytes).
226 Transfer complete.
ftp: 收到 6 字节,用时 0.00秒 6000.00千字节/秒。
ftp> put vsftp.md
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 16 字节,用时 0.00秒 16000.00千字节/秒。
注意事项:
- 模拟用户能够登陆,是因为在 GNU/Linux 操作系统中有对应的映射用户,所以在配置文件当中 必须 打开本地用户登陆(
local_enable=YES
)。 - 模拟用户的权限是拿匿名用户的权限进行管理(如上面的第六步)。
- 模拟用户默认的登录位置即映射用户的家目录,若添加了
local_root
参数,则模拟用户的登录位置为该参数定义的路径。
虚拟用户除了上面的使用场景外,我们还可以根据实际情况为每个虚拟用户建立自己的配置文件以及单独定义权限。
先将这三个配置项注释掉:
Shell > sed -i -r '/^(anon_upload_enable)/s/anon/# anon/g' /etc/vsftpd/vsftpd.conf
Shell > sed -i -r '/^(anon_mkdir_write_enable)/s/anon/# anon/g' /etc/vsftpd/vsftpd.conf
Shell > sed -i -r '/^(anon_other_write_enable)/s/anon/# anon/g' /etc/vsftpd/vsftpd.conf
创建存放虚拟用户配置文件的目录并在主配置文件中加入 user_config_dir 参数项:
# 创建存放虚拟用户配置文件的目录,目录名称的定义没有要求
## 在该目录下,虚拟用户的配置文件名称与虚拟用户的名称需要相同
Shell > mkdir /etc/vsftpd/viusers_dir
Shell > vim /etc/vsftpd/vsftpd.conf
....
user_config_dir=/etc/vsftpd/viusers_dir
单独配置文件的内容(比如 vutest 这个虚拟用户):
Shell > touch /etc/vsftpd/viusers_dir/vutest
# 自定义虚拟用户的专属登录目录并拥有上传权限
Shell > vim /etc/vsftpd/viusers_dir/vutest
local_root=/tmp/vutest_d
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
Shell > mkdir /tmp/vutest_d
# 所有者和所属组变更为映射用户
Shell > chown vuser:vuser /tmp/vutest_d/
Shell > systemctl restart vsftpd.service
最终效果说明:
- 禁止了匿名用户登陆(anonymous_enable=NO);
- 禁止了本地用户正常登陆,因为注释掉了 /etc/pam.d/vsftpd 里的内容;
- 允许虚拟用户登陆,因为
guest_enable=YES
、guest_username=vuser
、pam_server_name=vsftpd
; - vutest 的上传位置为 /tmp/vutest_d,允许下载、上传、建立目录,因为该虚拟用户有专属的配置文件;
- zhang 的上传位置为本地映射用户 vuser 的家目录(即 /home/vftproot),能查看、下载,但不能上传(因为那三个参数注释掉了)。
如下操作:
Shell > echo "world!" >> /tmp/vutest_d/a-file.txt
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): vutest
331 Please specify the password.
密码:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
a-file.txt
226 Directory send OK.
ftp: 收到 15 字节,用时 0.00秒 15000.00千字节/秒。
ftp> pwd
257 "/" is the current directory
ftp> put vsftp.md
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 16 字节,用时 0.00秒 16000.00千字节/秒。
Shell > rm -rf /home/vftproot/*
Shell > echo "Account" > /home/vftproot/file2.txt
PS > ftp 192.168.100.20
连接到 192.168.100.20。
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
用户(192.168.100.20:(none)): zhang
331 Please specify the password.
密码:
230 Login successful.
ftp> pwd
257 "/" is the current directory
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
file2.txt
226 Directory send OK.
ftp: 收到 14 字节,用时 0.00秒 14000.00千字节/秒。
ftp> get file2.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for file2.txt (8 bytes).
226 Transfer complete.
ftp: 收到 8 字节,用时 0.00秒 8000.00千字节/秒。
ftp> put vsftp.md
200 PORT command successful. Consider using PASV.
550 Permission denied.
