现象:
ssh: connect to host example.com port 22: Connection refused
排查步骤:
1. 检查SSH服务是否运行:
bash
sudo systemctl status sshd
2. 如果没有运行,启动服务:
bash
sudo systemctl start sshd
3. 检查防火墙设置:
bash
sudo iptables -L -n
sudo ufw status # 如果使用UFW
4. 检查SELinux状态(如果启用):
bash
sudo sestatus
现象:
Permission denied (publickey,password).
排查步骤:
1. 确认用户名和密码正确
2. 检查服务器是否允许密码认证:
bash
sudo grep -E '^PasswordAuthentication' /etc/ssh/sshd_config
3. 检查用户是否被允许登录:
bash
sudo grep -E '^AllowUsers|^DenyUsers' /etc/ssh/sshd_config
4. 检查用户家目录和.ssh目录权限:
bash
ls -ld ~
ls -ld ~/.ssh
现象:
Permission denied (publickey).
排查步骤:
1. 检查客户端公钥是否添加到服务器的~/.ssh/authorized_keys
2. 检查文件权限:
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
3. 检查sshd_config中的相关设置:
bash
sudo grep -E '^PubkeyAuthentication|^AuthorizedKeysFile' /etc/ssh/sshd_config
现象:
ssh: connect to host example.com port 22: Connection timed out
排查步骤:
1. 检查网络连通性:
bash
ping example.com
traceroute example.com
2. 检查目标端口是否开放:
bash
telnet example.com 22
# 或使用
nc -zv example.com 22
3. 检查服务器是否监听SSH端口:
bash
sudo netstat -tulnp | grep ssh
# 或使用
sudo ss -tulnp | grep ssh
现象:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
解决方法:
1. 删除客户端known_hosts文件中对应的条目:
bash
ssh-keygen -R example.com
2. 或者手动编辑~/.ssh/known_hosts
文件删除相关行
使用详细模式查看连接过程:
ssh -vvv user@example.com
检查SSH服务日志:
sudo journalctl -u sshd --no-pager -n 50
# 或
sudo tail -f /var/log/auth.log
检查TCP连接:
sudo tcpdump -i any port 22 -n
修改SSH端口:
sudo sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
sudo systemctl restart sshd
禁用root登录:
sudo sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
启用/禁用密码认证:
# 禁用密码认证
sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
定期更新SSH软件包:
sudo apt update && sudo apt upgrade openssh-server # Debian/Ubuntu
sudo yum update openssh-server # RHEL/CentOS
使用fail2ban防止暴力破解:
sudo apt install fail2ban # Debian/Ubuntu
sudo yum install fail2ban # RHEL/CentOS
配置SSH密钥对认证而非密码认证
限制可登录的用户和IP范围
通过系统性地排查这些问题,可以解决大多数SSH登录问题并提高系统安全性。