遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。
二、网络服务配置
2.4 ftp服务配置
2.4.1 ftp服务基础概览(了解)
FTP(File Transfer Protocol,文件传输协议)定义了一个在远程计算机系统和本地计算机系统之间传输文件的标准,工作在应用层,使用TCP传输控制协议在不同的主机之间提供可靠的数据传输。由于TCP是一种面向连接的、可靠的传输协议,因此FTP可提供可靠的文件传输。FTP支持断点续传功能,可以大幅地减低CPU和网络带宽的开销。
2.4.1.1 ftp的作用
跨平台文件传输
- FTP支持异构系统间的文件传输(如Windows与Linux),允许用户通过客户端软件对远程服务器进行文件操作(上传、下载、删除、重命名等),解决了不同操作系统文件格式兼容性问题
高效资源共享
- 公共资源分发:通过匿名FTP(用户名为“anonymous”,密码为邮箱地址),用户无需注册即可访问服务器上的公共目录,常用于软件、文档等资源的开放共享
- 企业内部分享:企业可通过FTP服务器集中管理项目文档、设计图纸等,员工通过权限控制访问特定目录,提升协作效率
网站维护与内容更新
- 开发者常利用FTP将网页文件上传至Web服务器,确保网站内容的实时更新。其高传输效率尤其适合大文件(如图片、视频)的批量上传
网络管理优化
- FTP支持带宽控制和用户权限分级(如Real账户、Guest用户),管理员可限制不同用户的文件操作权限,增强服务器安全
2.4.1.2 安全性缺陷
FTP未加密传输数据(包括密码),易受中间人攻击,因此衍生出FTPS(SSL/TLS加密)和SFTP(基于SSH)等安全协议
2.4.2 ftp的工作原理(掌握)
FTP基于客户-服务器模型(c/s),依赖TCP协议保障传输可靠性,通过两个独立连接实现功能
2.4.2.1 客户端-服务器模型(c/s)(了解)
服务器端
- FTP服务器运行服务软件(如vsftpd),监听TCP端口21(控制连接)
- 负责用户身份验证(如Real账户、Guest用户、Anonymous匿名用户)及权限管理
- 支持文件存储、目录操作(创建/删除/重命名)和文件传输任务
客户端
- 通过客户端软件(如FileZilla、WinSCP)或命令行工具连接服务器
- 发送FTP命令(如
USER
、PASS
、RETR
、STOR
)并接收服务器响应
2.4.2.2 双连接机制(掌握)
- 控制连接:默认使用TCP 21端口,用于传输命令(如USER、PASS)和响应码(如200表示成功)。该连接在会话期间持续保持
- 数据连接:负责实际文件传输,端口根据工作模式动态分配。传输完成后立即关闭,避免资源占用
2.4.2.3 两种工作模式(掌握)
主动模式(PORT)
- 客户端通过控制连接告知服务器自身的数据端口(如随机端口X),服务器主动从20端口向X端口发起数据连接。此模式在客户端防火墙拦截入站连接时可能失败
被动模式(PASV)
- 客户端发送PASV命令后,服务器开启随机高端口(如5000)并返回给客户端,客户端主动连接该端口。此模式穿透防火墙能力更强,适用于NAT环境
主动模式工作原理图示:
当需要传递数据的时候,由客户端发送PORT指令通知服务器建立数据连接的端口。 服务器主动建立数据连接,且每次数据传递完毕后,连接都被拆除,当有下一次数据传递时,FTP server必须和客户端建立一个新的连接用来传送数据。 主动模式下服务器使用的数据连接端口为20。
被动模式工作原理图示:
被动模式下,数据连接有客户端主动创建,服务器被动接受; 被动模式下,服务器的数据连接端口不是20,而是一个随机端口。 很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式。
2.4.2.4 文件类型与传输控制(了解)
- 传输类型:支持ASCII(文本文件自动转换行尾符)、二进制(非文本文件原样传输)、EBCDIC(大型机专用)三种模式
- 错误处理:通过响应码(如550表示文件不可用)反馈操作状态,客户端可据此调整策略(如重试或终止)
2.3.2.5 ftp经典消息 (了解)
消息号 | 含义 |
---|---|
120 | 服务在多少分钟内准备好 |
125 | 数据连接已经打开,开始传送 |
150 | 文件状态正确,正在打开数据连接 |
200 | 命令执行正确 |
202 | 命令未被执行,该站点不支持此命令 |
211 | 系统状态或系统帮助信息回应 |
212 | 目录状态 |
213 | 文件状态 |
214 | 帮助消息。关于如何使用本服务器或特殊的非标准命令 |
220 | 对新连接用户的服务已准备就绪 |
221 | 控制连接关闭 |
225 | 数据连接打开,无数据传输 |
226 | 正在关闭数据连接。请求的文件操作成功 |
消息号 | 含义 |
---|---|
227 | 进入被动模式 |
230 | 用户已登录。如果不需要可以退出 |
250 | 请求的文件操作完成 |
331 | 用户名正确,需要输入密码 |
332 | 需要登录的账户 |
350 | 请求的文件操作需要更多的信息 |
421 | 服务不可用,控制连接关闭或连接超时 |
425 | 打开数据连接失败 |
426 | 连接关闭,传送中止 |
450 | 请求的文件操作未被执行 |
451 | 请求的操作中止。发生本地错误 |
452 | 请求的操作未被执行。系统存储空间不足。文件不可用 |
500 | 语法错误,命令不可识别。可能为命令行过长 |
501 | 因参数错误导致的语法错误 |
502 | 命令未被执行 |
503 | 命令顺序错误 |
504 | 由于参数错误,命令未被执行 |
2.4.3 用户认证与权限管理(掌握)
用户分类:
- Real账户:拥有完整权限(上传、删除等),通常对应系统真实用户
- Guest用户:权限受限,仅能访问指定目录
- Anonymous用户:仅允许下载公共资源
用户模式 | 定义 | 权限特点 | 安全性 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|---|---|
匿名用户模式 | 无需提供有效凭据,用预设通用用户名(如 anonymous 或 ftp),无需密码访问 FTP 服务器 | 仅允许下载公共目录文件,禁止上传、删除、修改 | 风险较高,因无需认证且操作受限易被攻击 | 公共资源分发(如软件下载、文档共享) | 配置简单,便于快速共享资源 | 功能受限,存在恶意上传等滥用风险 |
本地用户模式 | 使用服务器操作系统中真实用户账户登录,账户信息存于 /etc/passwd 和 /etc/shadow | 可访问系统用户家目录,权限由系统账户权限决定,支持读写、删除等操作 | 较高,但权限配置不当可能导致系统级安全漏洞 | 企业内部文件管理、需精细权限控制场景 | 灵活性强,支持复杂权限分配(如限制登录时间、带宽) | 需维护系统账户,用户管理成本高,存在系统入侵风险 |
虚拟用户模式 | 独立于系统账户的专用 FTP 用户,通过数据库或文件存储认证信息,映射到某个系统用户(如 virftp) | 每个虚拟用户可绑定独立目录和权限(如仅允许上传到指定文件夹) | 最高,虚拟用户无系统级权限,凭证泄露也难操作服务器其他资源 | 多用户共享环境(如企业客户文件托管)、需严格隔离权限场景 | 安全性强,用户隔离性好,配置灵活 | 配置复杂(需数据库管理或 PAM 认证),维护成本较高 |
2.4.4 ftp服务配置过程
2.4.4.1 安装vsftp服务
sudo yum install vsftpd
2.4.4.2主配置文件参数(/etc/vsftpd/vsftpd.conf)
参数 | 解析 |
---|---|
anonymous_enable | 是否允许匿名访问,yes 为允许,no 为拒绝 |
anon_upload_enable | 是否允许匿名用户上传文件,yes 为允许,no 为拒绝 |
anon_mkdir_write_enable | 是否允许默认用户创建文件夹,yes 为允许,no 为拒绝 |
anon_umask | 匿名用户上传文件的 umask 值 |
anon_other_write_enable | 允许匿名用户修改目录名称或删除目录 |
guest_enable | 是否开启用户身份验证,yes 为开启,no 为关闭 |
guest_username | 映射登录的用户的身份为 guest,配合上面选项生效 |
anon_root | 设定匿名用户登录的主目录位置 |
anon_max_rate | 匿名用户的最大传输速率 |
参数 | 解析 |
---|---|
chown_uploads | 值为 YES 时,需与 chown_username 成对出现。表示上传文件后,文件所有者变为 chown_username 指定的值(此处为 whoever),且不能重新上传覆盖该文件 |
chown_username | 需与 chown_uploads 成对出现。值为 whoever,即上传文件后文件所有者变为 whoever,且不能重新上传覆盖该文件 |
pam_service_name | 列出与 vsftpd 相关的 PAM 文件,值为 vsftpd |
userlist_enable | 是否启用用户列表,值为 YES 表示启用 |
userlist_deny | 如果 如果 |
userlist_file | 指定用户列表文件为 /etc/vsftpd/users_list |
local_enable | 是否允许本地用户登录,值为 YES 表示允许,值为 NO 表示拒绝 |
write_enable | 全局用户是否可以读写,值为 YES 表示允许,值为 NO 表示拒绝 |
local_umask | 默认掩码,创建文件权限为 777 减去该值(此处为 022),即文件权限为 755;创建目录权限为 666 减去该值,即目录权限为 644 ,值为 022 |
参数 | 解析 |
---|---|
local_root | 设定本地用户登录的主目录位置,值为 /var/ftp |
pasv_enable | 是否启用被动模式,值为 YES 表示启用 |
port_enable | 此参数在注释中提到,port 为主动模式(与 pasv 被动模式不能同时使用),但未设置具体值,仅作说明 |
pasv_min_port | 使用被动模式时,端口范围的最小值,值为 9000 |
pasv_max_prot | 使用被动模式时,端口范围的最大值,值为 9200(你原文可能是 “pasv_max_port” 拼写错误),且只能在被动模式下使用 |
use_localtime | 是否使用本地时间,值为 YES 表示使用,值为 NO 表示不使用 |
chroot_local_user | 是否锁定所有系统用户在家目录中,值为 YES 表示锁定 |
dirmessage_enable | 是否在进入目录时显示.message 文件的内容,值为 YES 表示显示 |
xferlog_enable | 默认上传或者下载的日志是否记录在 /var/log/vsftpd.log 中,值为 YES 表示记录 |
connect_from_port_20 | 是否用 20 端口作为数据传输端口,值为 YES 表示使用 |
参数 | 解析 |
---|---|
chroot_list_enable | 是否锁定用户在家目录。取值为 YES 时,chroot_list 文件中列出的用户不被锁定;取值为 NO 时,chroot_list 文件中列出的用户会被禁锢在其家目录中,有默认值(未明确默认值具体是什么) |
ftpd_banner | 用于自定义 ftp 登录时显示的提示信息,当前设置为 "welc ftp server" (可能是 "welcome ftp server" 的拼写错误) |
max_clients | 表示 FTP 服务器允许的最大并发连接数,值为 0 表示不限制(一般来说,0 常表示无限制) |
max_per_ip | 表示每个 IP 地址同时可以发起的最大连接数,值为 0 表示不限制 |
local_max_rate | 表示本地用户的最大传输速率,值为 0 表示不限制传输速率 |
2.4.4.3 设置匿名登录
FTP的访问地址为:ftp://localhost
ftp服务器端:
#修改主配置文件
/etc/vsftpd/vsftpd.conf
匿名用户配置文件:
# 启用FTP服务器监听功能,使其可以接收外部连接请求
listen=YES
# 允许匿名用户登录FTP服务器
anonymous_enable=YES
# 指定匿名用户登录后所处的根目录
anon_root=/var/ftp/user
# 开启全局写权限,允许用户执行上传等写操作
write_enable=YES
# 允许匿名用户进行文件上传操作
anon_upload_enable=YES
# 设置匿名用户上传文件或目录的默认权限掩码(文件644,目录755)
anon_umask=022
# 允许匿名用户创建新目录
anon_mkdir_write_enable=YES
# 禁止匿名用户执行除上传和创建目录之外的其他写操作(如删除、重命名)
anon_other_write_enable=NO
#创建匿名用户的根目录
sudo mkdir /var/ftp/user/anonymous
#设置权限
sudo chown ftp.ftp /var/ftp/user
#在匿名用户根目录里添加测试上传用的文件
sudo vim /var.ftp/user/anonymous/anonymous.txt
#为了测试先关闭SELinux
sudo setenforce 0
#重启vsftpd
sudo systemctl restart vsftpd
ftp客户端:
#安装ftp
sudo yum install ftp
#创建本地下载路径(用来存放从ftp服务器上下载的文件)
sudo mkdir /home/download
#创建本地文件用于测试上传
sudo vim /home/download/a.txt
#ftp 连接 实际需要是 ftp 服务器的IP
ftp localhost
#输入用户名
annoymous
#密码一般直接回车就行
上传和下载测试:
#下载 定位的先前设置的下载路径
lcd /home/download
#列出ftp服务器目录下文件
ls
#前往需要下载的文件所处的位置
cd anonymous
#下载测试
get anonymos.txt
#上传测试
put a.txt
测试结果:
2.4.4.4 设置实名用户登录
FTP的访问地址为:ftp://localhost:2222
部署要求:
目录 | 属主 | 组 | 权限 |
---|---|---|---|
/var/ftp/dep | root | root | rwxr-xr-x |
/var/ftp/dep/js | yg | js | rwxrwxr-x |
用户 | 部门 | 组 | 家目录 |
---|---|---|---|
yg | 技术部 | js | /var/ftp/dep/js |
服务器端:
#创建js组
sudo groupadd js
#创建实名用户并指定组和根目录
sudo useradd -m -d /var/ftp/dep/js -g js yg
#设置密码
sudo echo 88888888 | passwd --stdin yg
#设置实名用户根目录属主和组
sudo chown yg.js /var/ftp/dep/js
创建实名用户配置文件
#创建实名用户配置文件
sudo vim /etc/vsftpd/vsftpd2222.conf
# 使FTP服务器监听在指定的IP地址和端口上(监听IPv4),开启监听功能
listen=YES
# 允许本地用户登录FTP服务器
local_enable=YES
# 开启写权限,允许用户执行上传等写操作,此处疑似有误(正确值应为YES ,当前为VFS )
write_enable=YES
# 设置本地用户上传文件或创建目录时的默认权限掩码,002意味着上传文件权限为664,目录权限为775
local_umask=002
# 指定PAM(可插拔认证模块)服务名称,用于用户认证
pam_service_name=vsftpd
# 设置本地用户登录后的根目录为/var/ftp/dep
local_root=/var/ftp/dep
# 启用用户列表功能
userlist_enable=YES
# 如果为YES,用户列表中的用户将被拒绝访问;如果为NO,只有用户列表中的用户能访问
userlist_deny=YES
# 指定用户列表文件的路径,该文件包含允许或拒绝访问的用户名单
userlist_file=/etc/vsftpd/user_list
# 指定用户配置文件所在目录,可针对不同用户设置特定配置
user_config_dir=/etc/vsftpd/userconf
# 将本地用户限制在其家目录中,增强安全性
chroot_local_user=YES
# 启用chroot列表功能
chroot_list_enable=YES
# 指定chroot列表文件路径,列在该文件中的用户不会被限制在其家目录
chroot_list_file=/etc/vsftpd/chroot_list
# 设置FTP服务器监听的端口号为2222
listen_port=2222
创建专属用户配置目录和文件,并向其中分别输入根目录
#创建实名用户配置目录
mkdir /etc/vsftpd/userconf
#实名用户配置文件
vim /etc/vsftpd/userconf/gy
#设置根目录
local_root=/var/ftp/dep/js
#允许在根目录上传
allow_writeable_chroot=YES
#允许yg 不在家目录
echo "yg" > /etc/vsftpd/chroot_list
#使用实名用户配置文件
sudo vsftpd /etc/vsftpd/vsftpd2222.conf
#启动
sudo systemctl restart vsftpd
客户端:
#登录
ftp localhost 2222
#其他测试在测试结果中
测试结果如下:
2.4.4.5 设置虚拟用户登录
FTP的访问地址为:ftp://localhost:8080
服务器端:
#创建虚拟用户文件 / 目录下
sudo vim company.txt
虚拟用户文件
虚拟创建存放虚拟用户的文件添加虚拟用户时,单行写用户名,双行写密码
yg
88888888
yy
88888888
#生成虚拟用户数据库文件
sudo db_load -T -t hash -f ~/company.txt /etc/vsftpd/vusers.db
一点小基础:
-
虚拟用户本身不是系统真实用户,需要映射到一个系统中存在的账号才能正常工作。可以创建
ftpvuser
这样的实名用户提供这样一个映射载体,让虚拟用户有对应的实体依托,以便 FTP 服务器通过它来管理虚拟用户的访问、权限等相关事宜 。
#创建虚拟映射用户
sudo useradd -m -d /var/ftp/company ftpuser
#创建公司目录
sudo mkdir -p /var/ftp/comany/{js,cp}
#设置属主和组
sudo chown -R ftpuser.ftpuser /var/ftp/company
#设置权限
sudo chmod 775 -R /var/ftp/company
#如果需要设置用户被限制在根目录的话需要移除w
sudo chmow a-w /var/ftp/company
为虚拟用户建立PAM认证文件/etc/pam.d/vsftpd.virtual
#为虚拟用户建立PAM认证文件/etc/pam.d/vsftpd.virtual
sudo vim /etc/pam.d/vsftpd.virtual
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
创建vsftpd服务的主配置文件/etc/vsftpd/vsftpd_vuser.conf
#创建vsftpd服务的主配置文件/etc/vsftpd/vsftpd_vuser.conf
sudo vim /etc/vsftpd/vsftpd_vuser.conf
配置文件:
# 监听IPv4地址,设置为YES表示开启监听
listen=1
listen_port=8080
# 不监听IPv6地址,设置为NO表示关闭监听
listen_ipv6=NO
# 允许从20端口发起连接,设置为YES表示开启
connect_from_port_20=YES
# 启用异步支持
async_abor_enable=YES
# 启用ASCII模式上传
ascii_upload_enable=YES
# 启用ASCII模式下载
ascii_download_enable=YES
# 禁止匿名用户登录,设置为NO表示关闭匿名登录功能
anonymous_enable=NO
# 启用本地用户登录,设置为YES表示允许本地用户登录
local_enable=YES
# 设置本地用户登录后的根目录为 /var/ftp/depcenter/unions
local_root=/var/ftp/dep/company
# 启用写权限,设置为YES表示允许用户进行写操作
write_enable=YES
# 禁止匿名用户上传文件,设置为NO表示关闭匿名上传功能
anon_upload_enable=NO
# 禁止匿名用户创建目录并写入,设置为NO表示关闭相关功能
anon_mkdir_write_enable=NO
# 禁止匿名用户其他写操作,设置为NO表示关闭相关功能
anon_other_write_enable=NO
# 设置本地用户创建文件的默认权限掩码为022
local_umask=022
# 不改变上传文件的属主,设置为NO表示关闭相关功能
chown_uploads=NO
# 启用用户列表功能,设置为YES表示开启
userlist_enable=YES
# 用户列表为黑名单模式,设置为YES表示userlist_file中的用户禁止登录FTP
userlist_deny=YES
# 指定用户列表文件路径,该文件中的用户登录会受上述规则限制
userlist_file=/etc/vsftpd/user_list
# 不禁用本地用户的家目录登出(不锁定本地用户在家目录),设置为NO表示不锁定
chroot_local_user=NO
# 启用chroot列表功能,设置为YES表示开启
chroot_list_enable=YES
# 指定chroot列表文件路径,该文件中的用户会被锁定在家目录
chroot_list_file=/etc/vsftpd/chroot_list
# 不支持递归列出目录(不支持ls -R),以优化服务器性能,设置为NO表示关闭该功能
ls_recurse_enable=NO
# 设置PAM服务名称,指定用户认证相关配置文件为/etc/pam.d/vsftpd.virtual
pam_service_name=/etc/pam.d/vsftpd.virtual
# 启用目录消息功能,设置为YES表示开启
dirmessage_enable=YES
# 启用传输日志功能,设置为YES表示开启
xferlog_enable=YES
# 传输日志采用标准格式,设置为YES表示开启
xferlog_std_format=YES
# 指定传输日志文件路径
xferlog_file=/var/log/vsftpd.log
# 启用虚拟用户功能,设置为YES表示开启
guest_enable=YES
# 设置虚拟用户对应的系统用户名(映射账号)为ftpvuser
guest_username=ftpvuser
# 虚拟用户使用本地用户权限,设置为YES表示开启
virtual_use_local_privs=YES
# 指定用户个性化配置文件所在目录
user_config_dir=/etc/vsftpd/vconf
配置FTP虚拟用户的个性化权限
创建配置模板:
#vsftpd 目录下
sudo vim js.conf.template
# 注释,表明该配置文件模板的名称
#js. c o n f. t e m p l a t e
# 设置本地用户登录后的根目录为 /var/ftp/depcenter/unions/xzunion
local_root=/var/ftp/dep/company/js
# 禁止匿名用户登录,设置为NO表示不允许匿名用户访问
anonymous_enable=NO
# 启用写权限,设置为YES表示允许用户进行写操作,如上传文件等
write_enable=YES
# 设置本地用户创建文件的默认权限掩码为002,即文件默认权限为664
local_umask=002
# 禁止匿名用户上传文件,设置为NO表示不允许匿名上传
anon_upload_enable=NO
# 禁止匿名用户创建目录并写入,设置为NO表示不允许相关操作
anon_mkdir_write_enable=NO
# 设置空闲会话超时时间为600秒,超过该时间未活动的会话将被断开
idle_session_timeout=600
# 设置数据连接超时时间为120秒,超过该时间未进行数据传输的连接将被断开
data_connection_timeout=120
# 设置最大并发连接数为10,即同时最多允许10个客户端连接
max_clients=10
# 设置每个IP地址同时发起的最大连接数为5
max_per_ip=5
# 设置本地用户的最大传输速率为50000字节每秒
local_max_rate=50000
#vsftpd 目录下
sudo vim cp.conf.template
#cp 虚拟用户配置模板
# 指定用户登录后的根目录(chroot目录)
local_root=/var/ftp/dep/company/cp
# 禁用匿名访问,仅允许虚拟用户登录
anonymous_enable=NO
# 允许用户上传/修改文件
write_enable=YES
# 设置文件创建掩码(umask 002 → 文件权限 664,目录权限 775)
local_umask=002
# 不禁用所有用户的chroot(由chroot_list控制)
chroot_local_user=NO
# 启用chroot列表功能
chroot_list_enable=YES
# 指定chroot列表文件路径(该文件中的用户将被限制在家目录)
chroot_list_file=/etc/vsftpd/chroot_cp_list
# 禁止匿名用户上传文件
anon_upload_enable=NO
# 禁止匿名用户创建目录
anon_mkdir_write_enable=NO
# 空闲会话超时时间(秒)
idle_session_timeout=600
# 数据连接超时时间(秒)
data_connection_timeout=120
# 最大并发连接数
max_clients=10
# 每个IP的最大连接数
max_per_ip=5
# 本地用户最大传输速率(字节/秒)
local_max_rate=50000
#创建用户配置目录
sudo mkdir /etc/vsftpd/vconf/
#用模板配置用户
sudo cp -p cp.conf.template /etc/vsftpd/vconf/cp
sudo cp -p js.conf.template /etc/vsftpd/vconf/js
创建/etc/vsftpd/chroot_cp_list
#创建/etc/vsftpd/chroot_cp_list
sudo vim /etc/vsftpd/chroot_cp_list
yy
#使用配置文件
sudo vsftpd /etc/vsftpd/vsftpd_vuser.conf
#暂时关闭SELinux
sudo setenforce
#重启
sudo systemctl restart vsftpd
客户端:
#登录
ftp localhost 8080