目的
SSH(Secure Shell或Secure Socket Shell)是一种服务,它为用户和系统管理员在不安全的网络上访问服务器提供一种安全的方式。在某些情况下,服务器无法通过SSH访问或SSH服务被拒绝连接,这需要进一步分析。
SSH连接问题处理
1.远程主机名识别错误
当你尝试通过SSH访问时,若得到如下提示:
Remote Host Identification Has Changed
OR
ssh: Could not resolve hostname: Name or service not known
OR
Unable to open a connection to Host does not exist
当主机无法通过特定的网络地址连接到SSH时,可能会出现主机名错误。若要解决该问题,您可以按照以下步骤操作:
1.检查主机名是否正确。
2.检查主机名是否有ping。
3.如果主机名解析不正确,可以如下所示使用SSH的公网IP地址,其中user是您使用的SSH用户名,123.123.123.123是服务器IP。
# ssh user@123.123.123.123
2. 连接超时
当用户尝试连接到服务器,但服务器在指定的超时时间内拒绝建立连接时,就会出现此错误。在这种情况下,常见的错误消息:
Error output
ssh: connect to host 123.123.123.123 port 22: connection timed out
OR
PuTTY error output
Network error: Connection time out
要纠正此错误,请执行以下步骤。
1.确保正确输入服务器IP地址。
2.确认您的网络允许SSH端口连接。
3.验证云服务器实例VPS上的防火墙规则没有问题。
3. 连接失败
连接失败或超时都是不同的。当您的SSH请求到达SSH端口但服务器拒绝接受它时,连接失败发生。在这种情况下,你可能会看到以下错误:
Error output
ssh: connect to host 123.123.123.123 port 22: connection refused
OR
PuTTY error output
Network error: Connection refused
连接失败的解决步骤与连接超时的解决步骤类似。要纠正此错误,请使用以下步骤。
1.请确保服务器的IP地址配置正确。
2.确认您的网络允许SSH连接。
3.验证服务器防火墙规则允许SSH访问。
SSH连接故障的基本解决方案
1. 防火墙配置检查
SSH连接的一个常见原因是防火墙阻塞,服务器中使用的各种操作系统之间的防火墙应用程序是不同的。对于CentOS7,它是firewalld,而对于Ubuntu,它是ufw。如果服务器中没有这些,那么可能它正在使用iptables。服务器中的防火墙规则可以使用sudo或作为根用户使用下面的命令列出。
# iptables -nL
如果有任何REJECT或DROP规则,您应该确保INPUT链允许默认的SSH端口22。下面的命令将显示防火墙支持的服务列表。
# firewall-cmd --list-services
如果对SSH使用自定义端口,可以使用——list-ports选项进行检查。在安装ufw的Ubuntu服务器中,可以使用下面的命令检查防火墙规则:
# ufw status
2. 检查SSH状态
如果在使用SSH连接到服务器时遇到任何问题,首先要确保SSH服务器启动并运行。可以使用以下命令检查服务器的SSH服务状态。
对于较旧的操作系统,如Ubuntu 14.04、Debian 8或CentOS 6,使用service命令。
# service ssh status
对于新版本,则使用systemctl命令。
# systemctl status sshd
如果SSH服务没有在执行或处于活动状态,可以使用以下命令启动服务,这取决于操作系统。
# systemctl start sshd
OR
# service ssh start
3. 检查SSH端口
所有操作系统的SSH端口默认为22。您也可以使用自定义的SSH端口,该端口可以在位于 /etc/ssh/sshd_config 路径的SSH服务配置文件中设置。
使用以下命令检查服务器使用的SSH端口:
# grep -i port /etc/ssh/sshd_config
您还可以使用netstat命令检查SSH服务正在使用的端口。执行下面的命令,SSH端口中应该会显示输出。
# netstat -ntlp | grep sshd
排除SSH登录失败的基本解决方案
为了检查与SSH拒绝登录尝试相关的问题,可以遵循以下指导方针。
1. 检查是否允许“Root登录”
SSH服务可以配置为禁止root用户登录。检查是否允许root登录,执行以下命令:
# grep PermitRootLogin /etc/ssh/sshd_config
如果不允许,设置 /etc/ssh/sshd_config 中的PermitRootLogin的值为yes,如上图所示,重启SSH,并尝试以root用户登录。
执行如下命令重新启动SSH服务。
# systemctl restart sshd
OR
# service ssh restart
2. 检查是否接受“密码认证”
SSH可以配置为接受/不接受密码,而是使用公钥身份验证。使用如下命令查看是否启用了密码验证:
# grep PasswordAuthentication /etc/ssh/sshd_config
设置/etc/ssh/sshd_config中的PasswordAuthentication的值为yes,如上图所示,重启SSH,并尝试再次使用密码登录。
执行如下命令重新启动SSH服务。
# systemctl restart sshd
OR
# service ssh restart
3. 检查服务器上保存的SSH公钥
如果使用公钥身份验证登录服务器的尝试不起作用,则需要确保在服务器内部设置了公钥。要查看存储在服务器中的公钥,请使用下面的命令。
# cat ~/.ssh/authorized_keys
如果此文件中没有列出您的公钥,请将其添加到文件的新行中。在某些服务器上,授权密钥的位置可能不同。运行以下命令查看文件的位置:
# grep AuthorizedKeysFile /etc/ssh/sshd_config
改SSH端口,提高服务器安全性
服务器的默认SSH端口为22,修改服务器的默认SSH端口意味着为服务器增加了一层额外的安全层,降低自动攻击的风险。 请注意,0 ~ 1023的端口号是为各种系统服务预留的端口号。
因此,建议使用1024 ~ 65535之间的端口号。
1. 编辑sshd配置文件并添加一个新的Port
# vi /etc/ssh/sshd_config
locate the line
Port 22
OR
#Port 22
And
Change to the new port number that you want to use and save the file.
2. 使用以下依赖于操作系统的命令重新启动服务器中的SSH服务。
# systemctl restart sshd
OR
# service ssh restart
3. 使用新的SSH端口更新服务器防火墙规则。对于Ubuntu,默认防火墙是UFW,请使用以下命令添加新规则。
# sudo ufw allow 4444/tcp
对于CentOS,默认防火墙为FirewallD,请使用以下命令添加新规则。
# firewall-cmd --permanent --zone=public --add-port=4444/tcp
# firewall-cmd --reload
4. 使用新的SSH端口连接服务器
当从SSH客户端连接服务器时,请使用“-p”选项()指定端口。
# ssh username@server_ipaddress -p 4444
注意:用您原来的自定义端口号更改端口号4444