第414集集群架构-FTP文件传输服务
|字数总计:4.6k|阅读时长:17分钟|阅读量:
集群架构 - FTP文件传输服务
1. FTP服务原理概述
1.1 FTP协议简介
FTP (File Transfer Protocol),中文为”文件传输协议”,是一种在互联网上进行文件传输的协议,用于在Internet上控制文件的双向传输。
1.2 FTP工作原理
FTP是一个应用程序,基于客户端/服务器模式,默认使用TCP 20/21端口:
- FTP控制链接: 21端口,用于接受客户端发出的相关FTP命令与参数
- FTP数据链接: 20端口,用于数据传输,比如:上传、下载数据
1.3 FTP服务特点
FTP服务端通常部署在企业内网,具有以下特征:
- 容易搭建: 配置简单,部署快速
- 方便管理: 支持用户权限管理
- 安全稳定: 支持多种认证方式
- 功能强大: 支持断点续传、多点下载
1.4 FTP传输拓扑
FTP协议的传输拓扑如下:
1 2
| 客户端 <--控制连接(21端口)--> FTP服务器 客户端 <--数据连接(20端口)--> FTP服务器
|
1.5 FTP登录用户类型
FTP支持三种用户类型:
| 用户类型 |
说明 |
特点 |
| 匿名用户 |
anonymous/ftp |
无需密码,权限受限 |
| 系统用户 |
系统真实用户 |
使用系统账号密码 |
| 虚拟用户 |
映射到系统用户 |
更安全,权限灵活 |
用户类型关系:
1 2 3
| 匿名用户 --> 系统用户 系统用户 --> 一般关闭 虚拟用户 --> 系统用户
|
2. FTP服务传输模式
2.1 主动模式 (Active Mode)
工作原理:
- 服务端通过20端口主动向客户端连接,传输数据
- 客户端打开随机端口等待服务端连接
连接过程:
- 客户端连接到FTP服务器的21端口(控制连接)
- 客户端发送PORT命令,告诉服务器客户端的数据端口
- 服务器从20端口连接到客户端指定的数据端口
- 开始数据传输
主动模式示意图:
1 2
| 客户端(随机端口) <--控制连接(21)--> 服务器 客户端(随机端口) <--数据连接(20)--> 服务器
|
2.2 被动模式 (Passive Mode)
工作原理:
- 服务端启动随机端口,等待客户端发起连接,进行数据传输
- 客户端主动连接服务端的数据端口
连接过程:
- 客户端连接到FTP服务器的21端口(控制连接)
- 客户端发送PASV命令
- 服务器响应,告诉客户端服务器的数据端口
- 客户端连接到服务器的数据端口
- 开始数据传输
被动模式示意图:
1 2
| 客户端 <--控制连接(21)--> 服务器 客户端 -->数据连接(随机端口)--> 服务器
|
2.3 FTP传输模式总结
| 模式 |
数据连接发起方 |
适用场景 |
| 主动模式 |
服务器主动连接 |
服务器无防火墙 |
| 被动模式 |
客户端主动连接 |
客户端有防火墙 |
防火墙影响:
- FTP服务器端启用防火墙,开启21/20端口: 这时FTP只能工作在主动模式
- FTP客户端开启防火墙: 这时FTP只能选择工作在被动模式
- FTP客户端和FTP服务端都有防火墙: 那么将无法使用FTP主动和被动模式
解决方案:
- 配置防火墙规则,开放FTP相关端口
- 使用被动模式,并配置pasv_min_port和pasv_max_port范围
3. FTP服务安装配置
3.1 基础环境准备
1 2 3 4 5 6
| [root@ftp-server ~] 3.10.0-693.el7.x86_64
[root@ftp-server ~] Red Hat Enterprise Linux Server release 7.4 (Maipo)
|
3.2 关闭防火墙以及selinux
1 2 3 4 5 6 7 8 9
| [root@ftp-server ~] [root@ftp-server ~]
[root@ftp-server ~] [root@ftp-server ~] [root@ftp-server ~] Disabled
|
3.3 安装vsftpd服务
1 2 3 4 5
| [root@ftp-server ~]
[root@ftp-server ~]
|
软件包说明:
- vsftpd: FTP服务器软件
- libdb-utils: 数据库工具,用于虚拟用户认证
3.4 启动ftp服务并加入开机自启动
1 2 3 4 5 6
| [root@ftp-server ~] [root@ftp-server ~]
[root@ftp-server ~]
|
注意: 默认使用匿名用户访问共享目录站点为/var/ftp,仅拥有下载权限。
3.5 vsftpd全局配置文件注释
主要配置参数说明:
| 参数 |
说明 |
默认值 |
anonymous_enable=YES |
是否启用匿名用户 |
YES |
local_enable=YES |
是否启动本地用户 |
YES |
write_enable=YES |
开启全局上传文件 |
NO |
local_umask=022 |
控制本地用户上传文件默认权限 |
022 |
anon_umask=022 |
控制匿名用户上传文件的默认权限 |
022 |
anon_upload_enable=YES |
允许匿名用户上传 |
NO |
anon_mkdir_write_enable=YES |
允许创建目录 |
NO |
dirmessage_enable=YES |
配置用户目录显示信息 |
NO |
xferlog_enable=YES |
启动日志 |
NO |
xferlog_file=/var/log/vsftpd.log |
指定日志位置 |
/var/log/vsftpd.log |
connect_from_port_20=YES |
使用20端口进行数据连接 |
YES |
xferlog_std_format=YES |
使用标准日志格式 |
NO |
listen=YES |
是否作为一个独立守护进程运行 |
NO |
chroot_local_user=YES |
禁锢所有用户在用户目录下 |
NO |
chroot_list_enable=YES |
配合chroot_list_file使用 |
NO |
chroot_list_file=/etc/vsftpd/chroot_list |
禁锢用户列表 |
/etc/vsftpd/chroot_list |
pam_service_name=vsftpd |
PAM认证文件 |
vsftpd |
userlist_enable=YES |
ftpusers文件下的用户都被拒绝登陆访问 |
NO |
tcp_wrappers=YES |
启用TCP Wrappers |
NO |
guest_enable=YES |
开启虚拟用户 |
NO |
guest_username=www |
FTP虚拟用户对应的系统用户 |
ftp |
user_config_dir=/etc/vsftpd/ftplogin |
授权FTP虚拟用户所在目录 |
- |
local_root=/data/ftp |
指定本地用户访问目录站点 |
- |
anon_root=/data/ftp |
指定匿名用户访问目录站点 |
- |
anon_max_rate=500000 |
匿名用户限速(字节/秒) |
0(无限制) |
local_max_rate=800000 |
本地用户限速(字节/秒) |
0(无限制) |
max_clients=100 |
同时能接收多少请求 |
0(无限制) |
max_per_ip=2 |
一个ip同时能有多少连接 |
0(无限制) |
权限限制参数:
local_root=/data/ftp: 指定本地用户访问目录站点
anon_root=/data/ftp: 指定匿名用户访问目录站点
资源控制参数:
anon_max_rate=500000: 匿名用户限速(500KB/s)
local_max_rate=800000: 本地用户限速(800KB/s)
max_clients=100: 同时能接收多少请求
max_per_ip=2: 一个ip同时能有多少连接
4. FTP匿名用户访问
4.1 配置需求
配置匿名用户访问ftp服务,拥有创建文件夹、上传下载文件、不允许删除、移动、重命名。
4.2 配置步骤
步骤1: 编辑vsftpd主配置文件
1 2 3 4 5 6 7
| [root@ftp-server ~]
anonymous_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES
|
步骤2: 修改默认ftp共享目录站点权限
1 2 3 4 5
| [root@ftp-server ~]
[root@ftp-server ~]
|
4.3 客户端验证
安装lftp客户端工具
使用匿名用户登录vsftpd
1 2 3 4 5 6 7 8 9
| [root@ftp-client ~]
lftp 192.168.56.11:~> ls drwxrwxrwx 2 0 0 4096 Mar 22 2017 pub
lftp 192.168.56.11:/> cd pub
|
创建目录
1 2 3 4 5 6
| lftp 192.168.56.11:/pub> mkdir dir_ftp mkdir ok, `dir_ftp' created
lftp 192.168.56.11:/pub> ls drwx------ 2 14 50 4096 Nov 14 21:10 dir_ftp
|
上传文件
1 2 3 4 5 6 7 8 9 10 11
| lftp 192.168.56.11:/pub> lcd /etc lcd ok, local cwd=/etc
lftp 192.168.56.11:/pub> put inittab 884 bytes transferred
lftp 192.168.56.11:/pub> ls drwx------ 2 14 50 4096 Nov 14 21:10 dir_ftp -rw------- 1 14 50 884 Nov 14 21:11 inittab
|
验证删除文件权限
1 2 3 4 5 6 7 8 9 10 11 12
| lftp 192.168.56.11:/pub> cd cd ok, cwd=/
lftp 192.168.56.11:/> cd pub lftp 192.168.56.11:/pub> ls drwx------ 2 14 50 4096 Nov 14 21:10 dir_ftp -rw------- 1 14 50 884 Nov 14 21:11 inittab
lftp 192.168.56.11:/pub> rm inittab rm: Access failed: 550 Permission denied. (inittab)
|
4.4 匿名用户权限总结
| 操作 |
权限 |
说明 |
| 下载 |
✅ 允许 |
可以下载文件 |
| 上传 |
✅ 允许 |
可以上传文件 |
| 创建目录 |
✅ 允许 |
可以创建目录 |
| 删除 |
❌ 拒绝 |
不能删除文件 |
| 移动 |
❌ 拒绝 |
不能移动文件 |
| 重命名 |
❌ 拒绝 |
不能重命名文件 |
5. FTP本地用户访问
5.1 本地用户访问ftp服务
本地用户访问ftp默认拥有上传和下载权限。
创建测试用户
1 2 3
| [root@ftp-server ~] [root@ftp-server ~]
|
客户端验证
1 2 3 4 5 6 7 8 9 10 11 12
| [root@ftp-client ~]
lftp 192.168.56.11:~> login ftp_test 123
lftp ftp_test@192.168.56.11:/> mkdir ftp
[root@ftp-server ~] ftp
|
5.2 拒绝特定的本地用户访问ftp
配置拒绝用户列表
1 2 3 4 5
| [root@ftp-server ~]
[root@ftp-server ~]
|
客户端验证
1 2 3 4 5
| [root@ftp-client ~] lftp 192.168.56.11:~> login ftp_test 123 lftp ftp_test@192.168.56.11:~> ls ls: Login failed: 530 Login incorrect.
|
说明: /etc/vsftpd/ftpusers 文件中的用户将被拒绝登录FTP服务。
5.3 锁定用户家目录
锁定所有本地用户只能在自己的家目录操作,但允许bgx用户不被锁定家目录。
配置步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [root@ftp-server ~]
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES
[root@ftp-server ~]
[root@ftp-server ~]
|
配置说明:
chroot_local_user=YES: 锁定所有用户至家目录
chroot_list_enable=YES: 启用排除列表
chroot_list_file=/etc/vsftpd/chroot_list: 指定排除列表文件
allow_writeable_chroot=YES: CentOS 7必须添加,允许在chroot目录中写入
注意: CentOS 7中,如果用户家目录权限为755,需要添加allow_writeable_chroot=YES才能正常使用。
6. FTP企业案例
6.1 需求分析
公司为了宣传最新的产品信息,计划搭建FTP服务器,为客户提供相关文档的下载。对所有权互联网开放共享目录,允许下载产品信息。公司的合作单位能够使用FTP服务器进行上传和下载。
需求分析:
根据企业的需求,对于不同用户进行不同的权限限制,FTP服务器需要实现用户的审核。需考虑到服务器的安全性,所以关闭实体用户登录,使用虚拟帐号验证机制,并对不同虚拟帐号设置不同的权限。为了保证服务器的性能,还需要根据用户的等级,限制客户端的连接数及下载速度。
6.2 解决方案
需求规划:
- 匿名用户: 允许下载我们公司的产品,但需要对其限速50KB/s
- 普通用户: 可以针对自己的目录进行上传和下载,对其限速500KB/s(虚拟用户)
- 管理用户: 可以访问所有目录资源,并可以操作客户的目录,但不允许操作对外
- 优化: 根据不同的等级用户做不同的限速,限制客户端连接次数(5)
目录结构:
1 2 3 4
| /data/ftp/ ├── manager # manager用户能管理所有目录,但不能管理soft目录 ├── bgx # bgx普通用户仅能查看自己的文件和修改 └── soft # 匿名用户仅能下载共享软件包
|
6.3 配置步骤
步骤1: 建立系统账户,供与虚拟账户使用
步骤2: 创建对应目录,赋予权限
1 2 3 4 5 6 7 8
| [root@ftp-server ~]
[root@ftp-server ~]
[root@ftp-server ~]
|
步骤3: 创建虚拟用户账户及密码
1 2 3 4 5 6 7 8 9 10
| [root@ftp-server ~] manager manager bgx bgx EOF
[root@ftp-server ~]
|
格式说明: 奇数行为用户名,偶数行为密码。
步骤4: 生成对应的库文件
1 2 3 4 5
| [root@ftp-server ~]
[root@ftp-server ~]
|
命令说明:
-T: 允许非Berkeley DB应用程序从文本文件读取
-t hash: 指定数据库类型为hash
-f: 指定输入文件
步骤5: 修改pam文件
1 2 3 4 5 6 7 8 9
| [root@ftp-server ~]
[root@ftp-server ~]
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
|
注意: 如果是32位系统,路径为/lib/security/pam_userdb.so。
步骤6: 建立虚拟用户配置目录
步骤7: 配置匿名用户权限,限速100KB/s
1 2 3 4 5 6 7 8 9 10 11
| [root@ftp-server ~]
anonymous_enable=YES anon_root=/data/ftp/soft anon_max_rate=100000
anon_upload_enable=NO anon_mkdir_write_enable=NO
|
注意: 匿名用户登陆默认目录,必须要和/etc/passwd中的ftp用户的默认宿主目录要一样,否则也会出错误!
步骤8: 配置管理用户,限速2MB/s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cat > /etc/vsftpd/vsftpd_user_conf/manager <<EOF local_root=/data/ftp/ allow_writeable_chroot=YES write_enable=YES local_umask=022 anonymous_enable=NO anon_upload_enable=NO anon_mkdir_write_enable=NO idle_session_timeout=600 data_connection_timeout=120 max_clients=10 max_per_ip=5 local_max_rate=2000000 EOF
|
配置说明:
local_root=/data/ftp/: 管理用户可以访问所有目录
local_max_rate=2000000: 限速2MB/s
max_per_ip=5: 每个IP最多5个连接
步骤9: 配置普通用户,限速1MB/s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cat > /etc/vsftpd/vsftpd_user_conf/bgx <<EOF local_root=/data/ftp/bgx allow_writeable_chroot=YES write_enable=YES local_umask=022 anonymous_enable=NO anon_upload_enable=NO anon_mkdir_write_enable=NO idle_session_timeout=600 data_connection_timeout=120 max_clients=10 max_per_ip=5 local_max_rate=1000000 EOF
|
配置说明:
local_root=/data/ftp/bgx: 普通用户只能访问自己的目录
local_max_rate=1000000: 限速1MB/s
max_per_ip=5: 每个IP最多5个连接
步骤10: 配置文件尾部追加虚拟用户配置
1 2 3 4 5 6 7 8 9 10
| cat >> /etc/vsftpd/vsftpd.conf <<EOF
# 虚拟用户配置 chroot_local_user=YES guest_enable=YES guest_username=virftp virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/vsftpd_user_conf EOF
|
配置说明:
chroot_local_user=YES: 锁定用户到指定目录
guest_enable=YES: 启用虚拟用户
guest_username=virftp: 虚拟用户映射的系统用户
virtual_use_local_privs=YES: 虚拟用户使用本地用户权限
user_config_dir=/etc/vsftpd/vsftpd_user_conf: 虚拟用户配置文件目录
步骤11: 重启服务并验证
1 2 3 4 5 6 7
| [root@ftp-server ~]
[root@ftp-server ~]
|
6.4 完整配置文件示例
主配置文件 /etc/vsftpd/vsftpd.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| anonymous_enable=YES anon_root=/data/ftp/soft anon_max_rate=100000 anon_upload_enable=NO anon_mkdir_write_enable=NO
local_enable=YES write_enable=YES local_umask=022
chroot_local_user=YES guest_enable=YES guest_username=virftp virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/vsftpd_user_conf
xferlog_enable=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES
listen=YES pam_service_name=vsftpd tcp_wrappers=YES
|
6.5 用户权限总结
| 用户类型 |
用户名 |
访问目录 |
限速 |
权限 |
| 匿名用户 |
anonymous |
/data/ftp/soft |
100KB/s |
仅下载 |
| 普通用户 |
bgx |
/data/ftp/bgx |
1MB/s |
上传/下载 |
| 管理用户 |
manager |
/data/ftp/ |
2MB/s |
全权限(除soft) |
7. FTP服务管理命令
7.1 服务管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| systemctl start vsftpd
systemctl stop vsftpd
systemctl restart vsftpd
systemctl reload vsftpd
systemctl status vsftpd
systemctl enable vsftpd
|
7.2 日志查看
1 2 3 4 5 6 7 8
| tail -f /var/log/vsftpd.log
journalctl -u vsftpd
netstat -antp | grep :21
|
7.3 客户端工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| yum install lftp -y
lftp ftp://192.168.56.11
lftp ftp://user:pass@192.168.56.11
|
8. FTP故障排查
8.1 常见问题
问题1: 无法连接FTP服务器
排查步骤:
1 2 3 4 5 6 7 8
| systemctl status vsftpd
ss -lntup | grep 21
iptables -L -n | grep 21
|
问题2: 登录失败
排查步骤:
1 2 3 4 5 6 7 8
| cat /etc/vsftpd/ftpusers
cat /etc/pam.d/vsftpd
tail -f /var/log/vsftpd.log
|
问题3: 无法上传文件
排查步骤:
1 2 3 4 5 6
| ls -ld /var/ftp/pub
grep write_enable /etc/vsftpd/vsftpd.conf grep anon_upload_enable /etc/vsftpd/vsftpd.conf
|
8.2 错误代码
| 错误代码 |
说明 |
解决方法 |
| 530 |
登录失败 |
检查用户名密码 |
| 550 |
权限拒绝 |
检查文件权限和配置 |
| 553 |
文件已存在 |
删除或重命名文件 |
| 425 |
无法打开数据连接 |
检查防火墙和被动模式 |
9. FTP安全加固
9.1 安全建议
- 禁用匿名用户: 如果不需要,禁用匿名访问
- 使用虚拟用户: 使用虚拟用户代替系统用户
- 限制访问IP: 使用TCP Wrappers限制访问来源
- 启用SSL/TLS: 使用FTPS加密传输
- 定期更新: 保持vsftpd软件最新版本
9.2 防火墙配置
1 2 3 4 5 6 7 8
| firewall-cmd --permanent --add-service=ftp firewall-cmd --reload
firewall-cmd --permanent --add-port=21/tcp firewall-cmd --permanent --add-port=20/tcp firewall-cmd --reload
|
9.3 被动模式端口范围
1 2 3 4 5 6 7 8 9 10 11
| vim /etc/vsftpd/vsftpd.conf
pasv_enable=YES pasv_min_port=50000 pasv_max_port=60000
firewall-cmd --permanent --add-port=50000-60000/tcp firewall-cmd --reload
|
10. FTP性能优化
10.1 性能参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| vim /etc/vsftpd/vsftpd.conf
max_clients=200 max_per_ip=10
idle_session_timeout=600 data_connection_timeout=120
anon_max_rate=1000000 local_max_rate=2000000
|
10.2 系统优化
1 2 3 4 5 6 7 8 9
| cat >> /etc/sysctl.conf <<EOF # FTP优化 net.core.somaxconn = 1024 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 8192 EOF
sysctl -p
|
实战优化