SFTP(SSH File Transfer Protocol)基于SSH协议运行,故障排查需围绕网络连通性、服务状态、配置正确性、权限设置、日志分析五大核心方向展开。以下是具体步骤:
首先确认客户端与服务器之间的网络可达性及端口连通性:
ping <服务器IP>命令,若无法ping通,需检查网络线路、路由器配置或服务器IP是否正确。telnet <服务器IP> 22或nc -zv <服务器IP> 22命令,若端口不通,可能是防火墙拦截或SSH服务未监听该端口。SFTP依赖SSH服务运行,需确保SSH服务已启动并正常运行:
sudo systemctl status sshd(部分系统为ssh),若服务未运行,使用sudo systemctl start sshd启动。sudo systemctl enable sshd确保服务重启后自动启动。SFTP的配置主要在/etc/ssh/sshd_config文件中,需确认以下关键设置:
Subsystem sftp /usr/lib/openssh/sftp-server(或/usr/libexec/openssh/sftp-server,取决于系统版本)未被注释(无#前缀),该配置定义了SFTP的服务路径。ChrootDirectory(限制用户根目录),需确保路径存在且权限正确(如/var/sftp/username的owner为root,权限为755)。sudo systemctl restart sshd使更改生效。防火墙或SELinux可能拦截SFTP流量(默认端口22):
firewalld,执行sudo firewall-cmd --permanent --add-service=ssh(或--add-port=22/tcp),然后sudo firewall-cmd --reload。iptables,执行sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT并保存规则(如sudo service iptables save)。sestatus(若为Enforcing,需调整策略)。Permissive模式测试:sudo setenforce 0(重启后恢复Enforcing)。/etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive。chroot,需执行sudo restorecon -Rv /var/sftp/username恢复SELinux上下文。SFTP用户的权限设置直接影响访问:
id <用户名>确认用户是否存在,若不存在需创建(sudo useradd -m <用户名>)。/home/username)的权限需为755(drwxr-xr-x),owner为该用户(chown username:groupname /home/username)。若使用chroot,目录owner必须为root。user_home_dir_t(ls -Z /home/username),若不符,执行sudo chcon -t user_home_dir_t /home/username。日志是排查故障的关键,SFTP相关日志通常位于:
/var/log/secure(CentOS/RHEL)或/var/log/auth.log(Ubuntu/Debian)。sudo tail -f /var/log/secure(或对应日志文件),过滤sftp关键字(grep "sftp" /var/log/secure),可获取连接失败的具体原因(如“Permission denied”“Invalid user”)。若上述步骤无法定位问题,可使用SSH调试模式获取详细连接信息:
ssh -vvv <用户名>@<服务器IP>,终端会输出详细的连接过程(如密钥交换、认证步骤、配置加载),根据提示可快速定位问题(如“no matching key exchange method found”需调整加密算法)。top命令)或防火墙规则(是否拦截ICMP或SSH端口)。chmod 755或chmod 775),且SELinux未阻止访问。sudo netstat -tulnp | grep 22或sudo ss -tulnp | grep 22检查端口占用进程,修改/etc/ssh/sshd_config中的Port为其他端口(如2222)并重启服务。通过以上步骤,可系统性排查Linux环境下SFTP的常见故障。若问题仍未解决,建议结合日志信息或寻求专业技术支持。