第11章 使用 vsftpd 服务传输文件
章节简述
本章首先介绍了什么是文件传输协议(File Transfer Protocol,FTP),以及如何部署 vsftpd 服务程序,接着深入剖析了 vsftpd 主配置文件中最常用的参数及其作用,并详细演示了 vsftpd 服务程序两种认证模式(匿名开放模式和本地用户模式)的配置方法。
通过本章的实战内容,读者可以进一步练习 SELinux 服务的配置方法,掌握简单文件传输协议(Trivial File Transfer Protocol,TFTP)的理论及配置方法,同时学习刘遄老师在服务部署和故障排除方面的宝贵经验与技巧,以便灵活应对生产环境中可能遇到的各种问题。
11.1 文件传输协议
一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式。今天的互联网由海量的个人计算机、工作站、服务器、小型机、大型机、巨型机等不同型号和架构的物理设备共同组成。即便是个人计算机,也可能运行 Windows、Linux、UNIX、macOS 等不同的操作系统。为了在如此复杂多样的设备之间实现文件传输, 文件传输协议(FTP)应运而生。
FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20 和21 号端口,其中端口 20 用于进行数据传输,端口 21 用于接受客户端发出的 FTP 命令与参数。FTP 服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且一些 FTP 客户端工具还支持文件的多点下载以及断点续传技术,因此受到广大用户的青睐。FTP 的传输拓扑如图 11-1 所示。
图11-1 FTP协议的传输拓扑
FTP 服务器是按照 FTP 在互联网上提供文件存储和访问服务的主机,FTP 客户端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP 有下面两种工作模式。
主动模式:FTP 服务器主动向客户端发起连接请求。
被动模式:FTP 服务器等待客户端发起连接请求(默认工作模式)。
第 8 章在学习防火墙服务配置时曾经讲过,防火墙一般用于过滤从外网进入内网的流量,因此有时需要将 FTP 的工作模式设置为主动模式,才可以传输数据,相应的流程拓扑如图 11-2 所示。
图11-2 FTP主动传输模式示意图
由于 FTP、HTTP、Telnet 等协议的数据都是使用明文传输的,因此从设计上就是不可靠的。人们为了满足以密文方式传输文件的需求,发明了 vsftpd 服务程序。vsftpd(very secure ftp daemon,非常安全的 FTP 守护进程)是一款运行在 Linux 系统上的 FTP 服务程序,不仅完全开源,而且还具有很高的安全性和传输速度。管理者可以自行决定客户端是采用匿名开放模式还是本地用户模式来登录vsftpd 服务器。
在配置妥当软件仓库之后,就可以安装 vsftpd 服务程序了:
root@linuxprobe:~# dnf install vsftpd
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
vsftpd x86_64 3.0.5-8.el10 AppStream 174 k
Transaction Summary
================================================================================
Install 1 Package
Total size: 174 k
Installed size: 348 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : vsftpd-3.0.5-8.el10.x86_64 1/1
Running scriptlet: vsftpd-3.0.5-8.el10.x86_64 1/1
Installed products updated.
Installed:
vsftpd-3.0.5-8.el10.x86_64
Complete!
把 ftp 添加到 firewalld 服务的允许列表中:
root@linuxprobe:~# firewall-cmd --permanent --zone=public --add-service=ftp
success
root@linuxprobe:~# firewall-cmd --reload
success
vsftpd 服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)的内容总长度有 126 行之多,但其中大多数参数在开头都添加了井号(#),从而成为注释信息,大家没有必要在注释信息上花费太多的时间。我们可以在grep 命令后面添加-v 参数,过滤并反选出没有包含井号(#)的参数行(即过滤掉所有的注释信息),然后将过滤后的参数行通过输出重定向符写回原始的主配置文件中。这样操作之后,就只剩下 12 行有效参数了:
root@linuxprobe:~# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
root@linuxprobe:~# grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
root@linuxprobe:~# cat /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
表 11-1 中罗列了 vsftpd 服务程序主配置文件中常用的参数以及作用。当前大家只需要简单了解即可,在后续的实验中将演示这些参数的用法,以帮助大家熟悉并掌握。
表 11-1 vsftpd 服务程序主配置文件中常用的参数以及作用
参数 | 作用 |
---|---|
listen=[YES|NO] | 是否以独立运行的方式监听服务 |
listen_address=IP 地址 | 设置要监听的 IP 地址 |
listen_port=21 | 设置 FTP 服务的监听端口 |
download_enable=[YES|NO] | 是否允许下载文件 |
userlist_enable=[YES|NO] userlist_deny=[YES|NO] | 设置用户列表为“允许”还是“禁止”操作 |
max_clients=0 | 最大客户端连接数,0 为不限制 |
max_per_ip=0 | 同一 IP 地址的最大连接数,0 为不限制 |
anonymous_enable=[YES|NO] | 是否允许匿名用户访问 |
anon_upload_enable=[YES|NO] | 是否允许匿名用户上传文件 |
anon_umask=022 | 匿名用户上传文件的 umask 值 |
anon_root=/var/ftp | 匿名用户的 FTP 根目录 |
anon_mkdir_write_enable=[YES|NO] | 是否允许匿名用户创建目录 |
anon_other_write_enable=[YES|NO] | 是否开放匿名用户的其他写入权限(包括重命名、删除等 操作权限) |
anon_max_rate=0 | 匿名用户的最大传输速率(字节/秒),0 为不限制 |
local_enable=[YES|NO] | 是否允许本地用户登录 FTP |
local_umask=022 | 本地用户上传文件的 umask 值 |
local_root=/var/ftp | 本地用户的 FTP 根目录 |
chroot_local_user=[YES|NO] | 是否将用户权限禁锢在 FTP 目录,以确保安全 |
local_max_rate=0 | 本地用户最大传输速率(字节/秒),0 为不限制 |
11.2 vsftpd服务程序
vsftpd 作为更加安全的文件传输协议服务程序,允许用户以两种认证模式登录 FTP 服务器。
匿名开放模式:最不安全的一种认证模式,任何人都可以无须密码验证而直接登录FTP 服务器;适用于对安全性要求不高的场景。
本地用户模式:通过 Linux 系统本地的账户和密码信息进行认证,相较于匿名开放模式更安全,配置起来也很简单。
ftp 是Linux 系统中以命令行界面的方式来管理 FTP 传输服务的客户端工具。我们首先手动安装这个ftp 客户端工具,以便在后续实验中查看结果。
root@linuxprobe:~# dnf install ftp
Updating Subscription Management repositories.
Last metadata expiration check: 0:08:48 ago on Tue 25 Mar 2025 09:00:02 AM CST.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
ftp x86_64 0.17-96.el10 AppStream 62 k
Transaction Summary
================================================================================
Install 1 Package
Total size: 62 k
Installed size: 107 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : ftp-0.17-96.el10.x86_64 1/1
Running scriptlet: ftp-0.17-96.el10.x86_64 1/1
Installed products updated.
Installed:
ftp-0.17-96.el10.x86_64
Complete!
如果大家想用 Windows 主机测试实验的效果,可以从 FileZilla、FireFTP、SmartFTP、WinSCP 和 Cyberduck 中挑一个喜欢的工具并从网上下载,它们的功能会比 ftp 命令更加强大。
11.2.1 匿名访问模式
前文提到,在 vsftpd 服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无须密码验证直接登录 FTP 服务器。这种模式一般用于访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。当然,如果采用第 8 章介绍的防火墙管理工具将 vsftpd 服务程序允许访问的主机范围设置为企业内网,也能提供基本的安全性。
vsftpd 服务程序默认关闭了匿名开放模式,我们需要做的是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户放开这些权限会带来潜在的安全风险。当前只是为了在 Linux 系统中练习配置 vsftpd 服务程序而开放这些权限,不建议在生产环境中如此行事。
表 11-2 罗列了能够向匿名用户开放的权限参数以及作用。
表 11-2 向匿名用户开放的权限参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=YES | 允许匿名开放模式 |
anon_umask=022 | 匿名用户上传文件的 umask 值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
root@linuxprobe:~# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=YES
2 anon_umask=022
3 anon_upload_enable=YES
4 anon_mkdir_write_enable=YES
5 anon_other_write_enable=YES
6 local_enable=YES
7 write_enable=YES
8 local_umask=022
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15 pam_service_name=vsftpd
16 userlist_enable=YES
在 vsftpd 服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启vsftpd 服务程序,让新的配置参数生效。在此需要提醒各位读者,在生产环境中或者在RHCSA、RHCE、RHCA 认证考试中一定要把配置过的服务程序加入开机启动项中,以保证服务器在重启后依然能够正常提供服务:
root@linuxprobe:~# systemctl restart vsftpd
root@linuxprobe:~# systemctl enable vsftpd
Created symlink '/etc/systemd/system/multi-user.target.wants/vsftpd.service' → '/usr/lib/systemd/system/vsftpd.service'.
现在,可以在客户端执行 ftp 命令连接远程的 FTP 服务器了。在 vsftpd 服务程序的匿名开放认证模式下,其账户统一为 anonymous,密码为空。而且在连接 FTP 服务器后,默认访问的是/var/ftp 目录。尝试切换到该目录下的 pub 目录,然后创建一个新的目录文件, 以检验是否拥有写入权限:
root@linuxprobe:~# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.5)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Create directory operation failed.
ftp> exit
221 Goodbye.
系统显示拒绝创建目录!我们明明在 firewalld 防火墙中开启了 FTP 的放行策略,而且也在 vsftpd 服务程序的主配置文件中,给匿名用户开放了目录创建和文件写入权限啊。建议大家先不要着急往下看,而是自己思考一下这个问题的解决办法,以锻炼你的 Linux 系统排错能力。
前文提到,在 vsftpd 服务程序的匿名开放认证模式下,默认访问的是/var/ftp 目录。查看该目录的权限得知,只有 root 管理员才有写入权限。怪不得系统会拒绝操作呢!下面将目录的所有者身份改成系统账户 ftp,这样应该可以了吧?
root@linuxprobe:~# ls -ld /var/ftp/pub
drwxr-xr-x. 2 root root 6 Aug 13 2024 /var/ftp/pub
root@linuxprobe:~# chown -R ftp /var/ftp/pub
root@linuxprobe:~# ls -ld /var/ftp/pub
drwxr-xr-x. 2 ftp root 6 Aug 13 2024 /var/ftp/pub
root@linuxprobe:~# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.5)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Create directory operation failed.
ftp> exit
221 Goodbye.
系统再次报错!尽管在使用 ftp 命令登录 FTP 服务器后,在创建目录时系统依然提示操作失败,但是报错信息却发生了变化。在没有写入权限时,系统提示 Permission denied(权限拒绝),所以刘遄老师怀疑是权限的问题。但现在系统提示 Create directory operation failed(创建目录的操作失败),想必各位读者也应该意识到是 SELinux 服务在“捣乱”了吧。
下面使用 getsebool 命令查看与 FTP 相关的 SELinux 域策略都有哪些:
root@linuxprobe:~# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
我们可以根据经验(需要长期培养,别无它法)和策略的名称判断出是 ftpd_full_access --> off 策略规则导致了操作失败。接下来修改该策略规则,并且在设置时使用-P 参数让修改过的策略永久生效,确保在服务器重启后依然能够顺利写入文件。
root@linuxprobe:~# setsebool -P ftpd_full_access=on
等SELinux 域策略修改完毕后,就能够顺利执行文件的创建、修改及删除等操作了。
root@linuxprobe:~# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.5)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
在上面的操作中,由于权限不足,所以我们将/var/ftp/pub 目录的所有者设置成 ftp 用户本身。除了这种方法,也可以通过设置权限的方法让其他用户获取写入权限(例如 777 这样的权限)。但是,由于 vsftpd 服务自身带有安全保护机制,因此不要直接修改/var/ftp 的权限,这有可能导致服务被“安全锁定”而不能登录。一定要记得是对里面的 pub 目录修改权限哦:
root@linuxprobe:~# chmod -R 777 /var/ftp
root@linuxprobe:~# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.5)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此处敲击回车即可
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
Tips :
再次提醒各位读者,在进行下一次实验之前,一定记得将虚拟机还原到最初始的状态, 以免多个实验相互产生冲突。
11.2.2 本地用户模式
相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前用的是匿名开放模式,现在先将它关闭,然后开启本地用户模式。针对本地用户模式的权限参数以及作用如表 11-3 所示。
表 11-3 本地用户模式使用的权限参数以及作用
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁止匿名开放模式 |
local_enable=YES | 允许本地用户模式 |
write_enable=YES | 设置 FTP 服务器的可写权限 |
local_umask=022 | 本地用户模式创建文件的 umask 值,值越大,文件实际权限越 |
userlist_deny=YES | 启用“禁止用户名单”机制,名单文件为 ftpusers 和 user_list |
userlist_enable=YES | 启用“允许用户名单”机制,设置允许访问的用户范围 |
默认情况下,本地用户所需的参数都已经存在,不需要修改。而 local_umask 这个参数可能是大家头一次见到。umask 一般被称为“权限掩码”或“权限补码”,它能够直接影响新建文件的权限值。
例如在 Linux 系统中,新建的普通文件的权限是 644,新建的目录的权限是 755。虽然大家对此都习以为常,但是有考虑过权限为什么是这些数字么?
其实,普通文件的默认权限是 666,目录的默认权限是 777,这都是写在系统配置文件中的。但默认权限值不等于最终权限值。local_umask 参数的默认值是 022,根据公式“默认权限 - local_umask = 实际权限”,所以普通文件的默认权限到手后就剩下 644,而目录文件就剩下 755。
如果大家还不明白,我们再来看一个例子—每个人的收入都要纳税,税就相当于umask 值。如果政府想让每个人到手的收入多一些,那么就减少税(降低 umask);如果想让每个人到手的收入少一些,那么就多加税(提高 umask)。也就是说,umask 实际上是权限的反掩码,通过它可以调整文件最终的权限大小。相信这样一来,这样大家应该明白了。
好啦,说的有点远了。接下来配置本地用户的参数:
root@linuxprobe:~# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES
在 vsftpd 服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启vsftpd 服务程序,让新的配置参数生效。在执行完上一个实验并还原虚拟机为最初的状态后,还需要将配置好的服务添加到开机启动项中,以便在系统重启之后依然能够正常使用vsftpd 服务。
root@linuxprobe:~# systemctl restart vsftpd
root@linuxprobe:~# systemctl enable vsftpd
Created symlink '/etc/systemd/system/multi-user.target.wants/vsftpd.service' → '/usr/lib/systemd/system/vsftpd.service'.
按理来讲,现在已经完全可以用本地用户的身份登录 FTP 服务器了。但是在使用 root 管理员的身份登录后,系统提示如下的错误信息:
root@linuxprobe:~# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.5)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp> exit
221 Goodbye.
可见,在我们输入 root 管理员的密码之前,就已经被系统拒绝访问了。这是因为vsftpd 服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers 和 user_list)。不知道大家是否看过一部日本电影《死亡笔记》,影片中出现过一本黑色封皮的神秘小本子,只要将别人的名字写进去,这个人就会挂掉。vsftpd 服务程序目录中的这两个文件也有类似的功能—只要里面写有某位用户的名字,就不再允许这位用户 登录到 FTP 服务器上。
root@linuxprobe:~# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
root@linuxprobe:~# 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
果然如此!vsftpd 服务程序为了保证服务器的安全性而默认禁止了 root 管理员和大多数系统用户的登录行为,这样可以有效地避免黑客通过 FTP 服务对 root 管理员密码进行暴力破解。如果你确认在生产环境中使用 root 管理员不会对系统安全产生影响,只需按照上面的提示删除 root 用户名即可。
然后再使用 root 管理员账户尝试登录 vsftpd 服务程序,这次登录成功:
root@linuxprobe:~# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.5)
Name (192.168.10.10:root): root
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221 Goodbye.
在继续后面的实验之前,不知道大家有没有思考过这样一个问题:明明都是起到禁止用户登录的作用,为何要制作两个近乎一样的文件呢?
这个小玄机其实就在user_list 文件上面。如果把上面主配置文件中userlist_deny 的参数值改成 NO,那么 user_list 列表就变成了“强制白名单”。它的功能与之前完全相反,只允许列表内的用户访问,拒绝其他人的访问。
另外,在采用本地用户模式登录 FTP 服务器后,默认访问的是该用户的家目录,而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。但是当前的操作仍然被拒绝,这是因为我们刚才将虚拟机系统还原到最初的状态了。为此,需要再次开启 SELinux 域中对 FTP 服务的允许策略:
root@linuxprobe:~# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
root@linuxprobe:~# setsebool -P ftpd_full_access=on
刘遄老师再啰嗦几句。在实验和生产环境中设置 SELinux 域策略时,一定记得添加-P 参数,否则服务器在重启后就会按照原有的策略进行控制,从而导致配置过的服务无法使用。在配置妥当后再使用本地用户尝试登录 FTP 服务器,分别执行文件的创建、重命名及删除等命令。操作均成功!
[root@linuxprobe vsftpd]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.5)
Name (192.168.10.10:root): root
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/root/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
11.3 TFTP
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种基于 UDP 在客户端和服务器之间传输简单文件的协议。顾名思义,它提供不复杂、开销不大的文件传输服务,可将其当作 FTP 的简化版本。
TFTP 的命令功能不如 FTP 服务强大,甚至不能遍历目录,在安全性方面也弱于 FTP 服务。而且,由于 TFTP 在传输文件时采用的是 UDP,占用的端口号为 69,因此文件的传输过程也不像 FTP 那样可靠。但是,因为 TFTP 不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。
接下来在系统上安装相关的软件包,进行体验。其中,tftp-server 是服务程序,tftp 是用于连接测试的客户端工具:
root@linuxprobe:~# dnf install tftp-server tftp
Updating Subscription Management repositories.
BaseOS 2.7 MB/s | 2.7 kB 00:00
AppStream 2.7 MB/s | 2.8 kB 00:00
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
tftp x86_64 5.2-47.el10 AppStream 36 k
tftp-server x86_64 5.2-47.el10 AppStream 44 k
Transaction Summary
================================================================================
Install 2 Packages
Total size: 80 k
Installed size: 113 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : tftp-server-5.2-47.el10.x86_64 1/2
Running scriptlet: tftp-server-5.2-47.el10.x86_64 1/2
Installing : tftp-5.2-47.el10.x86_64 2/2
Running scriptlet: tftp-5.2-47.el10.x86_64 2/2
Installed products updated.
Installed:
tftp-5.2-47.el10.x86_64 tftp-server-5.2-47.el10.x86_64
Complete!
然后,重启 TFTP 服务并将它添加到系统的开机启动项中,以确保 TFTP 服务在系统重启后依然处于运行状态。考虑到有些防火墙的默认配置不会发行 UDP/69 端口的流量,因此需要手动将该端口号加入到防火墙的允许策略中:
root@linuxprobe:~# systemctl restart tftp
root@linuxprobe:~# systemctl enable tftp
root@linuxprobe:~# firewall-cmd --zone=public --permanent --add-port=69/udp
success
root@linuxprobe:~# firewall-cmd --reload
success
TFTP 的根目录为/var/lib/tftpboot。可以使用刚才安装好的 tftp 命令尝试访问其中的文件,亲身体验 TFTP 服务的文件传输过程。在使用 tftp 命令访问文件时,可能会用到表 11-4 中的参数。
表 11-4 tftp 命令中可用的参数以及作用
参数 | 作用 |
---|---|
? | 帮助信息 |
put | 上传文件 |
get | 下载文件 |
verbose | 显示详细的处理信息 |
status | 显示当前的状态信息 |
binary | 使用二进制进行传输 |
ascii | 使用 ASCII 进行传输 |
timeout | 设置重传的超时时间 |
quit | 退出 |
root@linuxprobe:~# echo "i love linux" > /var/lib/tftpboot/readme.txt
root@linuxprobe:~# tftp 192.168.10.10
tftp> get readme.txt
tftp> quit
root@linuxprobe:~# ls
anaconda-ks.cfg Documents Music Public Templates
Desktop Downloads Pictures readme.txt Videos
root@linuxprobe:~# cat readme.txt
i love linux
当然,TFTP 服务的玩法还不止于此,第 19 章会将 TFTP 服务与其他软件相搭配,组合出一套完整的自动化系统部署方案。大家继续加油!
复习题
-
简述FTP 的功能以及所占用的端口号。
答:FTP 是一种在互联网中传输文件的协议,默认使用 20、21 号端口,其中端口 20 用于进行数据传输,端口 21 用于接收客户端发起的相关FTP 命令与参数。
-
简述vsftpd 服务程序提供的两种用户认证模式。
答:两种用户认证模式如下。
匿名开放模式:最不安全的一种认证模式,任何人都可以无须密码验证而直接登录FTP 服务器;适用于对安全性要求不高的场景。
本地用户模式:通过 Linux 系统本地的账户密码信息进行认证,相较于匿名开放模式更安全,配置起来也很简单。
-
使用ftp 命令以命令行界面的方式登录匿名开放模式的 FTP 服务器时,账户怎么填?
答:账户应填anonymous;如果是图形化界面,一般不需要手动输入任何账户和密码。
-
使用匿名开放模式登录 FTP 服务器时,默认的FTP 根目录是什么?
答:默认的 FTP 根目录是/var/ftp 目录,该目录内默认还有一个名为 pub 的子目录。
-
使用本地用户模式登录到 FTP 服务器上时,默认的 FTP 根目录是什么?
答:默认的 FTP 根目录是该用户的家目录。
-
当怀疑是SELinux 导致服务无法正常使用时,如何临时关闭它?
答:执行命令setenforce 0。
-
如果不希望用户登录 FTP 后随意切换到其他系统目录,可使用什么参数进行禁锢?
答:使用 chroot_local_user 牢笼机制参数进行禁锢,使用户仅能对该目录下的文件进行管理。
-
如果 FTP 服务能够在本地访问,但远程访问失败,且本地与远程主机之间能够互相 ping通,则最可能的原因是什么?
答:问题最可能出现在防火墙上,可在 firewall 防火墙中配置允许FTP 的策略。
-
TFTP 与 FTP 有什么不同?
答:TFTP 提供不复杂、开销不大的文件传输服务(可将其当作FTP 的简化版本)。
-
在TFTP 中,上传和下载文件分别使用的参数是什么?
答:put 与 get。