CentOS 上配置 SFTP 的实用步骤
一 环境准备与安装
- 更新系统并安装 OpenSSH 服务器(SFTP 基于 SSH 提供):
- 命令:sudo yum update -y && sudo yum install -y openssh-server
- 启动并设置开机自启:
- 命令:sudo systemctl start sshd && sudo systemctl enable sshd
- 检查服务状态:
- 命令:sudo systemctl status sshd(应显示 Active: active (running))
- 放行防火墙(默认端口 22):
- 命令:sudo firewall-cmd --permanent --add-service=ssh && sudo firewall-cmd --reload
- 说明:CentOS 7/8 默认使用 firewalld;如使用其他防火墙,请放行对应端口。
二 基本 SFTP 使用与连接
- SFTP 随 OpenSSH 提供,安装后即可使用,默认端口 22。
- 客户端连接示例:
- 命令:sftp username@server_ip
- 在交互式会话中可用:ls、cd、get、put、pwd、lpwd 等命令进行文件传输与浏览。
- 如需更改默认端口(例如 2222),在 /etc/ssh/sshd_config 中设置 Port 2222 并重启 sshd,同时防火墙放行新端口。
三 推荐做法 限制用户仅 SFTP 并 Chroot 到其主目录
- 创建 SFTP 专用组与用户:
- 命令:sudo groupadd sftpusers
- 命令:sudo useradd -m -G sftpusers -s /sbin/nologin sftpuser
- 命令:sudo passwd sftpuser
- 调整目录权限以满足 Chroot 要求(关键):
- 原则:Chroot 根目录及其上级目录必须由 root 拥有,且不可对组和其他人有写权限(常见权限为 755)。
- 命令:sudo chown root:root /home/sftpuser && sudo chmod 755 /home/sftpuser
- 为用户创建可写子目录(例如 uploads):
- 命令:sudo mkdir -p /home/sftpuser/uploads
- 命令:sudo chown sftpuser:sftpusers /home/sftpuser/uploads && sudo chmod 755 /home/sftpuser/uploads
- 配置 /etc/ssh/sshd_config(建议放在文件末尾,避免与全局指令冲突):
- 建议启用内置 SFTP 子进程:Subsystem sftp internal-sftp
- 限制示例(按用户组):
- Match Group sftpusers
- ChrootDirectory %h
- ForceCommand internal-sftp
- AllowTcpForwarding no
- X11Forwarding no
- PermitTTY no
- 使配置生效:
- 语法检查:sudo sshd -t
- 重载服务:sudo systemctl reload sshd
- 说明:使用 internal-sftp 便于在 Chroot 环境下工作;Chroot 目录权限不当常见报错为 Broken pipe 或 Connection reset by peer。
四 常见故障排查与优化
- 配置语法与目录权限检查:
- 修改后先执行:sudo sshd -t(语法无误再重载);Chroot 根目录及路径上各级目录必须为 root 所有且不可被组/其他写入(权限通常为 755),否则会出现写入失败或连接异常。
- SELinux 导致无法写入或异常:
- 临时:sudo setenforce 0
- 永久:编辑 /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=permissive 或 disabled,重启生效(生产环境请评估安全影响)。
- 高并发连接失败(如 “connection is closed by foreign host”):
- 在 /etc/ssh/sshd_config 调整:
- MaxStartups 1000:30:1200
- MaxSessions 1000
- 重载:sudo systemctl reload sshd。
- 修改端口后无法连接:
- 确认 sshd_config 的 Port 已改,且防火墙已放行新端口,然后重启 sshd。