在 CentOS 7 上配置 FTP 服务器 (通常使用 vsftpd,Very Secure FTP Daemon),可以实现多种用户访问方式,包括:
-
匿名用户(Anonymous) :无需账号密码,只能访问特定目录(如
/var/ftp/pub)。 -
本地用户(系统用户 / 实名用户):使用系统已有的用户账号和密码登录,可访问自己的家目录或指定目录。
-
虚拟用户(Virtual Users):使用独立的用户名/密码(不在系统用户中),更加安全,适合多用户管理。
-
访问控制:限制用户只能访问自己的目录(chroot)、禁止某些IP、限制上传/下载等。
一、安装 vsftpd
1. 安装 vsftpd 软件包
sudo yum install vsftpd -y
2. 启动 vsftpd 服务并设置开机自启
sudo systemctl start vsftpd
sudo systemctl enable vsftpd
3. 检查服务状态
sudo systemctl status vsftpd
二、配置匿名用户访问(Anonymous FTP)
匿名用户通常用于提供公共文件下载,不需要账号密码。
1. 编辑配置文件
sudo vi /etc/vsftpd/vsftpd.conf
确保或添加以下配置项:
# 允许匿名用户登录
anonymous_enable=YES
# 匿名用户默认登录目录为 /var/ftp
# 通常无需修改,系统已创建 /var/ftp 目录
# 允许匿名用户上传文件(可选,需配置写权限)
# anonymous_enable_write_enable=YES # 一般不建议开启,有安全风险
# 匿名用户可下载的目录(通常是 /var/ftp/pub)
# 确保 pub 目录存在且有读权限
anon_upload_enable=NO # 是否允许匿名上传(默认NO,较安全)
anon_mkdir_write_enable=NO # 是否允许匿名创建目录
anon_other_write_enable=NO # 是否允许其他写操作(删除、重命名等)
# 本地用户默认被 chroot(见下文)
local_enable=YES
write_enable=YES
2. 设置目录权限
sudo chmod 755 /var/ftp
sudo chmod 755 /var/ftp/pub
sudo chown ftp:ftp /var/ftp/pub # 通常 ftp 用户和组拥有 /var/ftp
如果你想允许匿名用户上传文件,可以设置:
sudo mkdir /var/ftp/upload sudo chmod 777 /var/ftp/upload然后在配置中设置:
anon_upload_enable=YES
3. 重启 vsftpd
sudo systemctl restart vsftpd
4. 测试匿名登录
在 Windows 资源管理器地址栏输入:
ftp://你的服务器IP
或使用 FTP 客户端(如 FileZilla)使用:
-
用户名:
anonymous -
密码:任意(或留空)
三、配置本地用户(实名用户)访问
本地用户指的是系统上已有的普通用户(如 user1),他们可以使用自己的用户名和密码登录 FTP,并默认访问自己的家目录(如 /home/user1)。
1. 确保配置中启用了本地用户
在 /etc/vsftpd/vsftpd.conf中确保有以下配置:
local_enable=YES # 允许本地用户登录
write_enable=YES # 允许本地用户写入(上传/删除等)
local_umask=022 # 设置默认文件权限,如 644、755
2. 创建一个系统用户(如果还没有)
sudo useradd user1
sudo passwd user1
默认情况下,用户登录 FTP 后会进入其家目录
/home/user1,并且被 chroot(限制在其家目录,无法访问上级目录)。
3. (可选)限制用户只能访问自己的家目录(chroot)
默认情况下,vsftpd 允许通过配置限制本地用户在其家目录(chroot jail),确保配置中有:
chroot_local_user=YES # 将所有本地用户限制在自己的家目录
allow_writeable_chroot=YES # 如果用户家目录可写,必须加上这一项
如果只想对某些用户 chroot,可以设置
chroot_list_enable=YES和chroot_list_file=/etc/vsftpd/chroot_list,详见后文"访问控制"。
4. 重启服务
sudo systemctl restart vsftpd
5. 测试登录
使用 FTP 客户端或命令行:
ftp 你的服务器IP
输入刚才创建的用户名和密码,测试是否可以上传/下载文件。
四、配置虚拟用户(Virtual Users)
虚拟用户不在系统用户中,更加安全,适合多用户管理,每个虚拟用户可以有自己的家目录和权限。
1. 安装相关工具(db_load 用于生成数据库)
CentOS 7 默认有 db4-utils或 db5.3-utils,可以用来生成用户认证的数据库文件。
sudo yum install db4-utils -y
如果提示没有
db4-utils,可以试:
sudo yum install db5.3-utils -y
2. 创建虚拟用户账号文件
创建文本文件,每行一个用户,奇数行为用户名,偶数行为密码:
sudo vi /etc/vsftpd/virtual_users.txt
内容示例:
ftpuser1
password123
ftpuser2
abc456
3. 生成数据库文件
sudo db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
设置权限:
sudo chmod 600 /etc/vsftpd/virtual_users.db
4. 配置 vsftpd 使用虚拟用户
编辑主配置文件:
sudo vi /etc/vsftpd/vsftpd.conf
确保有以下配置:
anonymous_enable=NO # 禁用匿名登录
local_enable=NO # 禁用本地系统用户登录
# 启用虚拟用户
guest_enable=YES # 启用虚拟用户映射为"guest"用户
guest_username=ftp # 虚拟用户映射到的系统用户(如 ftp,需存在)
user_config_dir=/etc/vsftpd/user_conf # 每个虚拟用户的个性化配置目录
# PAM 认证使用虚拟用户数据库
pam_service_name=vsftpd.virtual
注意:你需要创建一个 PAM 配置文件来使用虚拟用户数据库。
5. 创建 PAM 配置文件
sudo vi /etc/pam.d/vsftpd.virtual
内容如下:
auth required pam_userdb.so db=/etc/vsftpd/virtual_users
account required pam_userdb.so db=/etc/vsftpd/virtual_users
注意:这里的
virtual_users是不带.db后缀的数据库名。
如果你的数据库是/etc/vsftpd/virtual_users.db,则上面写db=/etc/vsftpd/virtual_users即可,pam_userdb 会自动加后缀。
6. 创建虚拟用户配置目录及个性化配置
sudo mkdir /etc/vsftpd/user_conf
为每个虚拟用户创建一个配置文件,如 ftpuser1:
sudo vi /etc/vsftpd/user_conf/ftpuser1
内容示例:
local_root=/var/ftp/ftpuser1
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=NO
local_root:该虚拟用户登录后看到的根目录,比如/var/ftp/ftpuser1你需要提前创建该目录并设置权限:
sudo mkdir -p /var/ftp/ftpuser1
sudo chown ftp:ftp /var/ftp/ftpuser1
sudo chmod 755 /var/ftp/ftpuser1
7. 重启 vsftpd
sudo systemctl restart vsftpd
8. 测试虚拟用户登录
使用 FTP 客户端,输入:
-
用户名:
ftpuser1 -
密码:
password123
应该能登录到 /var/ftp/ftpuser1目录,并可上传文件(如果配置了 write_enable=YES)。
五、访问控制
1. 限制用户只能访问自己的目录(chroot)
在 /etc/vsftpd/vsftpd.conf中添加或确保有:
chroot_local_user=YES
allow_writeable_chroot=YES
如果只想对部分用户进行 chroot,使用:
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
然后创建 /etc/vsftpd/chroot_list文件,每行一个要限制的用户:
sudo vi /etc/vsftpd/chroot_list
内容:
user1
user2
2. 禁止某些 IP 访问(可通过防火墙或 TCP Wrappers)
-
使用 防火墙(firewalld/iptables) 限制 IP 访问 FTP 的 21 端口。
-
或编辑
/etc/hosts.allow和/etc/hosts.deny(如果 vsftpd 支持 tcp_wrappers)。
3. 限制上传/下载
在用户配置文件(如 /etc/vsftpd/user_conf/username)中设置:
write_enable=YES|NO # 是否允许上传
anon_upload_enable=NO # 匿名上传
local_enable=YES # 本地用户
六、总结:FTP 服务配置对比表
| 功能 | 配置要点 | 适用场景 |
|---|---|---|
| 匿名用户 | anonymous_enable=YES,目录 /var/ftp/pub,权限设置 |
提供公共文件下载 |
| 本地用户(实名) | local_enable=YES,用户用自己的系统账号登录,限制家目录(chroot) |
内部员工使用自己账号访问 |
| 虚拟用户 | 使用独立数据库(db),通过 pam_userdb认证,每个用户可单独配置 |
多租户、外部客户、更安全灵活 |
| 访问控制 | chroot、防火墙、hosts.allow/deny、限制上传/下载 | 增强安全性,防止越权访问 |
七、防火墙放行 FTP
FTP 默认使用 21 端口(控制连接) ,如果使用主动模式还可能用到 20 端口(数据连接),被动模式会使用随机高端口。
建议使用 被动模式(pasv),并配置端口范围:
在 /etc/vsftpd/vsftpd.conf中添加:
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
然后放行防火墙:
sudo firewall-cmd --permanent --add-port=21/tcp
sudo firewall-cmd --permanent --add-port=30000-31000/tcp
sudo firewall-cmd --reload
八、总结一句话
在 CentOS 7 上配置 FTP 服务器(vsftpd) ,可以通过修改
/etc/vsftpd/vsftpd.conf启用 匿名用户、本地用户、虚拟用户 ,并通过 chroot、权限控制、防火墙 实现访问限制,其中 虚拟用户 更加安全灵活,适合生产环境多用户管理。