Linux中FTP配置与vsftpd服务部署指南
一、FTP 核心概念
1、基本定义
- 文件传输协议(FTP),基于 C/S模式 工作。
- 控制端口:21(身份验证与指令传输)
数据端口:20(主动模式数据传输)
2、工作模式对比
- 客户端从一个随机非特权端口N(>1024)连接到服务器的控制端口(21)
- 其中Prot命令包含了客户端的IP地址和数据端口(N+1)
- 服务器收到这条PORT命令,从它的数据端口(20)主动发起连接到客户端指定的IP地址和端口(N+1)
- 需要服务端与客户端重新建立一个新的连接来传输数据
- 客户端从一个随机非特权端口N(>1024)连接到服务器的控制端口(21)
- 其中Pasv命令包含了客户端的数据端口(N+1)
- 此时服务端会随机生成一个高端端口P(P>1024),并发送PORT命令给客户端(使用控制端口)
- 其中Prot命令包含了服务端的IP地址和数据端口P
- 客户端从数据端口N+1发起一个请求连接服务端数据端口P,这时产生了数据连接
- 不需要服务端与客户端重新建立一个新的连接来传输数据
主动模式 | 服务端 → 客户端 | 服务端数据端口20 → 客户端高端口N+1 | 服务端控制端口为21 |
被动模式 | 客户端 → 服务端 | 客户端高端口N+1 → 服务端随机高端口p | 服务端控制端口为21 |
二、FTP服务器主配置文件参数
anonymous_enable | NO | 控制匿名用户访问权限 | YES表示允许匿名访问FTP服务器 |
local_enable | YES | 控制FTP用户是否可以访问FTP服务器 | SELinux启用时需注意调整ftp_home_dir的bool值(RHEL7+ 无需配置) |
write_enable | YES | 控制FTP用户对FTP服务器的可写权限 | 必须启用后,其他写操作参数才生效 |
local_umask | 022 | FTP用户创建目录或文件时的umask值 | 创建目录权限 755,文件权限 644 |
anon_upload_enable | 注释 | 控制匿名用户上传文件的权限 | SELinux启用时需注意调整 ftpd_anon_write 和 ftpd_full_access 的bool值 |
anon_mkdir_write_enable | 注释 | 控制匿名用户创建目录的权限 | 需同时启用 write_enable=YES |
anon_other_write_enable | 无 | 允许匿名用户重命名/删除文件 | 高风险操作,谨慎启用 |
dirmessage_enable | YES | 显示说明性文件 | 用户进入目录时自动显示 |
xferlog_enable | YES | 控制文件在传输过程中是否被日志记录 | 日志默认位置:/var/log/xferlog |
connect_from_port_20 | YES | 强制使用20端口进行数据传输 | 仅主动模式生效 |
chown_uploads | 注释 | 默认匿名用户上传文件的所有者为FTP | 需配合 chown_username 使用 |
chown_username | 注释 | 匿名用户上传文件的所有者将变成该FTP用户 | 例:chown_username=whoever |
xferlog_file | 注释 | 设置FTP服务日志文件位置 | 例:xferlog_file=/var/log/xferlog |
xferlog_std_format | YES | 设置标准的FTP Xferlog模式 | 兼容 wu-ftpd 日志格式 |
idle_session_timeout | 600 | 控制连接空闲超时(秒) | 超时自动断开连接 |
data_connection_timeout | 120 | 数据传输连接空闲超时(秒) | 超时自动断开数据连接 |
nopriv_user | 注释 | 指定非特权运行用户 | 例:nopriv_user=ftpsecure |
ftpd_banner | 注释 | 成功连接FTP服务器时的提示语 | 例:ftpd_banner=Welcome to My FTP service |
deny_email_enable | 注释 | 禁止下载文件到指定的邮箱地址中 | 需配合 banned_email_file 使用 |
banned_email_file | 注释 | 设置电子邮箱地址 | 例:banned_email_file=/etc/vsftpd/banned_emails |
chroot_local_user | 注释 | 控制FTP用户能否离开自己的FTP主目录 | YES表示禁止FTP用户离开自己的FTP主目录 |
chroot_list_enable | 注释 | 控制列表中的FTP用户能否离开自己的FTP主目录 | 需配合 chroot_list_file 使用 |
chroot_list_file | 注释 | FTP用户列表文件,每一行一个用户名 | 默认:/etc/vsftpd/chroot_list |
ls_recurse_enable | 注释 | 控制FTP用户是否能使用类似 ls -R命令 | 默认是禁止的,YES表示允许使用 |
listen | NO | 控制是否侦听ipv4套接字 | 与 listen_ipv6 互斥 |
listen_ipv6 | YES | 控制是否侦听ipv6套接字 | 启用时兼容 IPv4 连接 |
pam_service_name | vsftpd | 设置PAM认证文件的名称 | 默认:/etc/pam.d/vsftpd |
userlist_enable | YES | 启用用户列表控制 | 需配合 /etc/vsftpd/user_list 文件 |
tcp_wrappers | YES | 启用 TCP Wrappers 主机访问控制 | 通过 /etc/hosts.{allow,deny} 管理 |
pasv_min_port | 无 | 被动模式最小端口号 | 建议设置高端口范围(例:10000) |
pasv_max_port | 无 | 被动模式最大端口号 | 需在防火墙放行该端口范围(例:11000) |
allow_writeable_chroot | 无 | 允许 chroot 环境下的可写主目录 | 避免 500 错误(替代 chmod u-w /home/user) |
三、配置场景示例
服务端下载:
yum -y install vsftpd
客户端下载:
yum -y install lftp
1、匿名用户
设置允许匿名用户访问FTP服务器:
vim /etc/vsftpd/vsftpd.conf
pasv_enable=YES# 启用passive被动模式
pasv_min_port=10000# 开启最低的pasv端口,建议采用大于1024的高端口
pasv_max_port=11000# 开启最高的pasv端口
systemctl restart vsftpd
centos7默认允许,不用做修改;centos8修改如上
设置允许匿名用户访问FTP服务器时能够在/var/ftp/pub目录下进行文件上传:
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_upload_enable=YES
systemctl restart vsftpd
setfacl -m u:ftp:rwx /var/ftp/pub
设置允许匿名用户访问FTP服务器时能够在/var/ftp/pub目录下创建目录:
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_mkdir_write_enable=YES
systemctl restart vsftpd
setfacl -m u:ftp:rwx /var/ftp/pub
设置允许匿名用户访问FTP服务器时能够对/var/ftp/pub目录中的文件或目录进行重命名或删除操作:
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_other_write_enable=YES
systemctl restart vsftpd
setfacl -m u:ftp:rwx /var/ftp/pub
2、FTP目录
创建用户:
useradd ftpuser1
useradd ftpuser2
useradd ftpuser3
for i in ftpuser{1..3}
>do echo 123321 | passwd –stdin $i
>done
设置允许FTP用户访问FTP服务器:
local_enable=YES write_enable=YES 这两个值为默认设置
通过FTP用户访问FTP服务器时,默认访问的主目录为FTP用户家目录
此时FTP用户可以在自己的家目录下上传文件、下载文件、创建目录、重命名文件或者目录、删除文件或目录,同时FTP用户可以切换至其他目录中访问
vim /etc/vsftpd/vsftpd.conf
local_enable=YES
write_enable=YES
systemctl restart vsftpd
设置FTP用户访问FTP服务器时,将所有FTP用户访问的目录限制在自己的主目录中,不允许FTP用户访问其他目录:
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
systemctl restart vsftpd
发现提示登录失败
这是因为如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!
但是用户主目录此时任然具有写权限,所以提示该错误
解决方法一:
chmod u-w /home/ftpuser1
使用命令 chmod u-w /home/ftpuser1 去除用户主目录的写权限
可以解决问题,但不合理,不推荐使用
解决方法二:
vim /etc/vsftpd/vsftpd.conf
allow_writeable_chroot=YES
systemctl restart vsftpd
设置FTP用户访问FTP服务器时,将部分FTP用户访问的目录限制在自己的主目录中,其他FTP用户仍然可以访问其他目录:
vim /etc/vsftpd/vsftpd.conf
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
vim /home/ftpuser1chroot_list
ftpuser1
systemctl restart vsftpd
- 当 chroot_local_enable=NO 时
- chroot_list_enable=YES 代表只限制 /etc/vsftpd/chroot_list 文件中定义的FTP用户,其他的ftp用户不受限
- chroot_list_enable=NO 所有的FTP用户均不受限
设置FTP用户访问FTP服务器时,部分FTP用户可以访问其他目录,其他FTP用户访问的目录仍然限制在自己的家目录中:
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
vim /home/ftpuser1chroot_list
ftpuser1
systemctl restart vsftpd
- 当 chroot_local_enable=YES 时
- chroot_list_enable=YES 代表 /etc/vsftpd/chroot_list 文件中定义的FTP用户不受限,其他的ftp用户受限
- chroot_list_enable=NO 代表所有的FTP用户受限
仅允许:
vim /etc/vsftpd/vsftpd.conf
userlist_deny=NO
vim /etc/vsftpd/user_list
ftpuser1
systemctl restart vsftpd
/etc/vsftpd/ftpusers 和/etc/vsftpd/user_list 文件默认禁用这些用户访问ftp服务器
将 userlist_deny=NO 写入 /etc/vsftpd/vsftpd.conf后
- /etc/vsftpd/ftpusers 为黑名单
- /etc/vsftpd/user_list 为白名单
- 两者名单列表冲突时,拒绝优先
评论前必须登录!
注册