SSH故障排查
>本文適用於廣大Linux發行版
我们使用systemctl status sshd命令,可以看到ssh服务是处于正常运行状态的。
事实上我们可以通过ssh命令查找到主机,并要求输入密码时,就侧面证明了ssh服务在正常运行了。
但是为什么无法登陆,是因为ssh服务的配置文件,有两条默认的配置(被注释的)阻止了我们密码登陆root(我的ssh服务是Debian安装时预装的)
文件来自Linux下面的/etc/ssh/sshd_config
(不要搞錯成 ssh_config !!)
我们可以使用vim打开文件后,在随意位置追加下面内容。也可以选择取消注释,但是PermitRootLogin后面的prohibit-password需要更改为yes
我选择了追加内容在随意位置。配置如下:
PermitRootLogin yes
PasswordAuthentication yes
配置解释
其中PermitRootLogin yes是允许以 root 用户身份登录 SSH。PasswordAuthentication yes是启用基于密码的身份验证。
这个时候,保存并退出。之后重启ssh服务就可以正常ssh密码登录root了。
重启ssh服务:systemctl restart sshd
查看ssh服务:systemctl status sshd
下面命令帶 --now 意味著,開機自動啟動,現在也啟動ssh service。
關閉時也同理,如果帶 --now ,將馬上停止ssh service,並取消開機啟動。
開機自啟動ssh服務:systemctl enable --now sshd
關閉開機自啟動ssh服務:systemctl disable sshd
依舊無法連接(無響應到超時)
考慮可能是防火牆的問題,檢查一下PC是不是啟動了防火牆/IP不屬於一個網段。
我們先來看看如何解決前者,防火牆的問題。一般來說,Ubuntu / Arch的一些發行版,是自帶與啟動防火牆的。
UFW:
# 2選1
## 按照「端口」放行
sudo ufw allow 22/tcp
## 按照「服務名」放行
sudo ufw allow ssh
# 查看防火牆狀態
sudo ufw status
firewalld:
# 2選1
## 按照「端口」放行
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --reload
## 按照「服務名」放行
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
# 查看防火牆狀態
sudo firewall-cmd --list-services
iptables:
請注意,iptables 的規則有時只保存在當前PC狀態中,也就是說,會隨著你的關機再起動而導致放行規則失效,不同發行版持久化規則的方法都有所不同。
# 按照「端口」放行
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 查看防火牆狀態
sudo iptables -L INPUT -n -v
nftables:
# 按照「端口」放行
sudo nft add rule inet filter input tcp dport 22 accept
# 查看防火牆狀態
sudo nft list ruleset
請注意,nft add rule 方式加入的規則也需要另外保存,否則重啟依舊可能導致規則失效。
最後
一切完成後!我們此時只需要重啟 ssh 服務就好了!
sudo systemctl restart sshd
# 查看 ssh service 狀態
# sudo systemctl status sshd
確保IP在同一個網段中,確保在同一個Wi-Fi下。這回,再試試ssh上去
Done.
