CentOS 7 搭建 FTP/SFTP 服务完整记录
本文档记录了在 CentOS 7 服务器上从零搭建 FTP(vsftpd)和 SFTP(基于 SSH)服务的完整过程,包括遇到的问题及解决方案。
一、服务器基础信息
- 操作系统:CentOS Linux 7 (Core)
- 内核:3.10.0-1160.119.1.el7.x86_64
- 架构:x86_64
- 公网 IP:47.116.36.235
二、搭建 FTP 服务(vsftpd)
2.1 安装 vsftpd
bash
yum install -y vsftpd
rpm -qa | grep vsftpd # 验证安装2.2 创建 FTP 用户(ftpuser)
bash
# 创建用户,禁止 shell 登录
useradd -d /home/ftpuser -s /sbin/nologin ftpuser
# 设置强密码(注意特殊字符用单引号)
echo 'VXEF$j!iA>KTwkHkP1F)$7to+U;x=zSdKY' | passwd --stdin ftpuser
# 创建家目录并设置权限
mkdir -p /home/ftpuser
chown ftpuser:ftpuser /home/ftpuser
chmod 750 /home/ftpuser2.3 配置 vsftpd
编辑 /etc/vsftpd/vsftpd.conf:
bash
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
vim /etc/vsftpd/vsftpd.conf关键配置项:
ini
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES # 允许 chroot 目录可写
check_shell=NO # 允许使用 /sbin/nologin 的用户登录
# 被动模式端口范围
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=310002.4 启动 vsftpd 服务
bash
systemctl start vsftpd
systemctl enable vsftpd
systemctl status vsftpd2.5 防火墙与 SELinux
防火墙(firewalld)
如果未运行,可忽略或启用:
bash
systemctl start firewalld
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=30000-31000/tcp
firewall-cmd --reload云服务器:需在安全组放行 TCP 21、30000-31000 端口。
SELinux(已禁用)
bash
getenforce # 若显示 Disabled,无需配置2.6 测试 FTP 连接
bash
yum install -y ftp
ftp localhost
# 输入用户名 ftpuser 和密码三、遇到的问题及解决
问题 1:ftpuser 登录提示 This account is currently not available.
原因:用户 shell 为 /sbin/nologin,vsftpd 默认检查 shell 有效性。
解决:在 /etc/vsftpd/vsftpd.conf 中添加 check_shell=NO,重启 vsftpd。
问题 2:本地 ftp 命令未找到
解决:安装 ftp 客户端 yum install -y ftp。
问题 3:WinSCP 使用 SFTP 连接时提示 Received too large SFTP packet / 无法初始化SFTP协议
原因:服务器未正确配置 SFTP 子系统,或用户 shell 启动脚本输出文本。
解决:配置 SSH 的 SFTP 子系统(见第四部分)。
问题 4:修改 /etc/ssh/sshd_config 后 SSH 重启失败
错误信息:
/etc/ssh/sshd_config line 143: Subsystem 'sftp' already defined.原因:Subsystem sftp 被定义了两次。
解决:
bash
# 注释掉原有的 Subsystem 行
sed -i 's/^Subsystem sftp/#&/' /etc/ssh/sshd_config
# 添加 internal-sftp
echo "Subsystem sftp internal-sftp" >> /etc/ssh/sshd_config
sshd -t && systemctl restart sshd四、配置 SFTP 服务(基于 SSH)
4.1 创建 SFTP 用户组
bash
groupadd sftp_users4.2 编辑 SSH 配置文件 /etc/ssh/sshd_config
bash
vim /etc/ssh/sshd_config确保以下配置存在(注意缩进):
bash
# 启用 internal-sftp 子系统
Subsystem sftp internal-sftp
# 匹配 sftp_users 组,限制用户目录
Match Group sftp_users
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
PermitTTY no注意:
Subsystem只能有一行未被注释。Match块后的指令必须以空格或 Tab 缩进。
4.3 创建目录结构并设置权限
bash
# 为 ftpuser 创建 chroot 目录
mkdir -p /data/sftp/ftpuser/upload
chown root:root /data/sftp/ftpuser
chmod 755 /data/sftp/ftpuser
chown ftpuser:sftp_users /data/sftp/ftpuser/upload4.4 将 ftpuser 加入 sftp_users 组
bash
usermod -aG sftp_users ftpuser4.5 测试 SFTP 连接
bash
sftp ftpuser@localhost
# 输入密码,出现 sftp> 提示符即成功4.6 WinSCP 连接参数
- 协议:SFTP
- 主机:47.116.36.235
- 端口:22
- 用户名:ftpuser
- 密码:设置的密码
五、创建第二个 SFTP 用户(dft)
5.1 创建用户并设置密码
bash
# 创建用户,禁止 shell 登录
useradd -m -d /home/dft -s /sbin/nologin dft
# 设置密码(密码含特殊字符,必须单引号)
echo '^SNq83HcUK^K#OQNmc4qfD6Uj#Yiv6vE' | passwd --stdin dft
# 加入 sftp_users 组
usermod -aG sftp_users dft5.2 创建 SFTP 目录结构
bash
mkdir -p /data/sftp/dft/upload
chown root:root /data/sftp/dft
chmod 755 /data/sftp/dft
chown dft:sftp_users /data/sftp/dft/upload
chmod 750 /data/sftp/dft/upload5.3 测试 dft 用户
bash
sftp dft@localhost
# 输入密码,登录后 pwd 显示 /,ls 看到 upload 目录六、常用维护命令
6.1 服务管理
bash
systemctl status vsftpd # FTP 状态
systemctl restart vsftpd
systemctl status sshd # SSH/SFTP 状态
systemctl restart sshd6.2 日志查看
bash
# vsftpd 日志
tail -f /var/log/xferlog
tail -f /var/log/secure
# SSH 日志
journalctl -u sshd -f6.3 配置文件语法检查
bash
sshd -t # 检查 SSH 配置6.4 用户与权限
bash
# 查看用户组
id ftpuser
# 修改用户密码
passwd ftpuser
# 修改目录权限
chown -R user:group /path/to/dir
chmod 755 /path/to/dir七、安全建议
- 禁用 root 的 SFTP 登录:在
/etc/ssh/sshd_config中添加PermitRootLogin no。 - 使用强密码:避免简单密码,使用特殊字符组合。
- 限制用户目录:始终使用
ChrootDirectory将用户禁锢在自己的目录中。 - 定期更新软件:
yum update vsftpd openssh-server。 - 启用防火墙:仅开放必要的端口(21、22、30000-31000)。
- 考虑 FTPS 或 SFTP:FTP 是明文传输,生产环境建议使用 SFTP 或 FTPS。
文档结束