SFTP基于SSH协议运行,需确保SSH服务已启动并正常运行。
操作命令:
sudo systemctl status sshd
预期结果:显示“active (running)”。若未运行,启动服务并设置开机自启:
sudo systemctl start sshd
sudo systemctl enable sshd
SFTP的核心配置在/etc/ssh/sshd_config中,需检查以下关键项:
internal-sftp或/usr/libexec/openssh/sftp-server)。Subsystem sftp internal-sftp # 推荐使用内置sftp,无需额外安装
Match指令。例如,限制用户sftpuser只能使用SFTP并chroot到/data/sftp/%u:Match User sftpuser
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
操作命令:
sudo sshd -t
sudo systemctl restart sshd
CentOS默认使用firewalld,需确保放行SSH(默认端口22)流量。
操作命令:
sudo systemctl status firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
iptables,需添加规则:sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo service iptables save
日志是排查SFTP问题的关键,可通过以下命令查看实时或历史日志:
sudo tail -f /var/log/secure # CentOS 7/8
# 或
sudo journalctl -u sshd -f # 实时查看ssh服务日志
常见日志错误及解决方向:
确保客户端与服务器之间的网络畅通,且SSH端口(默认22)未被阻塞。
操作命令:
ping <服务器IP>
telnet <服务器IP> 22
# 或使用nc(更现代的工具)
nc -zv <服务器IP> 22
若端口不通:需检查服务器防火墙、路由器ACL或云服务商安全组规则。
root所有,权限设为755(防止用户越权修改目录结构)。sudo chown root:root /home/<用户名>
sudo chmod 755 /home/<用户名>
/data/sftp/<用户名>)需归root所有,权限设为755,且用户不能有写权限(避免逃逸chroot)。sudo mkdir -p /data/sftp/<用户名>
sudo chown root:root /data/sftp/<用户名>
sudo chmod 755 /data/sftp/<用户名>
/data/sftp/<用户名>/upload),用于上传文件。sudo mkdir -p /data/sftp/<用户名>/upload
sudo chown <用户名>:<用户名> /data/sftp/<用户名>/upload
sudo chmod 755 /data/sftp/<用户名>/upload
SELinux可能限制SFTP访问,需调整相关策略。
操作命令:
sudo sestatus
Enforcing模式,临时设置为Permissive测试是否解决问题:sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
# 或允许SFTP访问用户主目录
sudo setsebool -P sftp_home_dir on
/etc/ssh/sshd_config中的MaxStartups(默认10:30:100,表示最多允许10个并发未认证连接,超过30%时开始拒绝)。若需增加,修改为:MaxStartups 10000
重启SSH服务生效。top命令查看CPU、内存使用率,若资源耗尽,需优化服务器性能或扩容。使用客户端(如FileZilla、WinSCP)或命令行测试连接:
sftp <用户名>@<服务器IP>
输入密码后,若能进入SFTP命令行(如sftp>),则表示连接成功。可尝试上传/下载文件验证功能。
通过以上步骤逐步排查,可定位并解决大部分CentOS SFTP故障。若问题仍未解决,建议根据日志中的具体错误信息进一步分析。