在Linux服务器上配置FTP服务是常见的文件传输需求,本文将以vsftpd(Very Secure FTP Daemon)为例,详细讲解从安装配置到安全加固的完整流程,vsftpd是一个轻量级、高性能且安全的FTP服务器软件,适用于大多数Linux发行版。
安装vsftpd
首先需要根据服务器操作系统安装vsftpd包,以CentOS/RHEL和Ubuntu/Debian为例:
- CentOS/RHEL系统:
sudo yum install vsftpd -y # CentOS 7及以下 sudo dnf install vsftpd -y # CentOS 8/RHEL 8+
- Ubuntu/Debian系统:
sudo apt update sudo apt install vsftpd -y
安装完成后,启动vsftpd服务并设置为开机自启:
sudo systemctl start vsftpd sudo systemctl enable vsftpd
主配置文件解析
vsftpd的主配置文件位于/etc/vsftpd/vsftpd.conf,以下是关键参数说明及推荐配置:
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
| anonymous_enable | YES | NO | 是否允许匿名用户访问 |
| local_enable | YES | YES | 是否允许本地用户登录 |
| write_enable | NO | YES | 是否允许文件写入 |
| chroot_local_user | NO | YES | 是否将用户限制在主目录 |
| allow_writeable_chroot | NO | YES | 是否允许chroot目录可写(需配合write_enable) |
| pasv_enable | YES | YES | 是否启用被动模式 |
| pasv_min_port | 0 | 60000 | 被动模式最小端口 |
| pasv_max_port | 0 | 60100 | 被动模式最大端口 |
| userlist_enable | YES | YES | 启用用户列表控制 |
| userlist_file | /etc/vsftpd/user_list | /etc/vsftpd/user_list | 用户列表文件路径 |
| tcp_wrappers | YES | YES | 是否使用TCP Wrappers访问控制 |
建议备份原始配置文件后进行修改:
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak sudo nano /etc/vsftpd/vsftpd.conf
创建FTP用户
-
创建系统用户(推荐使用非特权用户):
sudo useradd -m -s /sbin/nologin ftpuser sudo passwd ftpuser
-m:自动创建用户主目录-s /sbin/nologin:禁止SSH登录,仅允许FTP
-
设置用户主目录权限:
sudo chmod 755 /home/ftpuser sudo chown ftpuser:ftpuser /home/ftpuser
-
限制用户访问特定目录(可选): 若需将用户限制在指定目录(如
/var/ftp/files),可创建用户时指定:sudo useradd -m -d /var/ftp/files -s /sbin/nologin ftpuser sudo mkdir -p /var/ftp/files sudo chown ftpuser:ftpuser /var/ftp/files
配置防火墙与SELinux
-
防火墙规则(以firewalld为例):
sudo firewall-cmd --permanent --add-service=ftp sudo firewall-cmd --permanent --add-port=20/tcp sudo firewall-cmd --permanent --add-port=21/tcp sudo firewall-cmd --permanent --add-port=60000-60100/tcp sudo firewall-cmd --reload
-
SELinux配置(CentOS/RHEL系统):
sudo setsebool -P ftpd_full_access on sudo semanage port -a -t ftp_port_t -p tcp 60000-60100
安全加固措施
-
禁用匿名访问: 在
vsftpd.conf中设置:anonymous_enable=NO
-
启用用户列表控制: 编辑
/etc/vsftpd/user_list,添加允许登录的用户名(每行一个):echo "ftpuser" | sudo tee -a /etc/vsftpd/user_list
-
禁用ASCII模式上传:
ascii_upload_enable=NO ascii_download_enable=NO
-
配置日志记录:
xferlog_enable=YES xferlog_file=/var/log/xferlog dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd.log
-
限制IP访问: 编辑
/etc/hosts.deny和/etc/hosts.allow:# /etc/hosts.deny vsftpd: ALL # /etc/hosts.allow vsftpd: 192.168.1.0/24 # 仅允许内网IP访问
重启服务与测试
完成配置后重启vsftpd服务:
sudo systemctl restart vsftpd
使用FileZilla或命令行工具测试连接:
ftp 192.168.1.100
输入用户名和密码后,使用ls、put、get等命令验证功能。
常见问题排查
- 连接超时:检查防火墙和被动模式端口配置。
- 权限拒绝:确认用户目录权限(755)和文件所有权。
- SELinux报错:使用
ausearch -m avc -ts recent查看日志并调整策略。
相关问答FAQs
Q1: 如何限制FTP用户只能上传文件而不能下载?
A1: 在vsftpd.conf中添加以下配置:
download_enable=NO
然后重启服务,这样所有用户均无法下载文件,若需针对特定用户限制,可使用user_config_dir参数创建用户配置文件,在文件中设置download_enable=NO。
Q2: 配置完成后,客户端连接时提示“530 Login incorrect”怎么办?
A2: 可能原因及解决方案:
- 用户名或密码错误:确认用户是否在
/etc/vsftpd/user_list中或/etc/passwd存在。 - PAM认证问题:检查
/etc/pam.d/vsftpd配置,确保未禁用系统认证。 - SELinux拦截:执行
ausearch -m avc -ts recent查看日志,若涉及SELinux,使用setsebool -P ftpd_full_access on调整。 - 主目录权限问题:确保用户主目录权限为755,所有者为该用户。
