SFTP依赖SSH服务运行,若SSH未启动,SFTP无法连接。执行以下命令确认SSH服务状态:
sudo systemctl status sshd
若未运行,启动服务并设置开机自启:
sudo systemctl start sshd
sudo systemctl enable sshd
SFTP配置错误是常见原因,需检查以下关键项:
Subsystem sftp internal-sftp
Subsystem sftp /usr/libexec/openssh/sftp-server
sftpuser)只能访问其家目录,添加以下配置:Match User sftpuser
ChrootDirectory /data/sftp/%u # 将用户限制在其家目录(需提前创建)
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
修改后必须重启SSH服务使配置生效:
sudo systemctl restart sshd
CentOS默认使用firewalld,需允许SSH(默认端口22)流量:
sudo firewall-cmd --permanent --add-service=ssh # 永久允许SSH
sudo firewall-cmd --reload # 重新加载防火墙规则
若使用iptables,添加以下规则:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo service iptables save
若SELinux处于Enforcing模式(默认),可能阻止SFTP访问。可通过以下命令临时设置为Permissive模式测试:
sudo setenforce 0
若问题解决,需永久调整SELinux策略:
sudo setsebool -P sftp_home_dir on
ChrootDirectory(如/data/sftp/%u),需设置正确的安全上下文:sudo semanage fcontext -a -t ssh_chroot_t "/data/sftp(/.*)?" # 添加上下文规则
sudo restorecon -Rv /data/sftp # 恢复目录上下文
/home/username或/data/sftp/username)必须归root所有,权限设为755(否则无法登录):sudo chown root:root /home/username
sudo chmod 755 /home/username
/home/username/uploads),并设置用户为所有者,权限为775:sudo mkdir /home/username/uploads
sudo chown username:username /home/username/uploads
sudo chmod 775 /home/username/uploads
ChrootDirectory,目录必须归root所有且不可写(防止用户逃逸chroot环境):sudo chown root:root /data/sftp/username
sudo chmod 755 /data/sftp/username
日志是排查问题的关键,通过以下命令查看SSH/SFTP日志:
sudo tail -f /var/log/secure # CentOS 7及以下
sudo tail -f /var/log/auth.log # CentOS 8及以上
日志中会显示具体错误信息(如“Permission denied”“Connection refused”),根据提示进一步排查。
ssh localhost,确认SSH服务本身是否正常。ping命令测试网络连通性,使用telnet测试端口是否开放:ping your_server_ip
telnet your_server_ip 22
若telnet失败,可能是网络防火墙或服务器防火墙拦截。若/etc/ssh/sshd_config中设置了MaxStartups(最大并发连接数),且达到限制,新连接会被拒绝。可通过以下命令查看并修改:
sudo cat /etc/ssh/sshd_config | grep MaxStartups
若值为10:30:100(表示前10个连接立即响应,30%的连接延迟响应,超过100的拒绝),可修改为更大值(如10000):
sudo sed -i '/#MaxStartups 10:30:100/MaxStartups 10000/g' /etc/ssh/sshd_config
sudo systemctl restart sshd