在Linux系统中,FTP(File Transfer Protocol)是一种常用的文件传输协议,用于在客户端和服务器之间进行文件上传和下载,本文将以CentOS和Ubuntu两大主流发行版为例,详细介绍如何通过vsftpd(Very Secure FTP Daemon)这一轻量级、安全的FTP服务器软件开启FTP服务,涵盖安装、配置、权限管理、防火墙设置及常见问题排查等关键步骤。
准备工作:确认系统环境与需求
在开始配置前,需明确以下几点:
- 系统版本:本文以CentOS 7/8(使用yum/dnf包管理器)和Ubuntu 20.04/22.04(使用apt包管理器)为例,其他发行版命令可能略有差异。
- 网络连接:确保服务器可正常访问外网,以便下载软件包。
- 用户权限:建议使用root用户或具有sudo权限的用户进行操作,避免权限不足导致配置失败。
安装vsftpd软件包
vsftpd是Linux下最常用的FTP服务器之一,以其安全性和稳定性著称。
CentOS/RHEL系统
# 更新软件包缓存 sudo yum update -y # 安装vsftpd sudo yum install vsftpd -y
Ubuntu/Debian系统
# 更新软件包列表 sudo apt update # 安装vsftpd sudo apt install vsftpd -y
安装完成后,可通过以下命令检查vsftpd是否成功安装:
vsftpd --version
启动并设置开机自启
安装完成后,需启动vsftpd服务并设置为开机自启,确保服务器重启后服务依然可用。
CentOS/RHEL系统(使用systemctl)
# 启动vsftpd服务 sudo systemctl start vsftpd # 设置开机自启 sudo systemctl enable vsftpd # 检查服务状态(确保显示active (running)) sudo systemctl status vsftpd
Ubuntu/Debian系统(同样使用systemctl)
命令与CentOS一致,具体操作参考上述内容。
配置vsftpd核心参数
vsftpd的配置文件位于/etc/vsftpd/vsftpd.conf
,默认配置较为严格,需根据需求修改关键参数,建议先备份原配置文件:
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
以下为常用配置参数及其作用,可通过sudo vim /etc/vsftpd/vsftpd.conf
编辑文件,根据需求取消注释或修改值:
参数名 | 默认值 | 说明 |
---|---|---|
anonymous_enable | NO | 是否允许匿名用户登录(默认禁止,建议保持关闭) |
local_enable | YES | 是否允许本地系统用户登录 |
write_enable | YES | 是否允许本地用户上传、修改文件(需配合write_list参数控制) |
local_umask | 022 | 本地用户上传文件后的默认权限掩码(例如022表示644权限) |
dirmessage_enable | YES | 是否显示目录消息(message文件内容) |
xferlog_enable | YES | 是否启用传输日志(记录到/var/log/xferlog) |
connect_from_port_20 | YES | 是否使用20端口进行数据连接(主动模式需开启) |
chroot_local_user | NO | 是否将本地用户限制在其家目录中(安全关键,建议开启) |
allow_writeable_chroot | NO | 是否允许chroot目录可写(需配合chroot_local_user=YES,否则可能报错) |
pasv_enable | NO | 是否启用被动模式(客户端防火墙环境建议开启) |
pasv_min_port | (空) | 被动模式最小端口(建议设置10000-20000范围内,避免冲突) |
pasv_max_port | (空) | 被动模式最大端口(与pasv_min_port组成端口范围) |
userlist_enable | YES | 是否启用用户列表文件(/etc/vsftpd/user_list) |
userlist_file | /etc/vsftpd/user_list | 用户列表文件路径 |
tcp_wrappers | YES | 是否使用TCP Wrappers主机访问控制(建议保持默认,通过hosts.allow/deny控制) |
关键配置示例(基础安全配置):
# 禁止匿名用户登录 anonymous_enable=NO # 允许本地用户登录 local_enable=YES # 允许用户上传文件 write_enable=YES # 限制用户在家目录(安全措施) chroot_local_user=YES allow_writeable_chroot=YES # 启用被动模式(避免客户端防火墙问题) pasv_enable=YES pasv_min_port=10000 pasv_max_port=20000 # 禁止root用户登录(可选) userlist_enable=YES userlist_file=/etc/vsftpd/user_list userlist_deny=YES
保存配置文件后,重启vsftpd服务使配置生效:
sudo systemctl restart vsftpd
创建FTP用户并设置权限
默认情况下,系统用户可通过FTP登录,但出于安全考虑,建议为FTP服务创建专用用户,并限制其访问目录。
创建FTP专用用户
# 创建用户(例如ftpuser),家目录为/ftpdata(可自定义) sudo useradd -m -d /ftpdata -s /sbin/nologin ftpuser # 设置用户密码 sudo passwd ftpuser
说明:
-s /sbin/nologin
表示禁止用户通过SSH等方式登录系统,仅允许FTP访问。
设置用户目录权限
# 创建FTP数据目录(若不存在) sudo mkdir -p /ftpdata # 设置目录所有者为ftpuser,权限为755 sudo chown -R ftpuser:ftpuser /ftpdata sudo chmod -R 755 /ftpdata
限制用户访问范围(可选)
如果需要将用户限制在指定子目录(例如/ftpdata/user1
),可通过以下方式实现:
# 创建子目录并设置权限 sudo mkdir -p /ftpdata/user1 sudo chown -R ftpuser:ftpuser /ftpdata/user1 sudo chmod -R 755 /ftpdata/user1 # 修改用户家目录为子目录(需重启服务生效) sudo usermod -d /ftpdata/user1 ftpuser
配置防火墙与SELinux
防火墙配置
FTP服务默认使用21端口(命令连接),若启用被动模式,还需开放配置的端口范围(如10000-20000)。
CentOS/RHEL(firewalld)
# 开放FTP服务(自动处理21端口和数据连接端口) sudo firewall-cmd --permanent --add-service=ftp # 开放被动模式端口范围(若自定义了端口范围需单独开放) sudo firewall-cmd --permanent --add-port=10000-20000/tcp # 重新加载防火墙规则 sudo firewall-cmd --reload
Ubuntu(ufw)
# 开放21端口(FTP命令连接) sudo ufw allow 21/tcp # 开放被动模式端口范围 sudo ufw allow 10000:20000/tcp # 启用防火墙(若未启用) sudo ufw enable
SELinux配置(仅CentOS/RHEL)
CentOS默认开启SELinux,可能阻止FTP服务访问用户目录,需设置布尔值允许FTP写入:
# 查看当前SELinux状态(应为 enforcing 或 permissive) sestatus # 设置允许FTP用户访问家目录(-P表示永久生效) sudo setsebool -P ftpd_full_access on
测试FTP服务连接
命令行测试(Linux客户端)
# 安装ftp客户端(Ubuntu/Debian) sudo apt install ftp -y # 连接FTP服务器(替换为服务器IP) ftp 192.168.1.100 # 输入用户名和密码,登录后可通过以下命令测试: ls # 列出文件 put test.txt # 上传文件(需write_enable=YES) get test.txt # 下载文件 bye # 退出
图形化工具测试(Windows客户端)
推荐使用FileZilla,输入服务器IP、用户名、密码,端口选择21(主动模式)或自动检测(被动模式),连接成功后即可拖拽文件传输。
常见问题排查
- 连接超时或拒绝连接:检查防火墙是否开放21端口和被动模式端口,确认vsftpd服务是否运行(
systemctl status vsftpd
)。 - 530 Login incorrect错误:确认用户名密码正确,检查
/etc/vsftpd/ftpusers
和/etc/vsftpd/user_list
文件中是否包含该用户(默认禁止root登录)。 - 500 OOPS: vsftpd: refusing to run with writable root inside chroot()错误:修改
allow_writeable_chroot=YES
。 - 被动模式连接失败:确认防火墙开放了
pasv_min_port
和pasv_max_port
设置的端口范围,客户端选择被动模式。
相关问答FAQs
问题1:如何禁止特定用户通过FTP登录?
解答:可通过/etc/vsftpd/user_list
文件控制,编辑该文件,将需要禁止的用户名添加到一行(每行一个用户),并在vsftpd.conf
中确保userlist_enable=YES
和userlist_deny=YES
(默认禁止列表中的用户登录),重启vsftpd服务即可生效。
问题2:如何配置匿名用户只读访问?
解答:在vsftpd.conf
中设置anonymous_enable=YES
,并添加以下参数限制匿名用户权限:
anon_upload_enable=NO # 禁止匿名用户上传 anon_mkdir_write_enable=NO # 禁止匿名用户创建目录 anon_other_write_enable=NO # 禁止匿名用户删除/重命名文件
重启服务后,匿名用户可下载文件但无法修改。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/33130.html