在Linux系统中搭建和启动FTP服务器是许多企业和个人用户在文件共享、数据传输方面的常见需求,FTP(File Transfer Protocol,文件传输协议)是一种标准的网络协议,用于在客户端和服务器之间传输文件,Linux系统下有多种FTP服务器软件可供选择,如vsftpd(Very Secure FTP Daemon)、ProFTPD、Pure-FTPd等,其中vsftpd因其安全性高、性能稳定、配置简单而成为最受欢迎的选择,下面将详细介绍在Linux系统中使用vsftpd搭建和启动FTP服务器的完整步骤,包括安装、配置、启动及常见问题处理。

安装vsftpd服务
在开始之前,需要确保系统已经连接到互联网,并且具有管理员权限(root或sudo用户),不同Linux发行版的包管理器不同,安装命令也有所差异,以常见的CentOS/RHEL和Ubuntu/Debian为例:
-
对于CentOS/RHEL系统:使用
yum或dnf包管理器安装,在CentOS 7及以下版本中使用yum,CentOS 8及以上版本使用dnf,执行以下命令:sudo yum install vsftpd -y # CentOS 7及以下 # 或 sudo dnf install vsftpd -y # CentOS 8及以上
-
对于Ubuntu/Debian系统:使用
apt包管理器安装,首先更新软件包列表,然后安装vsftpd:sudo apt update sudo apt install vsftpd -y
安装完成后,vsftpd服务通常会自动启动,但为了确保服务状态,可以通过以下命令检查:

sudo systemctl status vsftpd
如果服务未运行,可以使用sudo systemctl start vsftpd启动,并使用sudo systemctl enable vsftpd设置开机自启。
配置vsftpd服务器
vsftpd的配置文件位于/etc/vsftpd/vsftpd.conf,默认情况下,vsftpd采用较为严格的配置,可能限制匿名用户访问和本地用户登录,根据实际需求,需要对配置文件进行修改,以下是关键配置项的说明及示例:
允许匿名用户访问
默认情况下,匿名用户被禁止访问,如果需要允许匿名用户下载文件,可以修改以下配置:
anonymous_enable=YES # 允许匿名用户登录 anon_upload_enable=YES # 允许匿名用户上传文件(需谨慎,可能带来安全风险) anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_umask=022 # 匿名用户上传文件的默认权限掩码
注意:允许匿名用户上传会带来安全风险,建议仅在受信任的网络环境中启用,并限制上传目录的权限。
允许本地用户访问
默认情况下,本地用户(系统中的合法用户)可以登录FTP服务器,如果需要禁止本地用户登录,设置local_enable=NO,反之则设置为YES:
local_enable=YES # 允许本地用户登录 write_enable=YES # 允许本地用户上传和修改文件 local_umask=022 # 本地用户上传文件的默认权限掩码
限制用户访问目录
出于安全考虑,通常需要将FTP用户限制在其主目录(home directory)中,防止其访问系统其他目录,可以通过以下配置实现:
chroot_local_user=YES # 将本地用户限制在其主目录中 allow_writeable_chroot=YES # 允许被限制在主目录中的用户具有写权限(vsftpd 3.2.0及以上版本需要)
注意:如果使用旧版本的vsftpd,allow_writeable_chroot=YES可能会导致无法登录,此时需要确保用户主目录的权限设置正确(主目录及其父目录的权限不应为777)。
配置用户列表
vsftpd支持通过用户列表控制哪些用户可以登录FTP服务器,默认情况下,用户列表文件为/etc/vsftpd/user_list,可以通过以下配置启用用户列表:
userlist_enable=YES # 启用用户列表 userlist_file=/etc/vsftpd/user_list # 指定用户列表文件路径 userlist_deny=NO # 仅允许用户列表中的用户登录(设置为YES则禁止列表中的用户登录)
在/etc/vsftpd/user_list文件中,每行输入一个允许登录的用户名,
user1
user2
配置FTP目录和权限
建议为FTP服务创建专用的目录,例如/home/ftp,并设置适当的权限。
sudo mkdir -p /home/ftp/pub sudo chmod 755 /home/ftp sudo chmod 755 /home/ftp/pub sudo chown -R ftp:ftp /home/ftp # 将目录所有者设置为ftp用户(如果系统中有ftp用户)
如果需要本地用户上传文件到指定目录,可以在用户主目录中创建一个上传目录,并设置权限:
sudo mkdir -p /home/user1/upload sudo chmod 755 /home/user1 sudo chmod 755 /home/user1/upload sudo chown user1:user1 /home/user1/upload
其他安全配置
为了增强FTP服务器的安全性,建议修改以下配置:
anonymous_enable=NO # 禁止匿名用户登录 local_enable=YES # 允许本地用户登录 write_enable=YES # 允许本地用户上传和修改文件 local_umask=022 # 本地用户上传文件的默认权限掩码 dirmessage_enable=YES # 启用目录消息(例如显示欢迎信息) xferlog_enable=YES # 启用传输日志 xferlog_std_format=YES # 使用标准日志格式 listen=YES # 以独立模式运行(不使用xinetd) listen_ipv6=NO # 禁用IPv6支持(如果不需要) pam_service_name=vsftpd # 指定PAM认证服务的名称 tcp_wrappers=YES # 启用TCP Wrappers访问控制
配置完成后,保存并关闭配置文件。
启动vsftpd服务并设置开机自启
完成配置后,需要重启vsftpd服务以使配置生效,执行以下命令:
sudo systemctl restart vsftpd
为了确保FTP服务器在系统重启后自动启动,可以使用以下命令设置开机自启:
sudo systemctl enable vsftpd
如果需要停止FTP服务器,执行:
sudo systemctl stop vsftpd
配置防火墙和SELinux(如果启用)
Linux系统默认会启用防火墙(如iptables、firewalld)和SELinux安全模块,这些安全机制可能会阻止FTP服务的访问,需要进行相应配置以允许FTP流量通过。
配置防火墙
-
对于使用firewalld的系统(如CentOS 7/RHEL 7、Fedora): 执行以下命令允许FTP服务的流量通过:
sudo firewall-cmd --permanent --add-service=ftp sudo firewall-cmd --reload
-
对于使用iptables的系统(如CentOS 6/RHEL 6、Ubuntu旧版本): 编辑iptables规则文件(如
/etc/sysconfig/iptables),添加以下规则:-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 1024:65535 -j ACCEPT # 被动模式端口范围
保存文件后,重启iptables服务:
sudo service iptables restart
配置SELinux
如果系统启用了SELinux(默认在CentOS/RHEL系统中启用),需要设置SELinux策略以允许FTP服务访问文件系统,执行以下命令:
sudo setsebool -P ftpd_full_access on
或者,如果只需要允许FTP用户访问特定目录,可以使用以下命令:
sudo semanage fcontext -a -t public_content_rw_t "/home/ftp/pub(/.*)?" sudo restorecon -Rv /home/ftp/pub
配置完成后,重启vsftpd服务:
sudo systemctl restart vsftpd
测试FTP服务器
完成上述配置后,可以使用FTP客户端工具测试服务器是否正常运行,常用的FTP客户端包括命令行工具(如ftp、lftp)和图形化工具(如FileZilla)。
使用命令行工具测试
在本地或另一台计算机上,执行以下命令连接FTP服务器:
ftp 服务器IP地址
ftp 192.168.1.100
如果允许匿名用户登录,可以直接输入anonymous作为用户名,任意邮箱地址作为密码;如果是本地用户登录,输入用户名和密码,登录成功后,可以使用以下命令:
ls:列出文件列表get 文件名:下载文件put 文件名:上传文件quit:退出FTP连接
使用FileZilla测试
打开FileZilla,在主机地址栏输入FTP服务器的IP地址,用户名和密码根据登录类型选择(匿名用户或本地用户),端口默认为21,连接成功后,即可在图形界面中进行文件上传和下载操作。
常见问题及解决方法
在启动和使用FTP服务器时,可能会遇到一些常见问题,以下列出几个典型问题及解决方法:
问题1:无法连接到FTP服务器,提示“Connection refused”
原因分析:
- vsftpd服务未启动或未正确配置。
- 防火墙阻止了FTP端口(21端口和被动模式端口)的访问。
- SELinux策略阻止了FTP服务。
解决方法:
- 检查vsftpd服务状态:
sudo systemctl status vsftpd
如果未启动,执行
sudo systemctl start vsftpd并设置开机自启。 - 检查防火墙配置,确保允许FTP服务通过(参考“配置防火墙”部分)。
- 如果启用了SELinux,执行
sudo setsebool -P ftpd_full_access on并重启服务。
问题2:本地用户无法登录FTP服务器,提示“530 Login incorrect”
原因分析:
- 用户名或密码错误。
- 用户被禁止登录(例如在
/etc/vsftpd/user_list中或/etc/vsftpd/ftpusers中)。 - 用户主目录权限设置不正确(例如主目录权限为777)。
- vsftpd配置文件中
local_enable=NO。
解决方法:
- 确认用户名和密码是否正确。
- 检查
/etc/vsftpd/user_list和/etc/vsftpd/ftpusers文件,确保用户未被禁止登录,注意:/etc/vsftpd/ftpusers文件中的用户默认被禁止登录,即使未在user_list中设置。 - 检查用户主目录权限,确保主目录及其父目录的权限不是777。
sudo chmod 755 /home/username
- 检查
/etc/vsftpd/vsftpd.conf文件,确保local_enable=YES。
相关问答FAQs
问题1:如何限制FTP用户只能访问其主目录,但不能切换到上级目录?
解答:通过设置chroot_local_user=YES可以将本地用户限制在其主目录中,需要确保用户主目录的权限设置正确,主目录的权限不应为777(例如设置为755),否则vsftpd可能会拒绝用户登录,对于vsftpd 3.2.0及以上版本,还需要设置allow_writeable_chroot=YES以允许被限制在主目录中的用户具有写权限。
问题2:如何启用FTP的被动模式(Passive Mode)?
解答:被动模式可以解决客户端在NAT网络环境下的连接问题,在/etc/vsftpd/vsftpd.conf文件中添加以下配置:
pasv_enable=YES # 启用被动模式 pasv_min_port=10000 # 被动模式的最小端口 pasv_max_port=10100 # 被动模式的最大端口
然后重启vsftpd服务:
sudo systemctl restart vsftpd
需要在防火墙中开放被动模式的端口范围(例如10000-10100),以确保数据传输能够正常进行,在firewalld中执行:
sudo firewall-cmd --permanent --add-port=10000-10100/tcp sudo firewall-cmd --reload
